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 加密学

Download history 4/week @ 2024-04-15 96/week @ 2024-04-22 106/week @ 2024-04-29 111/week @ 2024-05-06 132/week @ 2024-05-13 191/week @ 2024-05-20 189/week @ 2024-05-27 173/week @ 2024-06-03 122/week @ 2024-06-10 276/week @ 2024-06-17 200/week @ 2024-06-24 141/week @ 2024-07-01 193/week @ 2024-07-08 394/week @ 2024-07-15 224/week @ 2024-07-22 267/week @ 2024-07-29

1,084 monthly downloads
用于 3 crates

GPL-3.0 许可证

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)。
  • 密码学随机性和密钥管理:该库不包含自己的密码学随机数生成器或管理密码学密钥。
  • 无针对旁路攻击的保护:主要用于教育用途和非关键应用。
  • “现状”条款:该库“现状”提供,不提供任何保证。

官方标准参考

致谢

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文件。

无运行时依赖