【发布时间】:2021-05-06 13:15:26
【问题描述】:
我正在学习 .NET 中的密码学,我编写了以下函数作为测试:
byte[] foo(byte[] input, string keyContainerName)
{
CngKey key = CngKey.Open(keyContainerName);
RSACng rsa = new RSACng(key);
rsa.KeySize = 2048;
byte[] v = rsa.Encrypt(input, RSAEncryptionPadding.OaepSHA512);
CngKey keyb = CngKey.Open(keyContainerName);
RSACng rsab = new RSACng(keyb);
rsab.KeySize = 2048;
return rsab.Decrypt(v, RSAEncryptionPadding.OaepSHA512);
}
当我尝试执行它时,rsab.Decrypt() 抛出一个 Cryptographic 异常并显示消息:“参数不正确。”。
为什么会这样?我哪里做错了?
附:我之前使用CngKey.Create() 在KSP 中创建了一个密钥对。 foo 使用 keyContainerName 调用传递给 CngKey.Create() 的 keyName。
【问题讨论】:
-
您是通过编写自己的方法来试验 RSA 加密功能,还是想在某种应用程序中使用 RSA。在第二种情况下,更好的方法是使用像“ExpressSecurity”这样的加密库
-
我正在创建一个加密应用程序,它将为用户提供使用对称和非对称算法加密/解密文本消息(或文件)的能力(在后台,只有对称密钥会被加密)。我写的不对称方法不起作用,所以我开始测试。 '''foo''' 是对我不起作用的综合。 //编辑:我搜索了“ExpressSecurity”。我的应用程序是一个离线 .NET Framework Windows 窗体项目。它用于在本地加密/解密事物(使用其他方式发送)。
-
加密密钥和解密密钥必须相同。每次调用 new RSACng 时都会生成一个新密钥,因此您的解密密钥与加密密钥不同。
-
如果是这样的话,Key Storage Provider的作用是什么?
-
如果您预先创建的密钥是 2048 位,则分配 KeySize 属性最多不会执行任何操作。如果不是,请分配与您的密钥分离的属性并随机创建一个新的。