ChatgpetSuggest.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using System.IO;
  3. using System.Security.Cryptography;
  4. using Org.BouncyCastle.OpenSsl;
  5. using Org.BouncyCastle.Crypto;
  6. using Org.BouncyCastle.Crypto.Operators;
  7. using Org.BouncyCastle.Crypto.Engines;
  8. using Org.BouncyCastle.Security;
  9. using Org.BouncyCastle.Crypto.Parameters;
  10. using System.Text;
  11. public class RSAExample
  12. {
  13. public static void Main()
  14. {
  15. // 讀取並載入私鑰和公鑰
  16. RSA rsaGen = RSA.Create();
  17. RSAParameters privateKeyParameters = rsaGen.ExportParameters(true);
  18. RSAParameters publicKeyParameters = rsaGen.ExportParameters(false);
  19. //RSAParameters privateKeyParameters = LoadPrivateKey("private_key.pem");
  20. //RSAParameters publicKeyParameters = LoadPublicKey("public_key.pem");
  21. var aes = Aes.Create();
  22. var buffer = new MemoryStream();
  23. CryptoStream cryptoStream = new CryptoStream(
  24. buffer,
  25. aes.CreateEncryptor(),
  26. CryptoStreamMode.Write);
  27. StreamWriter sw = new StreamWriter(cryptoStream);
  28. sw.Write("this is the message");
  29. sw.Close();
  30. var key = aes.Key;
  31. var iv = aes.IV;
  32. var encoded = buffer.ToArray();
  33. var aesDecrept = Aes.Create();
  34. aesDecrept.Key = key;
  35. aesDecrept.IV = iv;
  36. var toDecryptStream = new MemoryStream(encoded);
  37. CryptoStream deCryptoStream = new CryptoStream(
  38. toDecryptStream,
  39. aesDecrept.CreateDecryptor(),
  40. CryptoStreamMode.Read);
  41. StreamReader sr = new StreamReader(deCryptoStream);
  42. var deceypedString = sr.ReadToEnd();
  43. // 創建 RSA 實例
  44. using (RSA rsa = RSA.Create())
  45. {
  46. rsa.ImportParameters(privateKeyParameters);
  47. // 用私鑰加密數據
  48. byte[] dataToEncrypt = System.Text.Encoding.UTF8.GetBytes("This is a secret message");
  49. byte[] encryptedData = rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256);
  50. Console.WriteLine("Encrypted Data (Base64): " + Convert.ToBase64String(encryptedData));
  51. rsa.ImportParameters(publicKeyParameters);
  52. // 用公鑰解密數據
  53. byte[] decryptedData = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);
  54. string decryptedMessage = System.Text.Encoding.UTF8.GetString(decryptedData);
  55. Console.WriteLine("Decrypted Message: " + decryptedMessage);
  56. }
  57. }
  58. private static RSAParameters LoadPrivateKey(string filePath)
  59. {
  60. using (StreamReader reader = new StreamReader(filePath))
  61. {
  62. PemReader pemReader = new PemReader(reader);
  63. AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
  64. RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
  65. return DotNetUtilities.ToRSAParameters(privateKey);
  66. }
  67. }
  68. private static RSAParameters LoadPublicKey(string filePath)
  69. {
  70. using (StreamReader reader = new StreamReader(filePath))
  71. {
  72. PemReader pemReader = new PemReader(reader);
  73. RsaKeyParameters publicKey = (RsaKeyParameters)pemReader.ReadObject();
  74. return DotNetUtilities.ToRSAParameters(publicKey);
  75. }
  76. }
  77. }
  78. public static class DotNetUtilities
  79. {
  80. public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privateKey)
  81. {
  82. return new RSAParameters
  83. {
  84. Modulus = privateKey.Modulus.ToByteArrayUnsigned(),
  85. Exponent = privateKey.PublicExponent.ToByteArrayUnsigned(),
  86. D = privateKey.Exponent.ToByteArrayUnsigned(),
  87. P = privateKey.P.ToByteArrayUnsigned(),
  88. Q = privateKey.Q.ToByteArrayUnsigned(),
  89. DP = privateKey.DP.ToByteArrayUnsigned(),
  90. DQ = privateKey.DQ.ToByteArrayUnsigned(),
  91. InverseQ = privateKey.QInv.ToByteArrayUnsigned()
  92. };
  93. }
  94. public static RSAParameters ToRSAParameters(RsaKeyParameters publicKey)
  95. {
  96. return new RSAParameters
  97. {
  98. Modulus = publicKey.Modulus.ToByteArrayUnsigned(),
  99. Exponent = publicKey.Exponent.ToByteArrayUnsigned()
  100. };
  101. }
  102. }