【发布时间】:2019-01-26 10:39:11
【问题描述】:
我正在使用使用 Java 开发的第三方 API。它需要使用给定的 RSA 私钥加密数据以生成签名。但是 C# 中的 'RSACryptoServiceProvider' 只允许使用公钥加密。
到目前为止,我已经尝试使用“BouncyCastle”来使用私钥加密数据。但是 API 响应有错误。它说,'verify signature failed'。
解决这个问题很热,有什么想法吗?
顺便说一句: 我使用下面的代码将 Java 私钥转换为 C# xml 私钥。这对吗?
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(priKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
【问题讨论】:
-
你确定它是“用私钥加密的”吗?这听起来很不寻常。
-
是的,我知道不推荐 RSA 加密。但是我使用的第三方API,需要这一步来生成签名。
-
我将傲慢地假设一个沟通/理解问题,并建议你可能想要签名而不是加密它,这可能值得阅读stackoverflow.com/questions/8437288/…
-
见下面这行代码 [Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));] frommsdn : docs.microsoft.com/en-us/dotnet/api/… 私钥是唯一的密钥,可以随机生成或来自用户输入。大多数 MSDN 示例使用随机生成的私钥。 MSDN 应该显示用户输入固定键的示例。以下网页显示必须从整数构造私钥:docs.microsoft.com/en-us/dotnet/api/…
标签: c# .net encryption private-key