承上篇 DES 對稱加密,本文介紹 SHA1 雜湊 (單向) 與 RSA 非對稱加密的標準實作。
public static string Sha1Hash(string input)
{
using (var sha1 = SHA1.Create()) // 或 new SHA1CryptoServiceProvider()
{
byte[] data = Encoding.UTF8.GetBytes(input);
byte[] hash = sha1.ComputeHash(data);
return BitConverter.ToString(hash).Replace("-", "").ToLower(); // 40 字元十六進位
}
}
public class RsaCrypto
{
private readonly RSA _rsa;
public RsaCrypto(int keySize = 2048)
{
_rsa = RSA.Create(keySize);
}
// 匯出公開鑰 (供他方加密)
public RSAParameters ExportPublicKey() => _rsa.ExportParameters(false);
// 匯入公開鑰 (加密用)
public void ImportPublicKey(RSAParameters pubKey) => _rsa.ImportParameters(pubKey);
// 加密 (公開鑰)
public byte[] Encrypt(byte[] data, RSAEncryptionPadding padding = RSAEncryptionPadding.OaepSHA256)
=> _rsa.Encrypt(data, padding);
// 解密 (私鑰)
public byte[] Decrypt(byte[] cipher, RSAEncryptionPadding padding = RSAEncryptionPadding.OaepSHA256)
=> _rsa.Decrypt(cipher, padding);
// 簽名 (私鑰)
public byte[] Sign(byte[] data, HashAlgorithmName hash = HashAlgorithmName.SHA256, RSASignaturePadding padding = RSASignaturePadding.Pkcs1)
=> _rsa.SignData(data, hash, padding);
// 驗證 (公開鑰)
public bool Verify(byte[] data, byte[] signature, HashAlgorithmName hash = HashAlgorithmName.SHA256, RSASignaturePadding padding = RSASignaturePadding.Pkcs1)
=> _rsa.VerifyData(data, signature, hash, padding);
}
實務中 **RSA 僅加密對稱金鑰**,大量資料用 AES:
這正是 TLS/HTTPS、PGP、S/MIME、Signal 等協定的核心模式。