相当于 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 语句生成的密文。
我可以使用 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 语句生成的密文。