如何以密钥为种子对bytearray执行随机打乱及逆打乱操作
问题核心错误点
你尝试用random.Random(1/seed).shuffle()实现解密的方案不可行,random模块的seed是随机数生成器的初始化参数,和原seed的倒数没有任何绑定逻辑,不同seed会生成完全无关的随机序列,自然无法还原数据。
可行实现方案
random.Random(seed).shuffle()的底层是Fisher-Yates洗牌算法,只要使用和加密时完全相同的seed初始化随机数生成器,就能复现加密过程中每一步生成的随机索引,再执行逆洗牌操作即可还原原始数据。
具体实现步骤
- 加密过程无需额外存储信息,仅需确保解密时使用的seed和加密时完全一致
- 解密时首先用相同seed初始化随机数生成器,先生成和加密洗牌时完全相同的随机索引序列并存储
- 对加密后的bytearray执行逆Fisher-Yates洗牌,倒序遍历之前生成的随机索引,反向交换元素即可还原
可运行示例代码
import random def encrypt(origin_data: bytearray, seed: int) -> bytearray: encrypted = origin_data.copy() random.Random(seed).shuffle(encrypted) return encrypted def decrypt(encrypted_data: bytearray, seed: int) -> bytearray: decrypted = encrypted_data.copy() n = len(decrypted) # 生成和加密过程完全一致的随机索引序列 rng = random.Random(seed) shuffle_indices = [rng.randint(0, i) for i in range(n-1, 0, -1)] # 倒序执行反向交换还原数据 for i, j in reversed(list(enumerate(shuffle_indices, start=1))): decrypted[n-i], decrypted[j] = decrypted[j], decrypted[n-i] return decrypted
效果验证
# 测试用例 origin = bytearray(b"test_encryption_123") seed = 987654321 encrypted = encrypt(origin, seed) decrypted = decrypt(encrypted, seed) assert origin == decrypted
注意:该方案仅适用于学习场景,不要用于生产环境敏感数据加密,普通伪随机数生成器的随机性不足以达到商用加密安全标准
内容的提问来源于stack exchange,提问作者Kapa
相关产品推荐
相关产品推荐

