Rust加密库block-cipher的使用,block-cipher提供高效安全的块密码算法实现

🚨 已弃用! 🚨

block-cipherstream-cipher 库已经合并到新的 cipher 库中。

block-cipherstream-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);
}

请注意:

  1. 这个示例展示了基本的块加密/解密操作
  2. block-cipher 提供了多种加密算法的实现
  3. 实际使用时应该使用新的 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);
}

注意:

  1. cipher 库的API与旧版类似但更规范
  2. 需要添加 aes crate 作为依赖来使用AES算法
  3. 新库提供了更好的类型安全和性能优化

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"         # 随机数生成

安全注意事项(特别强调)

  1. 生产环境必须使用真随机数生成密钥和IV(如示例中的rand::thread_rng()
  2. 每次加密都应使用不同的IV
  3. 加密后的数据需要完整存储IV和密文
  4. 考虑使用AEAD模式(如GCM)以获得更好的安全性

性能优化建议

  1. 对于大文件加密,建议分块处理(如每次16MB)
  2. 可以重用BlockCipher实例但不要重用IV
  3. 在多线程环境下,每个线程使用独立的加密器实例
回到顶部