You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以密钥为种子对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:09:01