Rust库学习-cipher(AES128简单使用)

介绍

cipherRust的一个密码库
AES128keyblock的长度都是128bit(即128(bit)/8(一个字节8bit)=16个字节)
所以下文中GenericArray::from固定长度为16位

实践

Cargo.toml

[dependencies]
aes = "0.8.2"
base64 = "0.13.1"
cipher = "0.4.3"

main.rs

use aes::cipher::{generic_array::GenericArray, BlockEncrypt, KeyInit,BlockDecrypt};
use aes::Aes128;
fn main() {
    let test = "0000000000000000";
    let test = test.as_bytes();

    println!("test: {:?}", test);

    let key = GenericArray::from([48u8; 16]);
    let mut block = GenericArray::from([48u8; 16]);
    // Initialize cipher
    let cipher = Aes128::new(&key);
    // Encrypt block in-place
    println!("明文: {:?}", block);
    cipher.encrypt_block(&mut block);
    println!("密文: {:?}", base64::encode(block));

    cipher.decrypt_block(&mut block);
    println!("明文: {:?}", std::str::from_utf8(&block));
}

总结

一开始以为 0u8 指的是u8类型的0值,其实0u8对应的是ASCII中的NULL,因此怎么测都不对.同时因为第一次接触u8这个类型,网上大多的实例都是转hex,打印出来的值也让人困惑.

在发现数字0对应的ASCII应该是48时,才恍然大悟.同时把加密后的u8值转成base64.这可能比转成hex更容易看一点.

加密后的值是可能不是UTF8的字符,std::str::from_ut8,不能打印出能让人看的字符,转成hex或者base64,容易让人理解.

解密后,变成UTF8编码的0值(UTF80值和ASCII一样的),就可以正常转回熟知的值了

测试

输出
验证

posted @ 2022-11-17 21:11  blackTree  阅读(991)  评论(0编辑  收藏  举报