Rust加密与解密库picky的使用,picky提供高效安全的加密算法和数据处理功能

Rust加密与解密库picky的使用

picky是一个提供高效安全加密算法和数据处理功能的Rust库,实现了X.509、PKI、JOSE和HTTP签名等标准。

主要功能

X.509 / PKI

picky提供了X.509证书和PKI(公钥基础设施)的实现。

HTTP签名

支持HTTP消息签名功能。

JOSE

实现了JOSE标准(Javascript Object Signing and Encryption),包括JWT等功能。

安装

在项目目录中运行以下Cargo命令:

cargo add picky

或者在Cargo.toml中添加:

picky = "6.3.0"

示例代码

生成RSA密钥对

use picky::key::PrivateKey;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成2048位的RSA私钥
    let private_key = PrivateKey::generate_rsa(2048)?;
    
    // 导出PEM格式的私钥
    let private_key_pem = private_key.to_pem_str()?;
    println!("Private Key:\n{}", private_key_pem);
    
    // 获取对应的公钥
    let public_key = private_key.to_public_key();
    
    // 导出PEM格式的公钥
    let public_key_pem = public_key.to_pem_str()?;
    println!("Public Key:\n{}", public_key_pem);
    
    Ok(())
}

签名和验证

use picky::key::PrivateKey;
use picky::signature::SignatureAlgorithm;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成RSA密钥对
    let private_key = PrivateKey::generate_rsa(2048)?;
    let public_key = private_key.to_public_key();
    
    // 要签名的数据
    let data = b"Hello, world!";
    
    // 使用SHA-256和PKCS#1 v1.5填充方案创建签名
    let signature = private_key.sign(SignatureAlgorithm::RsaPkcs1v15Sha256, data)?;
    
    // 验证签名
    let is_valid = public_key.verify(SignatureAlgorithm::RsaPkcs1v15Sha256, data, &signature)?;
    println!("Signature is valid: {}", is_valid);
    
    Ok(())
}

JWT创建和验证

use picky::jose::jwt::{Jwt, JwtValidator, JwtHeader, JwtPayload};
use picky::key::PrivateKey;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct CustomClaims {
    user_id: String,
    is_admin: bool,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成RSA密钥对
    let private_key = PrivateKey::generate_rsa(2048)?;
    let public_key = private_key.to_public_key();
    
    // 创建JWT头部
    let header = JwtHeader::rs256();
    
    // 创建自定义claims
    let claims = CustomClaims {
        user_id: "12345".to_string(),
        is_admin: false,
    };
    
    // 创建JWT payload
    let payload = JwtPayload::new_custom(claims)?;
    
    // 签名并生成JWT
    let jwt = Jwt::sign(&private_key, &header, &payload)?;
    let jwt_str = jwt.to_string();
    println!("JWT: {}", jwt_str);
    
    // 验证JWT
    let validator = JwtValidator::new().validate_issued_at(false);
    let verified_jwt = Jwt::parse_and_verify(&jwt_str, &public_key, &validator)?;
    println!("Verified JWT: {:?}", verified_jwt);
    
    Ok(())
}

完整示例:X.509证书生成与验证

use picky::x509::certificate::{Certificate, CertificateBuilder, Name};
use picky::key::PrivateKey;
use picky::hash::HashAlgorithm;
use picky::signature::SignatureAlgorithm;
use time::{Duration, OffsetDateTime};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成RSA密钥对
    let private_key = PrivateKey::generate_rsa(2048)?;
    let public_key = private_key.to_public_key();

    // 创建证书主题名称
    let subject = Name::new_builder()
        .country("CN")
        .organization("Example Inc")
        .common_name("example.com")
        .build()?;

    // 设置证书有效期(当前时间到1年后)
    let valid_from = OffsetDateTime::now_utc();
    let valid_to = valid_from + Duration::days(365);

    // 创建X.509证书
    let cert = CertificateBuilder::new()
        .validity(valid_from, valid_to)
        .self_signed(
            &subject,
            SignatureAlgorithm::RsaPkcs1v15Sha256,
            &private_key,
        )?
        .build();

    // 导出PEM格式的证书
    let cert_pem = cert.to_pem_str()?;
    println!("Certificate:\n{}", cert_pem);

    // 验证证书签名
    let is_valid = cert.verify_signature(&public_key)?;
    println!("Certificate signature is valid: {}", is_valid);

    Ok(())
}

完整示例:HTTP消息签名

use picky::http::{
    HttpMessageSigner, HttpMessageVerifier, HttpMessage, HttpSignatureAlgorithm
};
use picky::key::PrivateKey;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成RSA密钥对
    let private_key = PrivateKey::generate_rsa(2048)?;
    let public_key = private_key.to_public_key();

    // 创建HTTP消息
    let mut message = HttpMessage::new();
    message.insert_header("Host", "example.com");
    message.insert_header("Date", "Tue, 20 Apr 2021 02:07:55 GMT");
    message.set_body(b"Hello, world!");

    // 创建签名器
    let signer = HttpMessageSigner::new(
        HttpSignatureAlgorithm::RsaPkcs1v15Sha256,
        "key1",
        &private_key,
    );

    // 签名HTTP消息
    signer.sign(&mut message)?;
    println!("Signed message:\n{:?}", message);

    // 创建验证器
    let verifier = HttpMessageVerifier::new(&public_key);

    // 验证签名
    let is_valid = verifier.verify(&message)?;
    println!("Signature is valid: {}", is_valid);

    Ok(())
}

许可证

picky采用MIT或Apache-2.0双许可证发布。


1 回复

Rust加密与解密库picky的使用指南

picky库简介

picky是一个Rust实现的加密与数据处理库,提供了高效且安全的加密算法实现。它支持多种加密标准和协议,包括X.509证书、PKCS#7/CMS、PKCS#8、PKCS#12等,适用于需要数据加密、签名验证和安全通信的场景。

主要特性

  • 支持RSA、EC等非对称加密算法
  • 支持AES、3DES等对称加密算法
  • 支持X.509证书处理
  • 支持PKCS#7/CMS加密消息语法
  • 支持PKCS#8私钥格式
  • 支持PKCS#12个人身份交换格式
  • 提供ASN.1 DER编解码功能

安装方法

在Cargo.toml中添加依赖:

[dependencies]
picky = "7.0"

基本使用方法

1. 生成RSA密钥对

use picky::key::PrivateKey;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成2048位的RSA私钥
    let private_key = PrivateKey::generate_rsa(2048)?;
    
    // 导出PEM格式的私钥
    let pem_private_key = private_key.to_pem_str()?;
    println!("Private Key:\n{}", pem_private_key);
    
    // 获取对应的公钥
    let public_key = private_key.to_public_key();
    let pem_public_key = public_key.to_pem_str()?;
    println!("Public Key:\n{}", pem_public_key);
    
    Ok(())
}

2. 使用AES加密数据

use picky::crypto::aes::{Aes, AesMode, AesPadding};
use picky::crypto::encoding::Base64;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key = b"0123456789abcdef0123456789abcdef"; // 256-bit key
    let iv = b"1234567890abcdef"; // 16-byte IV
    
    let plaintext = "Hello, picky!";
    
    // 创建AES-CBC加密器
    let aes = Aes::new(AesMode::Cbc, key, Some(iv, AesPadding::Pkcs7)?;
    
    // 加密数据
    let ciphertext = aes.encrypt(plaintext.as_bytes())?;
    println!("Ciphertext (Base64): {}", Base64::encode_string(&ciphertext));
    
    // 解密数据
    let decrypted = aes.decrypt(&ciphertext)?;
    println!("Decrypted: {}", String::from_utf8(decrypted)?);
    
    Ok(())
}

3. 处理X.509证书

use picky::x509::certificate::Cert;
use picky::hash::HashAlgorithm;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成自签名证书
    let cert = Cert::new_self_signed(
        "CN=example.com,O=Example Inc,C=US".parse()?,
        &HashAlgorithm::SHA256,
        365,
    )?;
    
    // 导出PEM格式的证书
    let pem_cert = cert.to_pem()?;
    println!("Certificate:\n{}", pem_cert);
    
    // 验证证书签名
    let is_valid = cert.verify_signature()?;
    println!("Certificate signature valid: {}", is_valid);
    
    Ok(())
}

4. 使用PKCS#7加密消息

use picky::p7::P7Builder;
use picky::key::PrivateKey;
use picky::x509::certificate::Cert;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 假设我们已经有一个证书和私钥
    let cert = Cert::new_self_signed("CN=example.com".parse()?, &HashAlgorithm::SHA256, 365)?;
    let private_key = PrivateKey::generate_rsa(2048)?;
    
    let message = b"Secret message";
    
    // 创建PKCS#7加密消息
    let p7 = P7Builder::new()
        .content(message.to_vec())
        .signer(&cert, &private_key)?
        .build()?;
    
    // 序列化为DER格式
    let der = p7.to_der()?;
    println!("PKCS#7 message length: {} bytes", der.len());
    
    Ok(())
}

高级功能

处理PKCS#12文件

use picky::pfx::Pfx;
use picky::key::PrivateKey;
use picky::x509::certificate::Cert;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建PKCS#12文件
    let cert = Cert::new_self_signed("CN=example.com".parse()?, &HashAlgorithm::SHA256, 365)?;
    let private_key = PrivateKey::generate_rsa(2048)?;
    let password = "strongpassword";
    
    let pfx = Pfx::new(&cert, &private_key, password)?;
    
    // 保存到文件
    let der = pfx.to_der()?;
    std::fs::write("identity.p12", &der)?;
    
    // 从文件加载
    let loaded_pfx = Pfx::from_der(&der, password)?;
    println!("Loaded certificate: {:?}", loaded_pfx.certificate());
    
    Ok(())
}

安全注意事项

  1. 始终使用强密码保护私钥
  2. 定期轮换加密密钥
  3. 在生产环境中使用足够长的密钥长度(至少2048位RSA或256位AES)
  4. 安全地存储和传输密钥材料
  5. 使用适当的初始化向量(IV)进行对称加密

picky库提供了强大的加密功能,但正确使用这些功能需要理解基本的密码学概念。建议在使用前阅读相关算法的文档和最佳实践。

回到顶部