using System; using System.IO; using System.Security.Cryptography; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Operators; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; using System.Text; public class RSAExample { public static void Main() { // 讀取並載入私鑰和公鑰 RSA rsaGen = RSA.Create(); RSAParameters privateKeyParameters = rsaGen.ExportParameters(true); RSAParameters publicKeyParameters = rsaGen.ExportParameters(false); //RSAParameters privateKeyParameters = LoadPrivateKey("private_key.pem"); //RSAParameters publicKeyParameters = LoadPublicKey("public_key.pem"); var aes = Aes.Create(); var buffer = new MemoryStream(); CryptoStream cryptoStream = new CryptoStream( buffer, aes.CreateEncryptor(), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(cryptoStream); sw.Write("this is the message"); sw.Close(); var key = aes.Key; var iv = aes.IV; var encoded = buffer.ToArray(); var aesDecrept = Aes.Create(); aesDecrept.Key = key; aesDecrept.IV = iv; var toDecryptStream = new MemoryStream(encoded); CryptoStream deCryptoStream = new CryptoStream( toDecryptStream, aesDecrept.CreateDecryptor(), CryptoStreamMode.Read); StreamReader sr = new StreamReader(deCryptoStream); var deceypedString = sr.ReadToEnd(); // 創建 RSA 實例 using (RSA rsa = RSA.Create()) { rsa.ImportParameters(privateKeyParameters); // 用私鑰加密數據 byte[] dataToEncrypt = System.Text.Encoding.UTF8.GetBytes("This is a secret message"); byte[] encryptedData = rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256); Console.WriteLine("Encrypted Data (Base64): " + Convert.ToBase64String(encryptedData)); rsa.ImportParameters(publicKeyParameters); // 用公鑰解密數據 byte[] decryptedData = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256); string decryptedMessage = System.Text.Encoding.UTF8.GetString(decryptedData); Console.WriteLine("Decrypted Message: " + decryptedMessage); } } private static RSAParameters LoadPrivateKey(string filePath) { using (StreamReader reader = new StreamReader(filePath)) { PemReader pemReader = new PemReader(reader); AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject(); RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)keyPair.Private; return DotNetUtilities.ToRSAParameters(privateKey); } } private static RSAParameters LoadPublicKey(string filePath) { using (StreamReader reader = new StreamReader(filePath)) { PemReader pemReader = new PemReader(reader); RsaKeyParameters publicKey = (RsaKeyParameters)pemReader.ReadObject(); return DotNetUtilities.ToRSAParameters(publicKey); } } } public static class DotNetUtilities { public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privateKey) { return new RSAParameters { Modulus = privateKey.Modulus.ToByteArrayUnsigned(), Exponent = privateKey.PublicExponent.ToByteArrayUnsigned(), D = privateKey.Exponent.ToByteArrayUnsigned(), P = privateKey.P.ToByteArrayUnsigned(), Q = privateKey.Q.ToByteArrayUnsigned(), DP = privateKey.DP.ToByteArrayUnsigned(), DQ = privateKey.DQ.ToByteArrayUnsigned(), InverseQ = privateKey.QInv.ToByteArrayUnsigned() }; } public static RSAParameters ToRSAParameters(RsaKeyParameters publicKey) { return new RSAParameters { Modulus = publicKey.Modulus.ToByteArrayUnsigned(), Exponent = publicKey.Exponent.ToByteArrayUnsigned() }; } }