3个版本
0.1.2 | 2019年3月12日 |
---|---|
0.1.1 | 2017年2月17日 |
0.1.0 | 2017年2月16日 |
#2218在密码学
6,568每月下载次数
用于9个crate(2个直接使用)
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);
参考文献
- 具有可证明界限的ARX设计策略:SPARX和LAX(Daniel Dinu、Léo Perrin、Aleksei Udovenko、Vesselin Velichkov、Johann Großschädl、Alex Biryukov)。
依赖项
~120KB