Rust实现AES加解密详解

 更新时间:2022年10月26日 14:06:22   作者:Zhou T.x.  
这篇文章主要为大家详细介绍了如何利用Rust语言实现AES加解密算法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下

一、选择使用 rust-crypto

rust-crypto 官方相关站点

crates.io

https://crates.io/crates/rust-crypto

repository

https://github.com/DaGenix/rust-crypto

documentation (以0.2.36为例)

https://docs.rs/rust-crypto/0.2.36

二、Cargo.toml 文件

[dependencies]
rust-crypto = "0.2.36"

三、工具类

说明:这里使用的是AES256/CBC/Pkcs加解密格式。

因此,key的长度为 256bits (32Bytes) iv的长度为128bits (16Bytes)

1、加密

/// Encrypt a buffer with the given key and iv using AES256/CBC/Pkcs encryption.
fn aes256_cbc_encrypt(
    data: &[u8],
    key: &[u8; 32],
    iv: &[u8; 16],
) -> Result<Vec<u8>, SymmetricCipherError> {
    let mut encryptor = aes::cbc_encryptor(
        KeySize256,
        key, iv,
        PkcsPadding,
    );

    let mut buffer = [0; 4096];
    let mut write_buffer = RefWriteBuffer::new(&mut buffer);
    let mut read_buffer = RefReadBuffer::new(data);
    let mut final_result = Vec::new();

    loop {
        let result = 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 {
            BufferUnderflow => break,
            _ => continue,
        }
    }

    Ok(final_result)
}

2、解密

/// Decrypt a buffer with the given key and iv using AES256/CBC/Pkcs encryption.
fn aes256_cbc_decrypt(
    data: &[u8],
    key: &[u8; 32],
    iv: &[u8; 16],
) -> Result<Vec<u8>, SymmetricCipherError> {
    let mut decryptor = aes::cbc_decryptor(
        KeySize256,
        key, iv,
        PkcsPadding,
    );

    let mut buffer = [0; 4096];
    let mut write_buffer = RefWriteBuffer::new(&mut buffer);
    let mut read_buffer = RefReadBuffer::new(data);
    let mut final_result = Vec::new();

    loop {
        let result = 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 {
            BufferUnderflow => break,
            _ => continue,
        }
    }

    Ok(final_result)
}

3、测试样例

3.1、生成随机key和iv

因为仅用作测试,所以才使用随机key和iv,应用场景注意使用固定值!

这里我们使用的crate是rand。

首先在Cargo.toml中引入:

[dependencies]
rand = "0.8.4"

3.2、编写测试用例

#[test]
fn test_aes256_cbc() {
    use rand::{RngCore, rngs::OsRng};

    let mut rng = OsRng::default();
    let mut key = [0; 32];
    let mut iv = [0; 16];
    rng.fill_bytes(&mut key);
    rng.fill_bytes(&mut iv);

    let data = "Hello, world!";
    let encrypted_data = aes256_cbc_encrypt(data.as_bytes(), &key, &iv).unwrap();
    let decrypted_data = aes256_cbc_decrypt(encrypted_data.as_slice(), &key, &iv).unwrap();

    let result = str::from_utf8(decrypted_data.as_slice()).unwrap();

    assert_eq!(data, result);
    println!("{}", result);
}

最后,执行测试用例,测试成功!

到此这篇关于Rust实现AES加解密详解的文章就介绍到这了,更多相关Rust AES加解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust中HashMap类型的使用详解

    Rust中HashMap类型的使用详解

    Rust中一种常见的集合类型是哈希映射,本文主要介绍了Rust中HashMap类型的使用详解,包含创建访问修改遍历等,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 从零开始使用Rust编写nginx(TLS证书快过期了)

    从零开始使用Rust编写nginx(TLS证书快过期了)

    wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,本文给大家介绍从零开始使用Rust编写nginx(TLS证书快过期了),感兴趣的朋友一起看看吧
    2024-03-03
  • Rust开发WebAssembly在Html和Vue中的应用小结(推荐)

    Rust开发WebAssembly在Html和Vue中的应用小结(推荐)

    这篇文章主要介绍了Rust开发WebAssembly在Html和Vue中的应用,本文将带领大家在普通html上和vue手脚架上都来运行wasm的流程,需要的朋友可以参考下
    2022-08-08
  • Rust 枚举和模式匹配的实现

    Rust 枚举和模式匹配的实现

    枚举是 Rust 中非常重要的复合类型,也是最强大的复合类型之一,广泛用于属性配置、错误处理、分支流程、类型聚合等场景中,本文就来介绍一下Rust 枚举和模式匹配,感兴趣的可以了解一下
    2023-12-12
  • R语言ggplot2绘图安装与调试

    R语言ggplot2绘图安装与调试

    ggplot2是R语言中最常用的绘图包之一,它提供了一种基于图层的绘图语法,使得用户可以轻松地创建高质量的数据可视化图表。在使用ggplot2之前,需要先安装该包并进行调试。安装ggplot2可以通过CRAN或GitHub进行,调试则需要注意数据格式、语法错误等问题。
    2023-06-06
  • 解析Rust struct 中的生命周期

    解析Rust struct 中的生命周期

    rust 的生命周期保证了内存的安全性,同时也增加了开发者的心智负担。是在上线之前多费心思写代码,还是在上线以后忙忙活活查问题,这是个 trade off 问题,这篇文章主要介绍了Rust struct 中的生命周期,需要的朋友可以参考下
    2022-10-10
  • Rust处理错误的实现方法

    Rust处理错误的实现方法

    程序在运行的过程中,总是会不可避免地产生错误,而如何优雅地解决错误,也是语言的设计哲学之一。本文就来和大家来了Rust是如何处理错误的,感兴趣的可以了解一下
    2023-03-03
  • Rust中类型转换在错误处理中的应用小结

    Rust中类型转换在错误处理中的应用小结

    随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下,对Rust错误处理相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • Rust生成随机数的项目实践

    Rust生成随机数的项目实践

    Rust标准库中并没有随机数生成器,常见的解决方案是使用rand包,本文主要介绍了Rust生成随机数的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust 还有另外一种不持有所有权的数据类型:切片(slice),切片允许我们引用集合中某一段连续的元素序列,而不是整个集合。本文让我们来深入了解Rust的切片
    2022-11-11

最新评论