Aes算法是现在使用普遍的对称性加密的算法。对于一个字符串,或相关的文件,它是如何加密,如何解密的,通过代码,可以进行很好的复现,也便于增进对加密与解密的了解。

一、从一个字符串说起

extern crate crypto;
extern crate rand;
use crypto::buffer::{BufferResult, ReadBuffer, WriteBuffer};
use crypto::{aes, blockmodes, buffer, symmetriccipher};
use std::{thread, time};use rand::RngCore;
use rand::{OsRng, Rng};
use std::str;
fn encrypt(data: &[u8],key: &[u8],iv: &[u8],
) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {let mut encryptor =aes::cbc_encryptor(aes::KeySize::KeySize256, key, iv, blockmodes::PkcsPadding);let mut final_result = Vec::<u8>::new();let mut read_buffer = buffer::RefReadBuffer::new(data);let mut buffer = [0; 4096];let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);loop {let result = try!(encryptor.encrypt(&mut read_buffer, &mut write_buffer, true));final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i),);match result {BufferResult::BufferUnderflow => break,BufferResult::BufferOverflow => {}}}Ok(final_result)
}fn decrypt(encrypted_data: &[u8],key: &[u8],iv: &[u8],
) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {let mut decryptor =aes::cbc_decryptor(aes::KeySize::KeySize256, key, iv, blockmodes::PkcsPadding);let mut final_result = Vec::<u8>::new();let mut read_buffer = buffer::RefReadBuffer::new(encrypted_data);let mut buffer = [0; 4096];let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);loop {let result = try!(decryptor.decrypt(&mut read_buffer, &mut write_buffer, true));final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i),);match result {BufferResult::BufferUnderflow => break,BufferResult::BufferOverflow => {}}}Ok(final_result)
}
fn main() {let sleep_seconds = time::Duration::from_secs(1000);let message = "I love Rust,Julia & Python, they are so cool! ";let mut key: [u8; 32] = [0; 32];let mut iv: [u8; 16] = [0; 16];let mut rng = OsRng::new().ok().unwrap();rng.fill_bytes(&mut key);rng.fill_bytes(&mut iv);println!("key:{:?}", key);println!("iv:{:?}", iv);let encrypted_data = encrypt(message.as_bytes(), &key, &iv).ok().unwrap();let message_bytes = message.as_bytes();println!("message->as_bytes:{:?}, byte_len:{}",message_bytes,message_bytes.len());println!("message->encrypted:{:?} byte_len:{}",encrypted_data,encrypted_data.len());let decrypted_data = decrypt(&encrypted_data[..], &key, &iv).ok().unwrap();let the_string = str::from_utf8(&decrypted_data).expect("not UTF-8");assert!(message_bytes == &decrypted_data[..]);assert!(message == the_string);println!("the_string:{:?}", the_string);thread::sleep(sleep_seconds);
}

输出结果:

可以看到,不管是解密的字节数组还是字符串比对,解密都是正确的。

二、加密及解密的过程

从上面我们看出,加密的过程,比如,字符串首先是转化是字节向量(数组),然后,加密成新的字节向量(数组),加密后的向量的长度与原字节向量是大概率是不相同的。另外,也无法解析成另一个字符串。

如果是一个文件,或一个文件夹呢,或压缩的文件,原理也是一样。

Rust : AES算法加密、解密相关推荐

  1. android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法

    今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...

  2. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  3. AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密

    一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...

  4. Android直播开发之旅(25):使用AES算法加密多媒体文件(+RSA+MD5+Base64)

    文章目录 1. AES算法 1.1 AES加密过程 1.1.1 字节代替(SubBytes) 1.1.2 行移位(ShiftRows) 1.1.3 列混合(MixColumns) 1.1.4 加轮密钥 ...

  5. Python - AES SHA1PRNG 加密解密总结

    Python - AES SHA1PRNG 加密解密总结 Max.Bai 2020-11 上篇文章是当时研究AES加密的时候的记录,来龙去脉可以取看这篇 python3 - AES 加密实现java中 ...

  6. RSA,AES算法加解密

    密码的前世今生 密码Cryptology,是一种混淆人们视听的一种技术.将可以被正常认知的信息转变成不可以被识别的信息.有交流就有信息,有信息的传递,自然会产生秘密,这是文明发展的必然.密码的出生自然 ...

  7. C# 对称算法,加密解密类

    C# 对称算法,加密解密类 调用有先获取类实例,提供了解密和加密函数. using System.IO;  using System;  using System.Text.RegularExpres ...

  8. Base-N 算法加密解密实现:

    目录 Base-N 算法加密解密实现: Base64 加密解密:(C 语言.python) Base32 加密解密:(C 语言) Base-N 算法加密解密实现: Base64 加密解密:(C 语言. ...

  9. RSA算法加密解密举例

    RSA算法加密解密举例 使用如下数字字母对照表: 明文M="its all greek to me" ,p=47,q=59,e=17,求出其密文以及给出RSA 算法加/解密过程.( ...

  10. 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)

    在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全.有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式.特此写下此篇博文,总结讲述下PHP和JS进行 ...

最新文章

  1. Battle for Wesnoth 1.8.4,开源战斗游戏
  2. 六种方法实现CSS三栏布局
  3. python培训机构推荐-Python培训班哪家好?老男孩Python入门学习
  4. 9 README,全套代码
  5. mapper文件cant resolve param_Nodejs 中基于 Stream 的多文件合并实现
  6. 五分钟用vue实现一个五星打分效果
  7. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配
  8. 一个取消事件的简单js例子(事件冒泡与取消默认行为)
  9. OpenJudge NOI 1.8 22:神奇的幻方
  10. 淘宝网手机客户端开发(一)目录篇
  11. (转)Bootstrap 之 Metronic 模板的学习之路 - (7)GULP 前端自动化工具
  12. python selenium 如何选中iframe中的元素?
  13. DevExpress学习之Gridcontrol
  14. Ubuntu18.04 上 ESP8285 的 esp-at release_v2.2.0.0 编译环境搭建
  15. 使用gui来初始化参数matlab,MATLAB GUI参数传递方式
  16. android摄像头录像避坑指东
  17. zabbix5.0手把手搭建过程
  18. Java 操作 Office:POI之word图片处理
  19. 闪购网站Gilt从Rails迁移到Scala
  20. python语言基本认识_Python学习之认知(一)

热门文章

  1. C#EasyHook例子C# Hook 指定进程C#注入指定进程 z
  2. [Zju 2112][逆序对统计] 线段树(四) {线段树扩展}
  3. 3G时代日本手机咸鱼难翻身
  4. 使用代码段遍历,枚举类型Enum
  5. MySQL语法一:数据定义语句
  6. Linux下exec函数族比如execve等函数的基本使用
  7. 7款应用最广泛的Linux桌面环境盘点
  8. Swift中的Masonry第三方库——SnapKit
  9. 西门子STEP7 MICROWIN V4 SP5 下载
  10. 用ASP.NET向Javascript传递变量