Rust库学习-cipher(AES128简单使用)
介绍
cipher是Rust的一个密码库
AES128中key和block的长度都是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值(UTF8中0值和ASCII一样的),就可以正常转回熟知的值了
测试



浙公网安备 33010602011771号