网络安全&密码学—python中的各种加密算法
字数 953 2025-08-19 12:40:36

Python中的加密算法详解

一、加密基础概念

1. 数据加密定义

数据加密是一种保护数据安全的技术,通过将明文转换为不易被理解的密文,以防止数据泄露、篡改或滥用。加密后的密文可以通过解密过程恢复成原始明文。

2. 密码学分类

密码学主要分为:

  • 密码编码学:研究如何设计安全的密码系统
  • 密码分析学:研究如何破解密码系统

二、加密方式分类

1. 对称加密

定义:加密和解密使用同一个密钥
特点

  • 加密解密速度快
  • 适合加密大量数据
  • 密钥需要安全传输和存储

常见算法

  • DES(已不安全)
  • 3DES
  • AES(目前最广泛使用的对称加密算法)

2. 非对称加密

定义:使用一对密钥(公钥和私钥)
特点

  • 公钥可公开,私钥保密
  • 加密解密速度较慢
  • 适合加密少量数据和数字签名

常见算法

  • RSA(应用最广泛)
  • ECC(椭圆曲线加密,适合移动设备)
  • DSA(适用于数字签名)

3. 单向加密(不可逆加密)

定义:通过散列算法生成固定长度的散列值
特点

  • 无法从散列值还原原文
  • 常用于数字签名、密码存储等

常见算法

  • MD5(已被破解)
  • SHA-1(比MD5安全但速度慢)
  • SHA-2(包括SHA-224、SHA-256等)
  • HMAC(带密钥的散列消息认证码)

三、Python中的加密实现

1. 编码与解码

# 编码
str_ = "xiaoyu安全"
byte = str_.encode('utf-8')  # 转为二进制

# 解码
original = byte.decode('utf-8')  # 转回字符串

2. Base64编码

import base64

def enbase64(str_):
    return base64.b64encode(str_.encode('utf-8')).decode("utf-8")

def debase64(str_):
    return base64.b64decode(str_).decode('utf-8')

# 使用
encoded = enbase64("xiaoyu安全")  # 输出: eGlhb3l15a6J5YWo
decoded = debase64(encoded)      # 输出: xiaoyu安全

3. MD5加密

import hashlib

def md5(str_):
    str_ = str_.encode('utf-8')
    result = hashlib.md5(str_)
    return result.hexdigest().upper()  # 返回大写结果

# 使用
print(md5("hellow_world"))  # 输出: 0D0A96FA021CCD3FAC05DF1A584E3185

4. SHA1加密

import hashlib

def sha1(str_):
    return hashlib.sha1(str_.encode()).hexdigest()

5. Secrets模块(安全随机数)

import secrets
import string

# 生成安全随机密码
parm = string.ascii_letters + string.digits
password = ''.join(secrets.choice(parm) for i in range(10))

# 生成安全URL
url = 'https://example.com/update=' + secrets.token_urlsafe()

6. DES加密

from pyDes import des, CBC, PAD_PKCS5
import binascii

key = 'xiaoyu13'  # 必须8字节

def des_encrypt(s):
    secret_key = key
    iv = secret_key
    des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    return binascii.b2a_hex(des_obj.encrypt(s, padmode=PAD_PKCS5))

def des_decrypt(s):
    secret_key = key
    iv = secret_key
    des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    return des_obj.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)

# 使用
encrypted = des_encrypt('XIAOYU')  # 输出: b'ab498fe821d50739'
decrypted = des_decrypt(encrypted)  # 输出: b'XIAOYU'

7. AES加密

from Cryptodome.Cipher import AES
from Cryptodome import Random

data = 'XiaoYu安全'
key = b'this is a 16 key'  # 必须16/24/32字节
iv = Random.new().read(AES.block_size)

# 加密
mycipher = AES.new(key, AES.MODE_CFB, iv)
cip = mycipher.encrypt(data.encode())
cip_text = iv + cip

# 解密
mydecrypt = AES.new(key, AES.MODE_CFB, cip_text[:16])
decrypted = mydecrypt.decrypt(cip_text[16:]).decode()

8. RSA加密

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

# 加密
message = '你好, RSA!'.encode()
encryptor = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted = encryptor.encrypt(message)

# 解密
decryptor = PKCS1_OAEP.new(RSA.import_key(private_key))
decrypted = decryptor.decrypt(encrypted).decode()

四、实际应用案例

1. 用户登录系统(Flask + MD5)

from flask import Flask
import hashlib
import pymysql

app = Flask(__name__)

@app.route('/login/<username>/<password>/')
def user_login(username, password):
    try:
        password = hashlib.md5(password.encode()).hexdigest()
        sql = 'select * from t_user where username=%s and password=%s'
        # 执行SQL验证...
        return '登录成功' if valid else '登录失败'
    except Exception as e:
        return f'登录失败:{str(e)}'

2. 文件完整性验证

import hashlib

def get_file_md5(file_path):
    with open(file_path, 'rb') as f:
        return hashlib.md5(f.read()).hexdigest()

# 比较文件MD5与预期值
if get_file_md5('file.txt') == 'expected_md5_value':
    print("文件完整")

五、安全建议

  1. 密码存储

    • 使用单向加密(如SHA-256)存储密码
    • 加盐(salt)增加安全性
    • 密码长度建议10位以上
  2. 密钥管理

    • 对称加密密钥必须保密
    • 非对称加密私钥必须严格保护
    • 避免硬编码密钥
  3. 算法选择

    • 避免使用已被破解的算法(如MD5)
    • 根据场景选择合适算法:
      • 大量数据:AES
      • 密钥交换:RSA
      • 数字签名:DSA/ECDSA
  4. 随机数生成

    • 使用secrets模块而非random模块生成安全随机数
    • 用于密码、令牌等敏感信息生成

通过合理选择和组合这些加密技术,可以有效保护数据的机密性、完整性和可用性,防止数据泄露和篡改。

Python中的加密算法详解 一、加密基础概念 1. 数据加密定义 数据加密是一种保护数据安全的技术,通过将明文转换为不易被理解的密文,以防止数据泄露、篡改或滥用。加密后的密文可以通过解密过程恢复成原始明文。 2. 密码学分类 密码学主要分为: 密码编码学 :研究如何设计安全的密码系统 密码分析学 :研究如何破解密码系统 二、加密方式分类 1. 对称加密 定义 :加密和解密使用同一个密钥 特点 : 加密解密速度快 适合加密大量数据 密钥需要安全传输和存储 常见算法 : DES(已不安全) 3DES AES(目前最广泛使用的对称加密算法) 2. 非对称加密 定义 :使用一对密钥(公钥和私钥) 特点 : 公钥可公开,私钥保密 加密解密速度较慢 适合加密少量数据和数字签名 常见算法 : RSA(应用最广泛) ECC(椭圆曲线加密,适合移动设备) DSA(适用于数字签名) 3. 单向加密(不可逆加密) 定义 :通过散列算法生成固定长度的散列值 特点 : 无法从散列值还原原文 常用于数字签名、密码存储等 常见算法 : MD5(已被破解) SHA-1(比MD5安全但速度慢) SHA-2(包括SHA-224、SHA-256等) HMAC(带密钥的散列消息认证码) 三、Python中的加密实现 1. 编码与解码 2. Base64编码 3. MD5加密 4. SHA1加密 5. Secrets模块(安全随机数) 6. DES加密 7. AES加密 8. RSA加密 四、实际应用案例 1. 用户登录系统(Flask + MD5) 2. 文件完整性验证 五、安全建议 密码存储 : 使用单向加密(如SHA-256)存储密码 加盐(salt)增加安全性 密码长度建议10位以上 密钥管理 : 对称加密密钥必须保密 非对称加密私钥必须严格保护 避免硬编码密钥 算法选择 : 避免使用已被破解的算法(如MD5) 根据场景选择合适算法: 大量数据:AES 密钥交换:RSA 数字签名:DSA/ECDSA 随机数生成 : 使用 secrets 模块而非 random 模块生成安全随机数 用于密码、令牌等敏感信息生成 通过合理选择和组合这些加密技术,可以有效保护数据的机密性、完整性和可用性,防止数据泄露和篡改。