一、SHA-1
SHA-1(Secure Hash Algorithm 1)是一种哈希函数,用于将任意大小的数据转换成160位(20字节)的哈希值。它是美国国家安全局(NSA)设计的一种密码散列函数,于1993年发布,成为了美国联邦信息处理标准(FIPS PUB 180)的一部分。SHA-1是MD5(Message Digest Algorithm 5)的继任者,旨在提供更强大的安全性。
SHA-1的特点:
固定输出长度: SHA-1生成的哈希值长度是160位,无论输入数据的大小是多少。
不可逆性: 由于SHA-1是一种哈希函数而不是加密算法,它是不可逆的。即使知道哈希值,也不能反向推导出原始输入数据。
唯一性: 不同的输入数据应该生成不同的哈希值,确保唯一性。
抗碰撞性: 对于不同的输入数据,SHA-1应该生成不同的哈希值,以防止碰撞(collision)的发生,即两个不同的输入数据产生相同的哈希值。
固定的计算时间: 对于任何大小的输入数据,SHA-1的计算时间是固定的,不受输入数据的大小影响。
SHA-1算法步骤:
SHA-1算法包括以下步骤:
填充数据: 将输入数据进行填充,使其长度满足512比特块的整数倍。
分块: 将填充后的数据分割成512比特块。
初始化变量: 初始化5个32位的变量,作为SHA-1算法中间状态的一部分。
处理块: 对每个512比特块进行一系列的操作,包括位运算、逻辑运算和函数运算。
输出: 将处理完的结果连接在一起,形成160位的哈希值。
安全性问题:
由于对SHA-1的理论攻击和实际碰撞攻击的发展,SHA-1已经被认为不再足够安全。在2005年,有关SHA-1的一些理论攻击开始浮出水面,而在2017年,Google宣布了对SHA-1的第一次实际碰撞攻击。
因此,在现代应用中,不再建议使用SHA-1进行安全性要求较高的任务。替代算法,如SHA-256、SHA-3等,提供更强大的安全性,对抗更先进的攻击技术。在选择哈希算法时,应该考虑使用更安全的替代方案,特别是在密码存储和数字签名等敏感领域。
python编写加密程序
# 导入 hashlib 模块,用于提供 SHA-1 哈希函数
import hashlib
# 导入 re 模块,用于正则表达式匹配
import re
# 定义一个函数,用于加密密码并返回 SHA-1 哈希值
def encrypt_password(password):
# 检查密码是否符合要求:长度大于等于8位,包含小写字母、大写字母、数字和特殊字符
if not (len(password) >= 8 and re.search("[a-z]", password) and re.search("[A-Z]", password) and re.search("[0-9]", password) and re.search("[!@#$%^&*(),.?\":{}|<>]", password)):
print("密码不符合要求")
return None
# 创建 SHA-1 哈希对象
sha1 = hashlib.sha1()
# 使用 UTF-8 编码将密码更新到 SHA-1 哈希对象中
sha1.update(password.encode('utf-8'))
# 获取加密后的密码,以十六进制表示
encrypted_password = sha1.hexdigest()
# 返回加密后的密码
return encrypted_password
# 接收用户输入的密码
user_input = input("请输入密码:")
# 调用加密函数,获取加密后的密码
encrypted_password = encrypt_password(user_input)
# 检查是否成功加密密码
if encrypted_password:
# 输出加密后的密码
print("加密后的密码:", encrypted_password)
else:
# 提示密码不符合要求,需要重新输入
print("密码不符合要求,请重新输入。")
运行结果
二、DES
Data Encryption Standard (DES) - 数据加密标准
简介:
DES(Data Encryption Standard)是一种对称密钥加密算法,最早由IBM在1975年设计,于1977年被美国国家标准局(NIST)采纳为联邦信息处理标准(FIPS PUB 46)。DES的目标是提供高度安全的数据加密,其应用范围包括金融、通信和其他敏感领域。
基本原理:
对称密钥加密: DES是一种对称密钥算法,意味着相同的密钥用于加密和解密数据。发送方和接收方必须共享相同的密钥。
分组密码: DES对输入数据按64位块进行分组处理。每个64位块通过一系列的置换和替代运算生成加密文本。
密钥长度: DES使用56位的密钥,但由于每隔8位被用于奇偶校验,实际上只有48位被用于加密操作。这导致了DES的密钥空间相对较小,容易受到穷举攻击。
算法步骤:
初始置换: 将64位的输入数据按照预定的顺序进行置换,得到初始数据。
密钥生成: 从56位的密钥中生成16个48位的子密钥,每轮使用一个子密钥。
轮函数: DES算法使用16轮迭代,每轮中包括将数据分为左右两半、通过一个复杂的轮函数进行处理、然后交换左右两半。
最终置换: 最后一轮迭代后,将左右两半数据交换,并进行最终的置换操作,得到最终的加密文本。
安全性问题:
密钥长度: 由于DES的56位密钥相对较短,容易受到穷举攻击。在当今的计算环境下,穷举攻击已经变得可行,因此DES不再被视为安全。
现代密码学: DES使用的数据块大小和密钥长度已经无法满足当今对安全性的要求。因此,现代应用通常使用更强大的对称密钥加密算法,如AES(Advanced Encryption Standard)。
python编写加密程序
#安装cryptography库:
pip install cryptography
# 导入Fernet类,它是cryptography库中用于对称密钥加密的工具
from cryptography.fernet import Fernet
# 导入getpass模块,用于输入密码时隐藏输入内容
import getpass
# 生成密钥的函数
def generate_key():
# 使用Fernet类的generate_key方法生成一个新的密钥
return Fernet.generate_key()
# 加密密码的函数
def encrypt_password(password, key):
# 创建Fernet对象,使用给定的密钥
cipher_suite = Fernet(key)
# 使用encode方法将密码转换为字节形式,并调用encrypt方法进行加密
encrypted_password = cipher_suite.encrypt(password.encode())
# 返回加密后的密码
return encrypted_password
# 解密密码的函数
def decrypt_password(encrypted_password, key):
# 创建Fernet对象,使用给定的密钥
cipher_suite = Fernet(key)
# 调用decrypt方法对加密后的密码进行解密,再使用decode方法将字节转换为字符串
decrypted_password = cipher_suite.decrypt(encrypted_password).decode()
# 返回解密后的密码
return decrypted_password
# 生成密钥
key = generate_key()
# 循环获取用户输入的密码,确保符合一定的要求
while True:
# 使用getpass.getpass方法获取用户输入的密码,且输入内容不会显示在屏幕上
user_input = getpass.getpass("请输入密码:")
# 检查密码是否符合要求(大写、小写、数字、特殊字符、长度大于等于8)
if (len(user_input) >= 8 and any(c.islower() for c in user_input)
and any(c.isupper() for c in user_input) and any(c.isdigit() for c in user_input)
and any(c in '!@#$%^&*(),.?":{}|<>' for c in user_input)):
# 符合要求则跳出循环
break
else:
# 提示密码不符合要求,需要重新输入
print("密码不符合要求,请重新输入。")
# 使用加密函数加密用户输入的密码
encrypted_password = encrypt_password(user_input, key)
# 输出加密后的密码和密钥
print("加密后的密码:", encrypted_password)
print("密钥:", key)
# 使用解密函数演示解密操作
decrypted_password = decrypt_password(encrypted_password, key)
print("解密后的密码:", decrypted_password)