为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕雪6442864 2021-12-05 14:48:36
我正在使用用 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()));
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

我想你必须使用:

  • 用于解密加密数据或签署数据的私钥,以及

  • 用于加密数据或验证签名的公钥。


查看完整回答
反对 回复 2021-12-05
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

在非对称密码学中,使用私钥进行加密充当签名:每个人都可以验证您是否已使用您的公钥进行签名,但只有您可以使用您的私钥进行签名(请参阅https://en.wikipedia.org/wiki/Public -key_cryptography#Digital_signatures)。显然,您必须保留一对专用于此目的的密钥。


使用 BouncyCastle 库,您可以使用 RsaEngine 实现此结果:


using Org.BouncyCastle.Crypto;

using Org.BouncyCastle.Crypto.Engines;    


public void Test()

{

    RsaEngine engine;

    AsymmetricKeyParameter key;

    bool forEncryption;

    int chunkPosition = 0;

    int i = 0;

    int blockSize;

    int chunkSize;

    List<byte> output = new List<byte>();

    byte[] byteMessageArray;



    // Initialize key variable with your public or private key

    // Initialize byteMessageArray with your message to be encrypted or decrypted

    // Set forEncryption variable value 



    engine = new RsaEngine();

    engine.Init(forEncryption, key);

    blockSize = engine.GetInputBlockSize();


    while ((chunkPosition < byteMessageArray.Length))

    {

        chunkSize = Math.Min(blockSize, byteMessageArray.Length - (i * blockSize));

        output.AddRange(engine.ProcessBlock(byteMessageArray, chunkPosition, chunkSize));

        chunkPosition = (chunkPosition + blockSize);

        i += 1;

    }


    //Now in output you have messagge encrypted or decrypted with your private or public key

}


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信