如何在 C# 中使用 RSA 私钥加密数据

我正在使用用 Java 开发的第三方 API。它需要使用给定的 RSA 私钥加密数据以生成签名。但是RSACryptoServiceProvider'C# 中的'只允许通过公钥加密。


到目前为止,我已经尝试使用“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()));


慕雪6442864
浏览 221回答 2
2回答

临摹微笑

我想你必须使用:用于解密加密数据或签署数据的私钥,以及用于加密数据或验证签名的公钥。

一只名叫tom的猫

在非对称密码学中,使用私钥进行加密充当签名:每个人都可以验证您是否已使用您的公钥进行签名,但只有您可以使用您的私钥进行签名(请参阅https://en.wikipedia.org/wiki/Public -key_cryptography#Digital_signatures)。显然,您必须保留一对专用于此目的的密钥。使用 BouncyCastle 库,您可以使用 RsaEngine 实现此结果:using Org.BouncyCastle.Crypto;using Org.BouncyCastle.Crypto.Engines;&nbsp; &nbsp;&nbsp;public void Test(){&nbsp; &nbsp; RsaEngine engine;&nbsp; &nbsp; AsymmetricKeyParameter key;&nbsp; &nbsp; bool forEncryption;&nbsp; &nbsp; int chunkPosition = 0;&nbsp; &nbsp; int i = 0;&nbsp; &nbsp; int blockSize;&nbsp; &nbsp; int chunkSize;&nbsp; &nbsp; List<byte> output = new List<byte>();&nbsp; &nbsp; byte[] byteMessageArray;&nbsp; &nbsp; // Initialize key variable with your public or private key&nbsp; &nbsp; // Initialize byteMessageArray with your message to be encrypted or decrypted&nbsp; &nbsp; // Set forEncryption variable value&nbsp;&nbsp; &nbsp; engine = new RsaEngine();&nbsp; &nbsp; engine.Init(forEncryption, key);&nbsp; &nbsp; blockSize = engine.GetInputBlockSize();&nbsp; &nbsp; while ((chunkPosition < byteMessageArray.Length))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; chunkSize = Math.Min(blockSize, byteMessageArray.Length - (i * blockSize));&nbsp; &nbsp; &nbsp; &nbsp; output.AddRange(engine.ProcessBlock(byteMessageArray, chunkPosition, chunkSize));&nbsp; &nbsp; &nbsp; &nbsp; chunkPosition = (chunkPosition + blockSize);&nbsp; &nbsp; &nbsp; &nbsp; i += 1;&nbsp; &nbsp; }&nbsp; &nbsp; //Now in output you have messagge encrypted or decrypted with your private or public key}
打开App,查看更多内容
随时随地看视频慕课网APP