4个版本
0.2.2 | 2024年2月5日 |
---|---|
0.2.1 | 2024年2月5日 |
0.2.0 | 2024年2月5日 |
0.1.0 | 2023年12月11日 |
#640 in 加密学
1,084 monthly downloads
用于 3 crates
115KB
1.5K SLoC
Soft-AES:Rust中基于软件的AES功能库
Soft-AES是一个Rust库,提供了高级加密标准(AES)算法的软件实现,与基于硬件的解决方案不同。它提供电子密码本(ECB)模式和密码块链接(CBC)模式的AES加密和解密,以及基于密码的报文认证码(AES-CMAC)计算。
该库支持PKCS#7填充和0x80
填充(ISO/IEC 9797-1填充方法2)。
Soft-AES中的AES功能使用功能方法实现,而不是基于实例的方法。通过使用查找表来执行关键的AES操作,该库在简单性和性能之间取得了平衡。
危险! 需要注意的是,此实现目前尚未包含针对侧信道攻击的防御措施。因此,Soft-AES最适合用于教育目的和非关键应用场景,例如测试,在这些场景中,高级保护不是主要关注点。
目录
特性
- AES核心:单块加密和解密过程的实现,包括SubBytes、ShiftRows、MixColumns及其逆运算。
- ECB模式:简单的无链接的块加密和解密。
- CBC模式:基于初始化向量(IV)的改进的块加密和解密。
- AES-CMAC:基于AES-128、AES-192和AES-256的消息认证能力。
- PKCS#7填充:支持PKCS#7填充方案,以确保块大小均匀。
- 0x80填充:支持
0x80
填充(ISO/IEC 9797-1填充方法2)。
使用方法
要在您的Rust项目中使用soft-aes
,请将其添加到您的Cargo.toml
文件中的依赖项中
[dependencies]
soft-aes = "0.2.0"
该库旨在直接集成到加密应用程序中,特别是那些需要AES加密和解密的应用程序。以下是库不同组件的基本使用示例。
AES ECB模式
use soft_aes::aes::{aes_enc_ecb, aes_dec_ecb};
let plaintext = b"Example plaintext.";
let key = b"Very secret key.";
let padding = Some("PKCS7");
let encrypted = aes_enc_ecb(plaintext, key, padding).expect("Encryption failed");
let decrypted = aes_dec_ecb(&encrypted, key, padding).expect("Decryption failed");
assert_eq!(decrypted, plaintext);
AES CBC模式
use soft_aes::aes::{aes_enc_cbc, aes_dec_cbc};
let plaintext = b"Example plaintext.";
let key = b"Very secret key.";
let iv = b"Random Init Vec.";
let padding = Some("PKCS7");
let encrypted = aes_enc_cbc(plaintext, key, iv, padding).expect("Encryption failed");
let decrypted = aes_dec_cbc(&encrypted, key, iv, padding).expect("Decryption failed");
assert_eq!(decrypted, plaintext);
AES CMAC
use soft_aes::aes::aes_cmac;
use hex::decode as hex_decode;
let key = hex_decode("603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4").unwrap();
let message = hex_decode("6BC1BEE22E409F96E93D7E117393172AAE2D8A57").unwrap();
let mac = aes_cmac(&message, &key).unwrap();
assert_eq!(
mac.to_vec(),
hex_decode("156727DC0878944A023C1FE03BAD6D93").unwrap()
);
PKCS#7填充
use soft_aes::padding::{pkcs7_pad, pkcs7_unpad};
let mut data = vec![0x01, 0x02, 0x03];
let block_size = 8;
pkcs7_pad(&mut data, block_size).expect("Padding failed");
assert_eq!(data, vec![0x01, 0x02, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05]);
pkcs7_unpad(&mut data).expect("Unpadding failed");
assert_eq!(data, vec![0x01, 0x02, 0x03]);
测试
Soft-AES库包括针对国家标准与技术研究院(NIST)的先进加密标准算法验证套件(AESAVS)的全面测试,包括ECB模式和额外的测试向量。
当前的NIST测试覆盖率
- AES ECB模式验证:通过使用来自AESAVS的已知答案测试(KAT),对各种密钥大小进行了广泛的覆盖。
核心单元测试
使用来自CryptoTool在线AES逐步工具的测试向量进行额外的测试。
未来测试扩展
计划扩展测试范围以涵盖其他AES模式和额外的测试场景。
免责声明
- ECB模式限制:AES的ECB模式不能确保具有可识别模式的数据的机密性。
- CBC模式注意事项:虽然AES CBC模式增强了安全性,但需要谨慎管理初始化向量(IV)。
- 密码学随机性和密钥管理:该库不包含自己的密码学随机数生成器或管理密码学密钥。
- 无针对旁路攻击的保护:主要用于教育用途和非关键应用。
- “现状”条款:该库“现状”提供,不提供任何保证。
官方标准参考
-
AES在FIPS PUB 197中定义。
-
AES-CMAC在RFC 4493中定义。
-
AES-CMAC对不同密钥长度的定义在NIST SP 800-38B中。
-
PKCS#7填充在RFC 2315中定义。
-
0x80填充在ISO/IEC 9797-1填充方法2中定义。
致谢
Soft-AES库的开发是知识、资源和工具的结晶,这些对其设计和实现产生了重大影响。
Soft-AES的Rust实现从根本上基于我在学习期间实现的C实现,主要受《Rijndael的设计》一书及其参考代码的指导。以及Joan Daemen和Vincent Rijmen的《Rijndael的设计:AES - 先进加密标准》一书中更新的见解。
此外,利用AI辅助对库的各种方面以及SmartCommit进行了文档编写、注释和故障排除。SmartCommit作为提交助手。
相关项目
soft-aes-wasm
soft-aes-wasm是一个配套项目,它扩展了Soft-AES
库的功能,使其能够支持WebAssembly(Wasm)。该项目通过提供Soft-AES
的Wasm接口,使Web应用程序能够直接执行AES加密和解密。
Web UI
要直接在浏览器中实现AES的实用和用户友好的实现,请访问AES-Wasm工具。这个基于soft-aes-wasm
库的Web工具提供了在浏览器中执行AES加密和解密测试的便捷解决方案。
许可证
版权所有David Schmid ([email protected])
二进制文件根据GNU通用公共许可证版本3(GPLv3)的条款分发,具体请参阅LICENSE文件。