KRcpl88/SPMBlockCipher
GitHub: KRcpl88/SPMBlockCipher
一种基于 S 盒、置换与异或掩码的可扩展块密码,用于在简单高效的同时实现可动态调整的密钥与块大小。
Stars: 1 | Forks: 0
# SpmBlockCipher
一种简单、高性能的块密码,可以轻松扩展到任意大的密钥大小和/或块大小,基于替换(S盒)、置换和异或位掩码。
该块密码的工作方式如下:
1. 在整个块上以重叠的 16 位字为单位迭代,每次递增 8 位:
1. 使用 16 位替换数组(S 盒)进行替换,将所有 16 位值映射到另一个随机选择的 16 位值
2. 使用 PRNG 对 16 位输出应用 16 位异或掩码,该 PRNG 在每次替换步骤后递增
3. 在整个块上重复,每次递增 8 位,使每次操作与前一次操作重叠 8 位
4. 到达块末尾后,反向重复相同过程,直到回到数组开头
2. 作为最后一步,对块的每个 8 位字节应用一个随机选择的置换,将每个 8 位字节随机映射到块中的另一个位置。
3. 重复此过程 3 次,以确保如果明文中任何 1 位发生翻转,密码文本的所有位都会以相等概率发生变化。
PRNG 使用 64 位字状态和密钥,每次递增 PRNG 时,将密钥加到状态中,然后将新状态作为 PRNG 输出返回。密钥保证为奇数(最低有效位始终为 1),以确保 PRNG 生成一个周期为 2^64 的伪随机序列,换句话说,它会在重复之前枚举所有可能的 64 位字,并以伪随机顺序进行。
替换数组和置换数组均使用初始序列值进行初始化,使得每个值都是唯一的,且 S 盒的范围为 0-2^16,置换数组的范围为 0-块大小。然后使用前述 PRNG 算法通过将数组中的每个条目与数组中另一个随机选择的元素交换来打乱数组。此过程对整个数组重复 16 次。
resulting 块密码简单、高性能且安全。它足够简单,可以轻松地在任何给定语言中实现,并且适用于低内存设备、低性能 CPU 设备,或在脚本环境中内联实现。参考实现使用 128 字节的块大小,这显著大于 AES,并且块大小可以任意增大以抵御暴力攻击。PRNG 掩码会为每个块继续递增,因此输入明文中的每个块都会映射到唯一的输出密码文本。建议使用随机数(nonce),以确保每个使用的随机数对应的密码序列是唯一的。
标签:64位状态, PRNG, S盒, 代码示例, 伪随机数生成器, 位翻转扩散, 分组密码, 加密原语, 加密算法, 反向迭代, 可扩展块大小, 可扩展密钥, 可视化界面, 奇数密钥, 字节重排, 密码学, 对称加密, 异或掩码, 手动系统调用, 数据分析, 数据混淆, 线性同余生成器, 置换, 自动化审计, 软件实现, 轻量级加密, 迭代加密, 逆向工具, 高性能加密