我可以解密base64編碼使用RSA私鑰加密字串(----- BEGIN RSA私鑰----- ---- MIIG4wIBAAKCAYEA1HZEO4eUxTjpA7eRzvs3Ew7tVQQ8i1zmr ZpSooF fVqm9VE ZVnE0WslHccLfkpoh8q Zr3lpGqTtiEzlX9BmRN2y7VrrJV7HMGQCB2eO4dpUVCZ VCI / 5OChdYsswlFS .... --- --END RSA PRIVATE KEY----- 使用 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"
uj5u.com熱心網友回復:
代碼中有幾個問題:
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();對解密都沒有意義,必須洗掉。
通過這些更改,可以成功解密使用發布的 OpenSSL 陳述句生成的密文。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398777.html
