123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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()
- };
- }
- }
|