使用.NET和私有PEM和密码解密OpenSsl加密文件

问题描述

我喜欢将OpenSSL的外部过程调用更改为直接在C#中进行解密

string openSSLPath = Path.Combine(Directory.GetCurrentDirectory(),"openssl-1.0.2_win32","openssl.exe");
Process process = new Process();
processstartinfo startInfo = new processstartinfo
{
    FileName = openSSLPath,UseShellExecute = false,Arguments = $"smime -decrypt -stream -binary -aes-256-cbc -in \"{inputFilePath}\" -inform DER -out \"{outputFilePath}\" -inkey \"{privateKeyFilePath}\" -passin pass:\"{privateKeyPassword}\""
};
process.StartInfo = startInfo;
process.Start();

所以现在我切换到BouncyCastle:

asymmetricCipherKeyPair keyPair;
PemObject privKey;
System.Security.Cryptography.X509Certificates.PublicKey pk;
asymmetricKeyParameter akp;

using (var reader = File.OpenText(@"C:\PathTo\private_key.pem"))
{
    var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(reader,new PasswordFinder("myPassForPrivPem"));
    //var read = pemReader.Readobject();
    var pemObject = pemReader.ReadPemObject();

    akp = PublicKeyFactory.CreateKey(pemObject.Content); // this call currently causes System.ArgumentException illegal object in GestInstance
}

var decryptEngine = new Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding(new Org.BouncyCastle.Crypto.Engines.RSAEngine());
decryptEngine.Init(false,akp);

var encryptedBytes = File.ReadAllBytes(EncryptedFilePath);
var decrypted = decryptEngine.ProcessBlock(encryptedBytes,encryptedBytes.Length);
File.WriteallBytes(OutputFilePath,decrypted);

在读取PEM文件并正确转换或将正确的参数类型传递给解密函数后,我陷入了困境。

System.ArgumentException

对我来说,似乎成功读取了带有相应密码的PEM文件。但是如何将PemObject转换为asymmetricCipherKeyPairasymmetricKeyParameter

如果我使用Readobject()而不是ReadPemObject(),则会得到PemException InvalidCipherTextException:填充块已损坏。

PemException

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)