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(())
}
安全注意事项
- 始终使用强密码保护私钥
- 定期轮换加密密钥
- 在生产环境中使用足够长的密钥长度(至少2048位RSA或256位AES)
- 安全地存储和传输密钥材料
- 使用适当的初始化向量(IV)进行对称加密
picky库提供了强大的加密功能,但正确使用这些功能需要理解基本的密码学概念。建议在使用前阅读相关算法的文档和最佳实践。