3个版本

0.1.2 2019年3月12日
0.1.1 2017年2月17日
0.1.0 2017年2月16日

#2218密码学

Download history 1966/week @ 2024-03-13 1791/week @ 2024-03-20 1054/week @ 2024-03-27 2596/week @ 2024-04-03 2235/week @ 2024-04-10 2223/week @ 2024-04-17 4219/week @ 2024-04-24 1384/week @ 2024-05-01 4206/week @ 2024-05-08 3408/week @ 2024-05-15 2506/week @ 2024-05-22 2716/week @ 2024-05-29 2605/week @ 2024-06-05 1924/week @ 2024-06-12 1289/week @ 2024-06-19 399/week @ 2024-06-26

6,568每月下载次数
用于9个crate(2个直接使用)

ISC许可证

20KB
380

为Rust提供的SPARX分组密码实现

SPARX是一种轻量级分组密码族,允许小型处理器以标准算法所需的成本的一小部分安全地加密信息。

由于使用了ARX操作,这些分组密码在对抗基于S-Box的密码(如AES)的侧信道攻击方面具有内在的更高安全性。

此外,与其他所有共享这些优点的ARX-based密码不同,SPARX密码是唯一一个可以证明差分和线性轨迹概率界限的ARX-based分组密码。

总之,SPARX具有

  • 基于ARX的密码的轻量级和侧信道鲁棒性,
  • 基于S-Box的密码的安全性论证,
  • 灵活的结构,有助于实现权衡。

用法

此crate在sparx64模块中实现了SPARX-64/128(64位分组大小,128位密钥),在sparx128模块中实现了SPARX-128/128(128位分组大小,128位密钥)。

它不需要Rust标准库。

单个分组的加密

let key: [u8; KEY_SIZE] = [0x11, 0x00, 0x33, 0x22, 0x55, 0x44, 0x77, 0x66, 0x99, 0x88, 0xbb,
                           0xaa, 0xdd, 0xcc, 0xff, 0xee];
let mut block: [u8; BLOCK_SIZE] = [0x23, 0x01, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd];
let ks = key_schedule_encrypt(&key); // key schedule - can be reused with multiple blocks
encrypt_block(&mut block, &ks);
// ...

decrypt_block()执行逆操作

let ks = key_schedule_decrypt(&key); // key schedule - can be reused with multiple blocks
decrypt_block(&mut block, &ks);

加密任意大小的缓冲区

这使用SPARX在计数器模式下以及160位nonce来加密多个分组。

对于SPARX-64/128,此构造的内部计数器大小为32位(不应使用相同的(key, nonce)元组)加密超过32GB,而对于SPARX-128/128,大小为48位(允许使用相同的(key, nonce)元组)加密高达4PB。

nonce足够大,可以随机选择;碰撞发生的概率将非常低。

请注意,此构造不向消息添加任何认证标签。

let nonce: [u8; NONCE_SIZE] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
                               19, 20];
let key: [u8; KEY_SIZE] = [0x11, 0x00, 0x33, 0x22, 0x55, 0x44, 0x77, 0x66, 0x99, 0x88, 0xbb,
                           0xaa, 0xdd, 0xcc, 0xff, 0xee];
let input = b"The quick brown fox jumps over the lazy dog";
let mut buf = input.to_vec();
encrypt_ctr(&mut buf, &nonce, &key);
// ...
decrypt_ctr(&mut buf, &nonce, &key);

参考文献

依赖项

~120KB