【问题标题】:How to encrypt data with RSA private key in C#如何在 C# 中使用 RSA 私钥加密数据
【发布时间】: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


【解决方案1】:

我想你必须使用:

  • 用于解密加密数据或签署数据的私钥,以及
  • 用于加密数据或验证签名的公钥。

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多