阅读C#和Bouncy Castle的RSA PrivateKey

我已成功使用OpenSSL格式写入公钥和私钥文件。

文件:

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpHCHYgawzNlxVebSKXL7vfc/i hP+dQgMxlaPEi7/vpQtV2szHjIP34MnUKelXFuIETJjOgjWAjTTJoj38MQUWc3u7 SRXaGVggqQEKH+cRi5+UcEObIfpi+cIyAm9MJqKabfJK2e5X/OS7FgAwPjgtDbZO ZxamOrWWL8KGB+lH+QIDAQAB -----END PUBLIC KEY----- -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCpHCHYgawzNlxVebSKXL7vfc/ihP+dQgMxlaPEi7/vpQtV2szH jIP34MnUKelXFuIETJjOgjWAjTTJoj38MQUWc3u7SRXaGVggqQEKH+cRi5+UcEOb Ifpi+cIyAm9MJqKabfJK2e5X/OS7FgAwPjgtDbZOZxamOrWWL8KGB+lH+QIDAQAB AoGBAIXtL6jFWVjdjlZrIl4JgXUtkDt21PD33IuiVKZNft4NOWLu+wp17/WZYn3S C2fbSXfaKZIycKi0K8Ab6zcUo0+QZKMoaG5GivnqqTPVAuZchkuMUSVgjGvKAC/D 12/b+w+Shs9pvqED1CxfvtePXNwL6ZNuaREFC5hF/YpMVyg5AkEA3BUCZYJ+Ec96 2cwsdY6HocW8Kn+RIqMjkNtyLA19cQV5mpIP7kAiW6drBDlraVANi+5AgK2zQ+ZT hYzs/JfRKwJBAMS1g5/B7XXnfC6VTRs8AMveZudi5wS/aGpaApybsfx1NTLLsm3l GmGTkbCr+EPzvJ5zRSIAHAA6N6NdORwzEWsCQHTli+JTD5dyNvScaDkAvbYFi06f d32IXYnBpcEUYT65A8BAOMn5ssYwBL23qf/ED431vLkcig1Ut6RGGFKKaQUCQEfa UdkSWm39/5N4f/DZyySs+YO90csfK8HlXRzdlnc0TRlf5K5VyHwqDkatmoMfzh9G 1dLknVXL7jTjQZA2az8CQG0jRSQ599zllylMPPVibW98701Mdhb1u20p1fAOkIrz +BNEdOPqPVIyqIP830nnFsJJgTG2eKB59ym+ypffRmA= -----END RSA PRIVATE KEY----- 

公钥当然只包含公钥部分。

使用公钥加密我的消息后。 我想读取私钥文件并解密它,但它不起作用。 我正在尝试读取私钥,因为无法将对象强制转换为不对称密钥。

这是我的代码:

 public static AsymmetricKeyParameter ReadAsymmetricKeyParameter(string pemFilename) { var fileStream = System.IO.File.OpenText(pemFilename); var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(fileStream); var KeyParameter = (Org.BouncyCastle.Crypto.AsymmetricKeyParameter)pemReader.ReadObject(); return KeyParameter; } static void Encrypt2(string publicKeyFileName, string inputMessage, string encryptedFileName) { UTF8Encoding utf8enc = new UTF8Encoding(); FileStream encryptedFile = null; try { // Converting the string message to byte array byte[] inputBytes = utf8enc.GetBytes(inputMessage); // RSAKeyPairGenerator generates the RSA Key pair based on the random number and strength of key required /*RsaKeyPairGenerator rsaKeyPairGnr = new RsaKeyPairGenerator(); rsaKeyPairGnr.Init(new Org.BouncyCastle.Crypto.KeyGenerationParameters(new SecureRandom(), 512)); Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair = rsaKeyPairGnr.GenerateKeyPair(); */ AsymmetricKeyParameter publicKey = ReadAsymmetricKeyParameter(publicKeyFileName); // Creating the RSA algorithm object IAsymmetricBlockCipher cipher = new RsaEngine(); // Initializing the RSA object for Encryption with RSA public key. Remember, for encryption, public key is needed cipher.Init(true, publicKey); //Encrypting the input bytes byte[] cipheredBytes = cipher.ProcessBlock(inputBytes, 0, inputMessage.Length); //Write the encrypted message to file // Write encrypted text to file encryptedFile = File.Create(encryptedFileName); encryptedFile.Write(cipheredBytes, 0, cipheredBytes.Length); } catch (Exception ex) { // Any errors? Show them Console.WriteLine("Exception encrypting file! More info:"); Console.WriteLine(ex.Message); } finally { // Do some clean up if needed if (encryptedFile != null) { encryptedFile.Close(); } } } 

这是解密function。 第二个是没有使用Bouncy Castle,但是,我宁愿使用Bouncy Castle,因为我将在Java中加密和解密。

 static void Decrypt2(string privateKeyFileName, string encryptedFileName, string plainTextFileName) { UTF8Encoding utf8enc = new UTF8Encoding(); FileStream encryptedFile = null; StreamWriter plainFile = null; byte[] encryptedBytes = null; string plainText = ""; try { // Converting the string message to byte array //byte[] inputBytes = utf8enc.GetBytes(inputMessage); // RSAKeyPairGenerator generates the RSA Key pair based on the random number and strength of key required /*RsaKeyPairGenerator rsaKeyPairGnr = new RsaKeyPairGenerator(); rsaKeyPairGnr.Init(new Org.BouncyCastle.Crypto.KeyGenerationParameters(new SecureRandom(), 512)); Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair = rsaKeyPairGnr.GenerateKeyPair(); */ StreamReader sr = File.OpenText(privateKeyFileName); PemReader pr = new PemReader(sr); PemReader pemReader = new PemReader(new StringReader(privateKeyFileName)); AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject(); Console.WriteLine(keyPair.ToString()); AsymmetricKeyParameter privatekey = keyPair.Private; Console.WriteLine(pr.ReadPemObject()); AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject(); AsymmetricKeyParameter privateKey = ReadAsymmetricKeyParameter(privateKeyFileName); // Creating the RSA algorithm object IAsymmetricBlockCipher cipher = new RsaEngine(); Console.WriteLine("privateKey: " + privateKey.ToString()); // Initializing the RSA object for Decryption with RSA private key. Remember, for decryption, private key is needed //cipher.Init(false, KeyPair.Private); //cipher.Init(false, KeyPair.Private); cipher.Init(false, keyPair.Private); // Read encrypted text from file encryptedFile = File.OpenRead(encryptedFileName); encryptedBytes = new byte[encryptedFile.Length]; encryptedFile.Read(encryptedBytes, 0, (int)encryptedFile.Length); //Encrypting the input bytes //byte[] cipheredBytes = cipher.ProcessBlock(inputBytes, 0, inputMessage.Length); byte[] cipheredBytes = cipher.ProcessBlock(encryptedBytes, 0, encryptedBytes.Length); //Write the encrypted message to file // Write encrypted text to file plainFile = File.CreateText(plainTextFileName); plainText = Encoding.Unicode.GetString(cipheredBytes); plainFile.Write(plainText); } catch (Exception ex) { // Any errors? Show them Console.WriteLine("Exception encrypting file! More info:"); Console.WriteLine(ex.Message); } finally { // Do some clean up if needed if (plainFile != null) { plainFile.Close(); } if (encryptedFile != null) { encryptedFile.Close(); } } } // Decrypt a file static void Decrypt(string privateKeyFileName, string encryptedFileName, string plainFileName) { // Variables CspParameters cspParams = null; RSACryptoServiceProvider rsaProvider = null; StreamReader privateKeyFile = null; FileStream encryptedFile = null; StreamWriter plainFile = null; string privateKeyText = ""; string plainText = ""; byte[] encryptedBytes = null; byte[] plainBytes = null; try { // Select target CSP cspParams = new CspParameters(); cspParams.ProviderType = 1; // PROV_RSA_FULL //cspParams.ProviderName; // CSP name rsaProvider = new RSACryptoServiceProvider(cspParams); // Read private/public key pair from file privateKeyFile = File.OpenText(privateKeyFileName); privateKeyText = privateKeyFile.ReadToEnd(); // Import private/public key pair rsaProvider.FromXmlString(privateKeyText); // Read encrypted text from file encryptedFile = File.OpenRead(encryptedFileName); encryptedBytes = new byte[encryptedFile.Length]; encryptedFile.Read(encryptedBytes, 0, (int)encryptedFile.Length); // Decrypt text plainBytes = rsaProvider.Decrypt(encryptedBytes, false); // Write decrypted text to file plainFile = File.CreateText(plainFileName); plainText = Encoding.Unicode.GetString(plainBytes); plainFile.Write(plainText); } catch (Exception ex) { // Any errors? Show them Console.WriteLine("Exception decrypting file! More info:"); Console.WriteLine(ex.Message); } finally { // Do some clean up if needed if (privateKeyFile != null) { privateKeyFile.Close(); } if (encryptedFile != null) { encryptedFile.Close(); } if (plainFile != null) { plainFile.Close(); } } } // Decrypt 

任何帮助将不胜感激!

我想出来了。 基本上使用BouncyCastle和C#读取私有openssl密钥是这样的:

 static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName) { AsymmetricCipherKeyPair keyPair; using (var reader = File.OpenText(privateKeyFileName)) keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); return keyPair.Private; } 

然后,此密钥可用于解密数据,如下所示:

 AsymmetricKeyParameter key = readPrivateKey(pemFilename); RsaEngine e = new RsaEngine(); e.Init(false, key); byte[] decipheredBytes = e.ProcessBlock(cipheredData, 0, cipheredData.Length);