【问题标题】:RSA Cryptography with raw keys, c#带有原始密钥的 RSA 加密,c#
【发布时间】:2017-08-31 19:48:40
【问题描述】:

我得到了一个 256 字节的模数 ('n')、一个 256 字节的私有指数 ('d') 和一个 3 字节的 {1,0,1} 公共指数 ('e')。我正在尝试对 32 个字节的数据进行签名。

我已经尝试创建一个新的 RSAParameters。

byte[] n = new byte[256]; //populated in my code 
byte[] d = new byte[256]; //populated in my code
byte[] e = new byte[]{1,0,1}; 
byte[] junkData = new byte[32]; //populated in my code

RSAParameters rsaParam = new RSAParameters();
rsaParam.Modulus = n;
rsaParam.Exponent = e;
rsaParam.D = d;

然后我创建一个 RSACrytoServiceProvider,将参数导入其中,并尝试对数据进行签名。

var csp = new RSACryptoServiceProvider(2048);
csp.ImportParameters(rsaParam);
csp.SignData(junkData, new SHA1CryptoServiceProvider());

问题在于 RSACryptoServiceProvider 似乎只是公开的,当我尝试签名时收到“密钥集不存在”加密异常。

我是否还需要 P 和 Q 元素来正确签署数据,还是我在做一些明显错误的事情?感谢您的帮助!

【问题讨论】:

  • 我怀疑 csp 希望 P & Q 和 np 和 nq 用中国剩余定理简化签名和解密操作......节省了几个周期,但需要更多的 N、d 和 e
  • ...aaand 当然我忘了提到 q_inv ...

标签: c# cryptography rsa


【解决方案1】:

我很惊讶 ImportParameters 没有抛出(你在使用 Mono 吗?)。

RSACryptoServiceProvider(以及 .NET Framework 和 .NET Core 中的所有 RSA 实现)需要一个完全填充的 RSAParameters 结构用于私钥。

https://stackoverflow.com/a/42117655/6535399 给出了更详细的答案。

【讨论】:

  • 这在我看来就像是复制品。我错了吗?为什么你又提供了一个非常相似的答案?
  • 我同意它有一个重复的答案,但是这两个问题通过不同的方式发现了问题。不过,我想被标记为欺骗会离开转发链接......
  • 如果您转到留下原始答案的问题,您会看到它在元问题和全局问题正下方的右侧面板中链接了此问题。
  • 我在 Windows PC 上的 Visual Studio 中使用 .net 4.6。在我尝试签署数据之前,我没有收到任何错误。导入很好,尽管只是一个“公共”密钥。添加其余条款提供了获取私钥的详细信息,并允许我按预期签署数据。
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2012-06-26
相关资源
最近更新 更多