Rust加密解密库magic-crypt的使用,支持高效AES、DES等算法的数据加解密功能

Rust加密解密库magic-crypt的使用,支持高效AES、DES等算法的数据加解密功能

MagicCrypt是一个Java/PHP/NodeJS/Rust的加密解密库,可用于加密/解密字符串、文件或数据,使用数据加密标准(DES)或高级加密标准(AES)算法。它支持CBC块密码模式、PKCS7填充和64、128、192或256位密钥长度。

示例代码

以下是使用magic-crypt进行AES加密解密的示例:

use magic_crypt::{new_magic_crypt, MagicCryptTrait};

let mc = new_magic_crypt!("magickey", 256);  // 使用256位密钥

let base64 = mc.encrypt_str_to_base64("http://magiclen.org");  // 加密字符串为Base64

assert_eq!("DS/2U8royDnJDiNY2ps3f6ZoTbpZo8ZtUGYLGEjwLDQ=", base64);

assert_eq!("http://magiclen.org", mc.decrypt_base64_to_string(&base64).unwrap());  // 解密Base64字符串

更改缓冲区大小

encrypt_reader_to_writerdecrypt_reader_to_writer方法的默认缓冲区大小为4096字节。如果要更改此大小,可以使用encrypt_reader_to_writer2decrypt_reader_to_writer2方法,并明确定义一个长度。

例如,将缓冲区大小更改为256字节:

use std::io::Cursor;
use base64::Engine;
use magic_crypt::{new_magic_crypt, MagicCryptTrait};
use magic_crypt::generic_array::typenum::U256;

let mc = new_magic_crypt!("magickey", 256);

let mut reader = Cursor::new("http://magiclen.org");
let mut writer = Vec::new();

mc.encrypt_reader_to_writer2::<U256>(&mut reader, &mut writer).unwrap();  // 使用256字节缓冲区加密

let base64 = base64::engine::general_purpose::STANDARD.encode(&writer);

assert_eq!("DS/2U8royDnJDiNY2ps3f6ZoTbpZo8ZtUGYLGEjwLDQ=", base64);

assert_eq!("http://magiclen.org", mc.decrypt_base64_to_string(&base64).unwrap());

无标准库支持

要编译此crate而不使用标准库,请禁用默认功能:

[dependencies.magic-crypt]
version = "*"
default-features = false

完整示例代码

下面是一个更完整的示例,展示如何使用magic-crypt进行AES加密解密:

use magic_crypt::{new_magic_crypt, MagicCryptTrait};

fn main() {
    // 1. 创建加密器实例
    // 参数1: 密钥 (建议使用强密码)
    // 参数2: 密钥位数 (支持64, 128, 192或256)
    let mc = new_magic_crypt!("my_super_secure_key_123", 256);
    
    // 2. 要加密的原始数据
    let plain_text = "This is a secret message containing sensitive data!";
    
    // 3. 加密数据 (输出为Base64格式)
    let encrypted = mc.encrypt_str_to_base64(plain_text);
    println!("Encrypted: {}", encrypted);
    
    // 4. 解密数据
    let decrypted = mc.decrypt_base64_to_string(&encrypted).unwrap();
    println!("Decrypted: {}", decrypted);
    
    // 验证解密结果
    assert_eq!(plain_text, decrypted);
    
    // 5. 文件加密示例
    // 注意: 实际文件操作需要添加std::fs模块
    /*
    let file_data = std::fs::read("input.txt").unwrap();
    let encrypted_file = mc.encrypt_bytes_to_base64(&file_data);
    std::fs::write("encrypted.txt", encrypted_file).unwrap();
    
    let encrypted_content = std::fs::read_to_string("encrypted.txt").unwrap();
    let decrypted_content = mc.decrypt_base64_to_bytes(&encrypted_content).unwrap();
    std::fs::write("decrypted.txt", decrypted_content).unwrap();
    */
}

特性

  1. 支持AES和DES算法
  2. 支持CBC块密码模式
  3. 支持PKCS7填充
  4. 支持64、128、192和256位密钥长度
  5. 提供字符串、字节和文件流的加密解密方法
  6. 支持无标准库环境

要使用此库,请在Cargo.toml中添加依赖:

[dependencies]
magic-crypt = "4.0.1"

完整Demo示例

基于上述内容,这里提供一个更完整的演示示例,展示字符串加密解密和文件加密解密的完整流程:

use magic_crypt::{new_magic_crypt, MagicCryptTrait};
use std::fs;

fn main() {
    // 1. 初始化加密器
    // 参数1: 自定义密钥(建议至少16个字符)
    // 参数2: 密钥长度(256位)
    let encryptor = new_magic_crypt!("my_very_secret_password_1234!", 256);
    
    // 2. 字符串加密解密演示
    let secret_message = "这是需要加密的敏感信息";
    
    // 加密为Base64字符串
    let encrypted = encryptor.encrypt_str_to_base64(secret_message);
    println!("加密后的字符串: {}", encrypted);
    
    // 解密Base64字符串
    let decrypted = encryptor.decrypt_base64_to_string(&encrypted).unwrap();
    println!("解密后的字符串: {}", decrypted);
    assert_eq!(secret_message, decrypted);
    
    // 3. 文件加密解密演示
    let input_file = "plaintext.txt";
    let encrypted_file = "encrypted.bin";
    let decrypted_file = "decrypted.txt";
    
    // 写入测试文件
    fs::write(input_file, "这是文件中的敏感内容").unwrap();
    
    // 加密文件
    let file_data = fs::read(input_file).unwrap();
    let encrypted_data = encryptor.encrypt_bytes_to_base64(&file_data);
    fs::write(encrypted_file, encrypted_data).unwrap();
    
    // 解密文件
    let encrypted_content = fs::read_to_string(encrypted_file).unwrap();
    let decrypted_content = encryptor.decrypt_base64_to_bytes(&encrypted_content).unwrap();
    fs::write(decrypted_file, decrypted_content).unwrap();
    
    // 验证文件内容
    let final_content = fs::read_to_string(decrypted_file).unwrap();
    assert_eq!("这是文件中的敏感内容", final_content);
    
    println!("文件加密解密测试完成!");
}

注意:使用文件操作功能时,需要在Cargo.toml中添加std::fs模块的依赖。


1 回复

Rust加密解密库magic-crypt使用指南

magic-crypt是一个简单易用的Rust加密解密库,支持多种对称加密算法包括AES、DES等,适合需要快速实现数据加解密功能的场景。

主要特性

  • 支持AES-128/AES-192/AES-256加密
  • 支持DES/3DES加密
  • 提供简单的API接口
  • 支持字符串和二进制数据加密

安装

Cargo.toml中添加依赖:

[dependencies]
magic-crypt = "3.1"

基本使用方法

1. 加密字符串

use magic_crypt::{MagicCryptTrait, new_magic_crypt};

let mc = new_magic_crypt!("magickey", 256); // 256-bit AES加密

let encrypted = mc.encrypt_str_to_base64("Hello, world!");
println!("加密结果: {}", encrypted);

2. 解密字符串

let decrypted = mc.decrypt_base64_to_string(&encrypted).unwrap();
println!("解密结果: {}", decrypted);

3. 使用不同算法

// 使用128位AES
let mc_aes128 = new_magic_crypt!("key123", 128);

// 使用DES
let mc_des = new_magic_crypt!("deskey", 64); // DES需要64位(8字节)密钥

4. 加密二进制数据

let data = vec![1, 2, 3, 4, 5];
let encrypted_data = mc.encrypt_bytes(&data);
let decrypted_data = mc.decrypt_bytes(&encrypted_data).unwrap();

高级用法

自定义IV(初始化向量)

use magic_crypt::MagicCrypt;

let mc = MagicCrypt::new_with_iv("mykey", 256, "iv12345678901234"); // IV必须是16字节

文件加密

use std::fs;

// 加密文件
let file_data = fs::read("plain.txt").unwrap();
let encrypted = mc.encrypt_bytes(&file_data);
fs::write("encrypted.dat", encrypted).unwrap();

// 解密文件
let encrypted_data = fs::read("encrypted.dat").unwrap();
let decrypted = mc.decrypt_bytes(&encrypted_data).unwrap();
fs::write("decrypted.txt", decrypted).unwrap();

完整示例代码

use magic_crypt::{MagicCryptTrait, new_magic_crypt};
use std::fs;

fn main() {
    // 1. 字符串加密解密示例
    let mc = new_magic_crypt!("magickey", 256); // 256-bit AES
    
    // 加密字符串
    let plaintext = "这是一段需要加密的敏感数据";
    let encrypted = mc.encrypt_str_to_base64(plaintext);
    println!("加密后的字符串: {}", encrypted);
    
    // 解密字符串
    let decrypted = mc.decrypt_base64_to_string(&encrypted).unwrap();
    println!("解密后的字符串: {}", decrypted);
    
    // 2. 使用不同算法示例
    let mc_aes128 = new_magic_crypt!("aes128key12345678", 128); // AES-128需要16字节密钥
    let mc_des = new_magic_crypt!("deskey78", 64); // DES需要8字节密钥
    
    // 3. 二进制数据加密示例
    let binary_data = vec![0x01, 0x02, 0x03, 0x04, 0x05];
    let encrypted_binary = mc.encrypt_bytes(&binary_data);
    let decrypted_binary = mc.decrypt_bytes(&encrypted_binary).unwrap();
    println!("解密后的二进制数据: {:?}", decrypted_binary);
    
    // 4. 文件加密示例
    // 写入测试文件
    fs::write("test.txt", "文件加密测试内容").unwrap();
    
    // 加密文件
    let file_data = fs::read("test.txt").unwrap();
    let encrypted_file = mc.encrypt_bytes(&file_data);
    fs::write("test.enc", encrypted_file).unwrap();
    
    // 解密文件
    let encrypted_data = fs::read("test.enc").unwrap();
    let decrypted_file = mc.decrypt_bytes(&encrypted_data).unwrap();
    fs::write("test_decrypted.txt", decrypted_file).unwrap();
    
    // 5. 自定义IV示例
    use magic_crypt::MagicCrypt;
    let mc_custom_iv = MagicCrypt::new_with_iv(
        "customkey12345678901234567890", // 32字节密钥(AES-256)
        256, 
        "randomiv12345678" // 16字节IV
    );
    
    let custom_encrypted = mc_custom_iv.encrypt_str_to_base64("使用自定义IV加密");
    println!("自定义IV加密结果: {}", custom_encrypted);
}

注意事项

  1. 密钥长度必须匹配算法要求:

    • AES-128: 16字节
    • AES-192: 24字节
    • AES-256: 32字节
    • DES: 8字节
    • 3DES: 24字节
  2. 对于生产环境使用,建议使用更专业的加密库如rust-opensslring

  3. 初始化向量(IV)应该是随机且唯一的,不要使用固定值

magic-crypt提供了简单易用的API,适合快速开发和原型设计,但对于高安全性要求的场景,建议评估更专业的加密解决方案。

回到顶部