python编写SHA-1、DES密码加密程序

本文详细介绍了SHA-1和DES两种加密算法在Python中的实现,探讨了SHA-1的安全性问题以及DES的历史、原理和安全性挑战,提倡使用更安全的算法如AES替换过时的DES。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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)

运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值