对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用

本文涉及的产品
云解析 DNS,旗舰版 1个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用


📚 对称加密算法解析:DES、AES及其在pycryptodomecrypto-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, unpad
def 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_data
    elif 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 = b'8bytekey'  # 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!", 密钥: b'8bytekey'
  • 输出:
  • 加密结果: 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 os
def 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_data
    elif 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_bytes
def aes_encrypt_with_salt(data, key, salt):
    key_with_salt = key + salt
    cipher = 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 scrypt
def derive_key(password, salt):
    return scrypt(password.encode('utf-8'), salt, 16, N=2**14, r=8, p=1)
# 示例
password = "mysecretpassword"
salt = get_random_bytes(16)
derived_key = derive_key(password, salt)
print("Derived Key:", derived_key)
• 10

**输入

输出示例**:

  • 输入: 密码: "mysecretpassword", 盐值: b'...' (随机生成)
  • 输出:
  • 派生密钥: b'...' (派生的密钥)

3. 修改加密算法参数(如填充方式)

Python 实现:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
def 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 SHA256
def extend_key(short_key):
    return SHA256.new(short_key).digest()
# 示例
short_key = b'shortkey'
extended_key = extend_key(short_key)
print("Extended Key:", extended_key)

输入输出示例:

  • 输入: 短密钥: b'shortkey'
  • 输出:
  • 扩展密钥: b'...' (扩展后的密钥)

5. 加密的哈希化(加密后哈希化)

Python 实现:

from Crypto.Hash import SHA256
def hash_after_encryption(encrypted_data):
    hash_object = SHA256.new(data=encrypted_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 中实现这些算法。此外,还涵盖了一些拓展用法,例如加盐、密钥衍生、修改加密算法参数等。这些方法为实际应用中的加密需求提供了丰富的解决方案。

目录
相关文章
|
4月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
7天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
34 17
|
10天前
|
JavaScript 算法 安全
深度剖析:共享文件怎么设置密码和权限的 Node.js 进阶算法
在数字化时代,共享文件的安全性至关重要。本文聚焦Node.js环境,介绍如何通过JavaScript对象字面量构建数据结构管理文件安全信息,包括使用`bcryptjs`库加密密码和权限校验算法,确保高效且安全的文件共享。通过实例代码展示加密与权限验证过程,帮助各行业实现严格的信息资产管理与协作。
|
12天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
48 6
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
132 63
|
25天前
|
存储 监控 算法
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
43 9
|
3月前
|
传感器 安全 物联网
量子加密技术的应用领域有哪些?
量子加密技术的应用领域有哪些?
316 55
|
2月前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
43 7
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
29天前
|
存储 监控 JavaScript
深度探秘:运用 Node.js 哈希表算法剖析员工工作时间玩游戏现象
在现代企业运营中,确保员工工作时间高效专注至关重要。为应对员工工作时间玩游戏的问题,本文聚焦Node.js环境下的哈希表算法,展示其如何通过快速查找和高效记录员工游戏行为,帮助企业精准监测与分析,遏制此类现象。哈希表以IP地址等为键,存储游戏网址、时长等信息,结合冲突处理与动态更新机制,确保数据完整性和时效性,助力企业管理层优化工作效率。
31 3

推荐镜像

更多