泊头市建设局官方网站,南充 网站开发,湖南网站建设价格费用,济南城市建设集团有限公司网站#x1f4da; 对称加密算法解析#xff1a;DES、AES及其在pycryptodome 和 crypto-js 模块中的应用
#x1f5dd;️ DES 算法
算法原理
数据加密标准#xff08;DES#xff09;是一种对称密钥加密算法#xff0c;用于保护数据的安全。DES 使用一个 56 位的密钥进行加密… 对称加密算法解析DES、AES及其在pycryptodome 和 crypto-js 模块中的应用
️ DES 算法
算法原理
数据加密标准DES是一种对称密钥加密算法用于保护数据的安全。DES 使用一个 56 位的密钥进行加密和解密将数据块分为 64 位的块进行处理。DES 是一种 Feistel 网络每个数据块经过 16 轮的处理其中包括置换和替换操作以实现加密。
主要原理
密钥调度将 64 位的密钥压缩成 56 位并通过循环左移生成 16 个子密钥。初始置换IP对输入数据块进行初始置换。轮函数每一轮包含扩展置换、S-盒替换、P-盒置换和异或操作。逆初始置换IP-1在所有轮处理完后对数据进行逆初始置换得到最终的密文。
Python 实现
使用 pycryptodome 库来实现 DES 加密和解密
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpaddef des_encrypt_decrypt(data, key, mode):cipher DES.new(key, DES.MODE_ECB)if mode encrypt:# 填充数据至 DES 块大小padded_data pad(data.encode(utf-8), DES.block_size)encrypted_data cipher.encrypt(padded_data)return encrypted_dataelif mode decrypt:decrypted_data cipher.decrypt(data)unpadded_data unpad(decrypted_data, DES.block_size)return unpadded_data.decode(utf-8)else:raise ValueError(Invalid mode. Choose encrypt or decrypt.)# 示例
key b8bytekey # 8 字节的密钥
data Hello, DES!
encrypted des_encrypt_decrypt(data, key, encrypt)
decrypted des_encrypt_decrypt(encrypted, key, decrypt)print(Encrypted:, encrypted)
print(Decrypted:, decrypted)输入输出示例:
输入: Hello, DES!, 密钥: b8bytekey输出: 加密结果: b\x9d\xc2\xa5\x16\x19\x1c\xf3\x8f解密结果: Hello, DES!
JavaScript 实现使用 crypto-js 模块
const CryptoJS require(crypto-js);function desEncryptDecrypt(data, key, mode) {const keyHex CryptoJS.enc.Utf8.parse(key);if (mode encrypt) {const encrypted CryptoJS.DES.encrypt(data, keyHex, { mode: CryptoJS.mode.ECB });return encrypted.toString();} else if (mode decrypt) {const decrypted CryptoJS.DES.decrypt(data, keyHex, { mode: CryptoJS.mode.ECB });return decrypted.toString(CryptoJS.enc.Utf8);} else {throw new Error(Invalid mode. Choose encrypt or decrypt.);}
}// 示例
const key 8bytekey; // 8 字节的密钥
const data Hello, DES!;
const encrypted desEncryptDecrypt(data, key, encrypt);
const decrypted desEncryptDecrypt(encrypted, key, decrypt);console.log(Encrypted:, encrypted);
console.log(Decrypted:, decrypted);输入输出示例:
输入: Hello, DES!, 密钥: 8bytekey输出: 加密结果: 3B3d4a...bcd5 (加密的密文)解密结果: Hello, DES! AES 算法
算法原理
高级加密标准AES是对称密钥加密标准用于替代 DES。AES 支持 128 位、192 位和 256 位密钥长度并处理 128 位的块。AES 采用 10、12 或 14 轮的处理取决于密钥的长度。
主要原理
密钥扩展从原始密钥生成多个轮密钥。轮函数每轮包含字节替换SubBytes、行移位ShiftRows、列混淆MixColumns和轮密钥加AddRoundKey操作。最终轮不包括列混淆操作。
Python 实现
使用 pycryptodome 库来实现 AES 加密和解密
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import osdef aes_encrypt_decrypt(data, key, mode):cipher AES.new(key, AES.MODE_ECB)if mode encrypt:# 填充数据至 AES 块大小padded_data pad(data.encode(utf-8), AES.block_size)encrypted_data cipher.encrypt(padded_data)return encrypted_dataelif mode decrypt:decrypted_data cipher.decrypt(data)unpadded_data unpad(decrypted_data, AES.block_size)return unpadded_data.decode(utf-8)else:raise ValueError(Invalid mode. Choose encrypt or decrypt.)# 示例
key os.urandom(16) # 16 字节的密钥
data Hello, AES!
encrypted aes_encrypt_decrypt(data, key, encrypt)
decrypted aes_encrypt_decrypt(encrypted, key, decrypt)print(Encrypted:, encrypted)
print(Decrypted:, decrypted)输入输出示例:
输入: Hello, AES!, 密钥: b...key... (随机生成)输出: 加密结果: b\x1f\x23\xfe...78解密结果: Hello, AES!
JavaScript 实现使用 crypto-js 模块
const CryptoJS require(crypto-js);function aesEncryptDecrypt(data, key, mode) {const keyHex CryptoJS.enc.Hex.parse(key);if (mode encrypt) {const encrypted CryptoJS.AES.encrypt(data, keyHex, { mode: CryptoJS.mode.ECB });return encrypted.toString();} else if (mode decrypt) {const decrypted CryptoJS.AES.decrypt(data, keyHex, { mode: CryptoJS.mode.ECB });return decrypted.toString(CryptoJS.enc.Utf8);} else {throw new Error(Invalid mode. Choose encrypt or decrypt.);}
}// 示例
const key CryptoJS.enc.Hex.parse(00112233445566778899aabbccddeeff); // 16 字节密钥
const data Hello, AES!;
const encrypted aesEncryptDecrypt(data, key, encrypt);
const decrypted aesEncryptDecrypt(encrypted, key, decrypt);console.log(Encrypted:, encrypted);
console.log(Decrypted:, decrypted);输入输出示例:
输入: Hello, AES!, 密钥: 00112233445566778899aabbccddeeff输出: 加密结果: U2FsdGVkX1...7w (加密的密文)解密结果: Hello, AES!
️ 拓展用法
1. 加盐仅适用于 DES 和 AES
Python 实现:
from Crypto.Random import get_random_bytesdef aes_encrypt_with_salt(data, key, salt):key_with_salt key saltcipher AES.new(key_with_salt[:16], AES.MODE_ECB)padded_data pad(data.encode(utf-8), AES.block_size)encrypted_data cipher.encrypt(padded_data)return encrypted_data# 示例
key get_random_bytes(16)
salt get_random_bytes(8)
data Hello, AES with Salt!
encrypted aes_encrypt_with_salt(data, key, salt)print(Encrypted with Salt:, encrypted)输入输出示例:
输入: Hello, AES with Salt!, 密钥: b... (随机生成), 盐值: b... (随机生成)输出: 加密结果: b\x12\x34\x56\x78...ef (加密的密文)
2. 哈希化密钥密钥衍生
Python 实现:
from Crypto.Protocol.KDF import scryptdef derive_key(password, salt):return scrypt(password.encode(utf-8), salt, 16, N2**14, r8, p1)# 示例
password mysecretpassword
salt get_random_bytes(16)
derived_key derive_key(password, salt)
print(Derived Key:, derived_key)**输入
输出示例**:
输入: 密码: mysecretpassword, 盐值: b... (随机生成)输出: 派生密钥: b... (派生的密钥)
3. 修改加密算法参数如填充方式
Python 实现:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef aes_encrypt_with_custom_padding(data, key, padding_length):cipher AES.new(key, AES.MODE_ECB)padded_data data.encode(utf-8) bytes([padding_length] * padding_length)encrypted_data cipher.encrypt(padded_data)return encrypted_data# 示例
key get_random_bytes(16)
data Hello, Custom Padding!
encrypted aes_encrypt_with_custom_padding(data, key, 16)print(Encrypted with Custom Padding:, encrypted)输入输出示例:
输入: Hello, Custom Padding!, 密钥: b... (随机生成), 填充长度: 16输出: 加密结果: b... (加密的密文)
4. 密钥扩展从较短密钥生成较长密钥
Python 实现:
from Crypto.Hash import SHA256def extend_key(short_key):return SHA256.new(short_key).digest()# 示例
short_key bshortkey
extended_key extend_key(short_key)
print(Extended Key:, extended_key)输入输出示例:
输入: 短密钥: bshortkey输出: 扩展密钥: b... (扩展后的密钥)
5. 加密的哈希化加密后哈希化
Python 实现:
from Crypto.Hash import SHA256def hash_after_encryption(encrypted_data):hash_object SHA256.new(dataencrypted_data)return hash_object.hexdigest()# 示例
data Hello, Hash after Encryption!
encrypted aes_encrypt_decrypt(data, key, encrypt)
hashed hash_after_encryption(encrypted)print(Hashed Encrypted Data:, hashed)输入输出示例:
输入: Hello, Hash after Encryption!, 加密数据: b...输出: 哈希值: d2d2d2d2d2...d2d2 以上示例展示了 DES 和 AES 对称加密算法的基本使用方法以及如何在 Python 和 JavaScript 中实现这些算法。此外还涵盖了一些拓展用法例如加盐、密钥衍生、修改加密算法参数等。这些方法为实际应用中的加密需求提供了丰富的解决方案。