相当于 openssl rsautl -decrypt -oaep -inkey xx.pem -in cyphertext.enc -out plaintex.txt 的解密

decryption equivalent of openssl rsautl -decrypt -oaep -inkey xx.pem -in cyphertext.enc -out plaintex.txt

我可以使用 RSA 私钥解密 base64 编码的加密字符串(-----BEGIN RSA PRIVATE KEY----- ----MIIG4wIBAAKCAYEA1HZEO4eUxTjpA7eRzvs3Ew7tVQQ8i1zmr+ZpSooF+fVqm9VE ZVnE0WslHccLfkpoh8q+Zr3lpGqTtiEzlX9BmRN2y7VrrJV7HMGQCB2eO4dpUVCZ vcI/5OChdYsswlFS..... -----结束 RSA 私钥----- 使用 openssl

openssl rsautl -decrypt -oaep -inkey xx.pem -in cyphertext.enc -out plaintex.txt

我正尝试在 .net 中做同样的事情。 我使用 bouncycastle 尝试了以下操作:

string cyphertext = File.ReadAllText(@"data_encoded.txt");
                var bytesToDecrypt = Convert.FromBase64String(cyphertext); // string to decrypt, base64 encoded

            AsymmetricCipherKeyPair keyPair;
            using (var reader = File.OpenText(@"private_key.pem")) // file containing RSA PKCS1 private key
                keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();

var decryptEngine = new Pkcs1Encoding(new RsaEngine());
                decryptEngine.Init(true, keyPair.Private);
                var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length)); //input data too large

var engine = new RsaEngine();
                engine.Init(false, keyPair.Private);  
                var decrted = Encoding.UTF8.GetString(engine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length)); //produced corrupted data : [6��oe쩪\u0017^p/\u0003�`M-�?6\u0019w1�\u0012�d"

代码中有几个问题:

  • OpenSSL 语句将密文加载为二进制数据。因此,在C#代码中一定不能将密文加载为字符串再进行Base64解码,只需加载为二进制数据即可:

    byte[] bytesToDecrypt = File.ReadAllBytes(pathToCiphertextFile);
    

    但是,如果文件中的密文确实是Base64编码的,那么这是通过另一个OpenSSL语句实现的或之后完成的。在这种情况下,不需要更改。

  • 正如评论中已经提到的那样,填充是错误的。 OpenSSL 语句将 OAEP 与 SHA1 应用于两个摘要,因此 C# 代码也必须使用 OAEP 而不是 Pkcs1Encoding():

    var decryptEngine = new OaepEncoding(new RsaEngine(), new Sha1Digest(), new Sha1Digest(), null);
    
  • 为了解密,decryptEngine.Init() 中的第一个参数必须是 false 而不是 true:

    decryptEngine.Init(false, keyPair.Private);
    
  • var engine = new RsaEngine(); 中的所有行(包括 var engine = new RsaEngine();)对解密没有意义,必须删除。

通过这些更改,可以成功解密使用发布的 OpenSSL 语句生成的密文。