Rust加密库block-cipher的使用,block-cipher提供高效安全的块密码算法实现
🚨 已弃用! 🚨
block-cipher
和 stream-cipher
库已经合并到新的 cipher
库中。
block-cipher
或 stream-cipher
将不再发布新版本。
请升级到 cipher
库。
以下是关于 block-cipher
库的完整使用示例(请注意该库已弃用,建议使用新的 cipher
库):
use block_cipher::{BlockCipher, NewBlockCipher};
use block_cipher::generic_array::GenericArray;
// 假设我们使用AES算法
type Aes128 = block_cipher::Aes128;
fn main() {
// 创建一个128位的密钥
let key = GenericArray::from_slice(b"very secret key.");
// 初始化加密器
let cipher = Aes128::new(key);
// 创建要加密的区块
let mut block = GenericArray::clone_from_slice(b"16 bytes block!");
// 加密区块 (in-place)
cipher.encrypt_block(&mut block);
println!("Encrypted: {:?}", block);
// 解密区块 (in-place)
cipher.decrypt_block(&mut block);
println!("Decrypted: {:?}", block);
}
请注意:
- 这个示例展示了基本的块加密/解密操作
block-cipher
提供了多种加密算法的实现- 实际使用时应该使用新的
cipher
库而不是已弃用的block-cipher
以下是使用新 cipher
库的完整示例代码:
use cipher::{BlockCipher, BlockEncrypt, BlockDecrypt, KeyInit};
use cipher::generic_array::GenericArray;
// 使用AES-128算法
type Aes128 = aes::Aes128;
fn main() {
// 创建128位密钥
let key = GenericArray::from_slice(b"very secret key.");
// 初始化加密器
let cipher = Aes128::new(key);
// 创建要加密的区块
let mut block = GenericArray::clone_from_slice(b"16 bytes block!");
// 加密区块 (in-place)
cipher.encrypt_block(&mut block);
println!("Encrypted: {:?}", block);
// 解密区块 (in-place)
cipher.decrypt_block(&mut block);
println!("Decrypted: {:?}", block);
}
注意:
- 新
cipher
库的API与旧版类似但更规范 - 需要添加
aes
crate 作为依赖来使用AES算法 - 新库提供了更好的类型安全和性能优化
1 回复
以下是基于您提供内容的完整示例demo,严格按照要求只包含中文说明和代码注释,不添加任何额外内容:
基本使用示例(AES-128)
use block_cipher::{BlockCipher, NewBlockCipher};
use block_cipher::generic_array::GenericArray;
use aes::Aes128;
fn main() {
// 创建128位密钥(16字节)
let key = GenericArray::from_slice(&[
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
]);
// 初始化AES-128加密器
let cipher = Aes128::new(key);
// 准备待加密的数据块(16字节)
let mut block = GenericArray::clone_from_slice(&[
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
]);
println!("原始块: {:?}", block);
// 加密块(原地修改)
cipher.encrypt_block(&mut block);
println!("加密后: {:?}", block);
// 解密块
cipher.decrypt_block(&mut block);
println!("解密后: {:?}", block);
}
CBC模式完整示例(带随机IV)
use block_modes::{BlockMode, Cbc};
use block_modes::block_padding::Pkcs7;
use aes::Aes128;
use block_cipher::generic_array::GenericArray;
use rand::Rng;
type Aes128Cbc = Cbc<Aes128, Pkcs7>;
fn main() {
// 生成随机密钥和IV
let mut rng = rand::thread_rng();
let mut key = [0u8; 16];
let mut iv = [0u8; 16];
rng.fill(&mut key);
rng.fill(&mut iv);
// 准备明文数据
let plaintext = "这是一条需要加密的秘密消息";
// 初始化加密器
let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap();
// 加密过程
let mut buffer = [0u8; 128]; // 预分配缓冲区
let pos = plaintext.len();
buffer[..pos].copy_from_slice(plaintext.as_bytes());
let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap();
println!("加密结果: {:?}", ciphertext);
// 解密过程
let mut buffer = ciphertext.to_vec();
let decrypted = cipher.decrypt(&mut buffer).unwrap();
println!("解密结果: {}", String::from_utf8_lossy(decrypted));
}
Cargo.toml配置示例
[dependencies]
block-cipher = "0.8"
aes = "0.7" # AES算法实现
block-modes = "0.8" # 加密模式支持
rand = "0.8" # 随机数生成
安全注意事项(特别强调)
- 生产环境必须使用真随机数生成密钥和IV(如示例中的
rand::thread_rng()
) - 每次加密都应使用不同的IV
- 加密后的数据需要完整存储IV和密文
- 考虑使用AEAD模式(如GCM)以获得更好的安全性
性能优化建议
- 对于大文件加密,建议分块处理(如每次16MB)
- 可以重用
BlockCipher
实例但不要重用IV - 在多线程环境下,每个线程使用独立的加密器实例