rust - 基于AES-CBC-128的图片加密实现

本文提供了一种基于AES128算法的图片加解密的方案。可以把图片看作二进制的文本,以文本的方式加解密即可。

添加依赖

cargo add rust-crypto
cargo add windows

位图加密

use std::mem;
use windows::Win32::Graphics::Gdi::{BITMAPFILEHEADER, BITMAPINFOHEADER};

// 计算位图的文件头长度和位图信息头长度
const FILE_HEADER_LEN: usize = mem::size_of::<BITMAPFILEHEADER>();
const INFO_HEADER_LEN: usize = mem::size_of::<BITMAPINFOHEADER>();

pub fn aes128_encrypt_bmp(
    key: &[u8],
    iv: &[u8],
    bmp_buffer: Vec<u8>,
) -> Vec<u8> {
    // 计算位图头长度
    let header_len = FILE_HEADER_LEN + INFO_HEADER_LEN;

    // 获得位图的像素数据
    let header = &bmp_buffer[..header_len];
    let pixel_data = &bmp_buffer[header_len..];

    // 只加密像素部分,保留头部不变
    let encrypt_pixel_data =
        aes128_cbc_encrypt(pixel_data, &key, &iv).unwrap();

    // 生成新的位图
    let mut encrypt_bmp_buffer = Vec::new();
    encrypt_bmp_buffer.extend_from_slice(header);
    encrypt_bmp_buffer.extend_from_slice(&encrypt_pixel_data);

    encrypt_bmp_buffer
}

位图解密

pub fn aes128_decrypt_bmp(
    key: &[u8],
    iv: &[u8],
    bmp_buffer: Vec<u8>,
) -> Vec<u8> {
    let header_len = FILE_HEADER_LEN + INFO_HEADER_LEN;
    let header = &bmp_buffer[..header_len];
    let pixel_data = &bmp_buffer[header_len..];

    // 解密像素部分
    let decrypt_pixel_data =
        aes128_cbc_decrypt(pixel_data, &key, &iv).unwrap();

    // 生成原位图
    let mut decrypt_bmp_buffer = Vec::new();
    decrypt_bmp_buffer.extend_from_slice(header);
    decrypt_bmp_buffer.extend_from_slice(&decrypt_pixel_data);

    decrypt_bmp_buffer
}

单元测试

#[test]
fn test_aes128_encrypt_bmp() {
    let key = get_random_key16();
    let iv = generate_iv();

    // 加密
    let path = env::current_dir().unwrap().join("tests/test-image.bmp");
    let bmp_buffer = fs::read(path).unwrap();
    let encrypt_bmp_buffer = aes128_encrypt_bmp(&key, &iv, bmp_buffer);
    let encrypt_path =
        env::current_dir().unwrap().join("tests/encrypted-test-image.bmp");
    fs::write(encrypt_path.as_path(), encrypt_bmp_buffer).unwrap();

    // 解密
    let bmp_buffer = fs::read(encrypt_path).unwrap();
    let decrypt_bmp_buffer = aes128_decrypt_bmp(&key, &iv, bmp_buffer);
    let encrypt_path =
        env::current_dir().unwrap().join("tests/decrypted-test-image.bmp");
    fs::write(encrypt_path, decrypt_bmp_buffer).unwrap();
}

相关推荐

  1. rust - 基于AES-CBC-128图片加密实现

    2024-03-24 21:40:02       37 阅读
  2. rust - 基于AES-CBC-128双重加密实现

    2024-03-24 21:40:02       40 阅读
  3. C# AES-128-CBC 加密

    2024-03-24 21:40:02       51 阅读
  4. 代码示例:OpenSSL AES CBC 加密

    2024-03-24 21:40:02       32 阅读
  5. iOS MT19937随机数生成,结合AES-CBC加密算法实现

    2024-03-24 21:40:02       27 阅读
  6. 【Go】使用Go语言实现AES CBC No Padding加密和解密

    2024-03-24 21:40:02       32 阅读
  7. openssl3.2 - exp - aes-128-cbc

    2024-03-24 21:40:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-24 21:40:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-24 21:40:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-24 21:40:02       87 阅读
  4. Python语言-面向对象

    2024-03-24 21:40:02       96 阅读

热门阅读

  1. Git常用指令总结

    2024-03-24 21:40:02       32 阅读
  2. git常用指令

    2024-03-24 21:40:02       37 阅读
  3. Web基础应用

    2024-03-24 21:40:02       43 阅读
  4. js中的new Map的用法

    2024-03-24 21:40:02       45 阅读
  5. 算法刷题记录 Day27

    2024-03-24 21:40:02       42 阅读
  6. qt拖拽事件重写

    2024-03-24 21:40:02       39 阅读
  7. 解决 Electron 14 之后版本使用 remote 模块报错

    2024-03-24 21:40:02       39 阅读
  8. MYSQL事务面试题记录

    2024-03-24 21:40:02       47 阅读