【发布时间】:2021-09-17 02:07:17
【问题描述】:
我正在尝试导出和重新导入公共和私人 RSA 密钥。我使用 System.Security.Cryptography.RSA 类来做到这一点。但它没有按预期工作。请假设以下代码示例
RSA rsa = RSA.Create();
File.WriteAllBytes("TestPrivateKey", rsa.ExportRSAPrivateKey());
File.WriteAllBytes("TestPublicKey", rsa.ExportRSAPublicKey());
rsa.ImportRSAPrivateKey(File.ReadAllBytes("TestPrivateKey"), out _);
rsa.ImportRSAPublicKey(File.ReadAllBytes("TestPublicKey"), out _);
string textToBeEncrypted = "Hello World";
byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(textToBeEncrypted);
byte[] encryptedBytes = rsa.Encrypt(bytesToBeEncrypted, RSAEncryptionPadding.OaepSHA256);
byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA256);
string result = Encoding.UTF8.GetString(decryptedBytes);
当我不使用导出和导入时,加密和解密工作正常。但是当我使用它们时,我得到一个 Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException 说明在 rsa.Decrypt 函数上找不到密钥。 我不是密码学专家,我知道还有其他方法可以实现我正在做的事情(有很多例子),但它们都有些复杂。这在这里看起来很简单。但为什么它不起作用?重新导入后key不应该一样吗?
【问题讨论】:
-
你调试过文件中的密钥吗?
-
“调试密钥”是什么意思?密钥是一段数据,而不是代码
-
第二次导入会覆盖第一次导入,因此只导入了公钥。因此,加密有效,解密失败。修复:加密后导入私钥。
-
关于您的倒数第二条评论:私钥也包含公钥,因此原则上也可以使用私钥进行加密。 Create() 使用私钥的信息生成一个密钥。因此,加密和解密无需导入和导入私钥即可工作。
-
@user9014097 有趣的问题和答案,你能从你的 cmets 中创建一个答案吗?就我个人而言,我总是使用单独的密码实例(在这种情况下为
rsa)进行加密和解密。这些密码实例几乎不包含任何状态,因此创建起来非常便宜;所有真实信息都在密钥中,而那些可以被重用。您可以每次创建一个新的rsa,只要立即导入,您就不会注意到任何性能差异。
标签: c# .net-core encryption rsa private-key