RSA 通常的用法是 公鑰加密嚼摩,私鑰解密枕面,這種方式適用于數(shù)據(jù)保密性場景潮秘。而 私鑰加密枕荞,公鑰解密 是非對(duì)稱加密的一種反向操作矗烛,通常用于 數(shù)字簽名 場景虱而。它的目的不是保護(hù)數(shù)據(jù)隱私峦耘,而是驗(yàn)證數(shù)據(jù)的完整性和來源买优。
簡言之: 公鑰加密杀赢,私鑰解密烘跺; 私鑰簽名,公鑰驗(yàn)證脂崔。
1.前提:
1液荸、服務(wù)器持有私鑰,客戶端使用證書(公鑰)進(jìn)行驗(yàn)證脱篙。
2娇钱、生成自簽名證書和私鑰,可用下列指令進(jìn)行配對(duì)校驗(yàn):
# 這兩個(gè)md5如果一致绊困,則說明兩個(gè)文件匹配
openssl rsa -noout -modulus -in certificate.key| openssl md5
openssl x509 -noout -modulus -in certificate.crt| openssl md5
3文搂、關(guān)于填充:
2.具體過程:
rsa = { version = "0.9.6", features = ["pem", "sha2"] }
x509-parser = "0.16.0"
sha2 = "0.10.8"
rand = "0.8.5"
use std::fs;
use rsa::pkcs8::{DecodePrivateKey, DecodePublicKey};
use rsa::Pkcs1v15Sign;
use rsa::{RsaPrivateKey, RsaPublicKey};
use sha2::{Digest, Sha256};
use x509_parser::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 讀取包含 RSA 私鑰的 PEM 文件
let private_key_pem = fs::read_to_string("src/rsa/certificate.key").expect("1");
let private_key = RsaPrivateKey::from_pkcs8_pem(&private_key_pem).unwrap();
println!("RSA 私鑰成功加載!");
// 讀取 X.509 證書文件
let cert_pem = fs::read_to_string("src/rsa/certificate.crt").expect("2");
let (_, pem) = parse_x509_pem(cert_pem.as_bytes()).expect("3");
let (_, cert) = X509Certificate::from_der(&pem.contents).expect("4");
// 提取公鑰信息
let public_key_der = cert.public_key().raw.to_owned();
let public_key = RsaPublicKey::from_public_key_der(&public_key_der).expect("5");
println!("公鑰成功加載秤朗!");
// 要加密的數(shù)據(jù)
let message = b"Hello, RSA Encryption!";
println!("原始數(shù)據(jù): {:?}", String::from_utf8_lossy(message));
let mut hasher = Sha256::new();
hasher.update(message);
let msg_hash = hasher.finalize();
println!("原始消息哈希: {:?}", msg_hash);
// 使用私鑰簽名
let padding = Pkcs1v15Sign::new::<Sha256>();
let sig_data = private_key.sign(padding, &msg_hash).expect("6");
println!("簽名數(shù)據(jù): {:?}", sig_data);
// 使用公鑰驗(yàn)證
let padding2 = Pkcs1v15Sign::new::<Sha256>();
match public_key.verify(padding2, &msg_hash, &sig_data) {
Ok(_) => println!("簽名驗(yàn)證成功"),
Err(e) => {
println!("簽名驗(yàn)證失敗: {:?}", e.to_string())
}
}
Ok(())
}