有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Bouncy Castle的java C#RSA解密

我得到了一个Base64编码的加密字符串,它是使用Bouncy Castle在Java中加密的。下面是Java代码片段示例:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
byte[] encryptedText = cipher.doFinal("xxxxx|xxxxx".getBytes("UTF-8"));
String encodedText = new BASE64Encoder().encode(encryptedText);

我需要使用Bouncy Castle解密得到的字符串,但是在C语言中# 我收到了一段关于如何在Java中实现这一点的代码片段,但我无法将其转换为C#(原因是我们正在构建一个.net站点,它将成为Java站点中的一个iFrame。Java站点将把RSA加密字符串传递到.net站点)。要解密的Java代码示例如下:

Cipher cipherDec = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipherDec.init(Cipher.DECRYPT_MODE, key.getPrivate());
byte[] decodedText = new BASE64Decoder().decodeBuffer(encodedText);
byte[] decryptedText = cipherDec.doFinal(decodedText);
String finalValue = new String(decryptedText, "UTF-8");

我已经从http://www.bouncycastle.org/csharp/下载了这些示例,但似乎没有输入字符串值进行加密,然后进行加密/解密过程的示例

我得到了公共指数私人指数素数p素数q素数指数qcrt系数的值

我发现我可以使用以下方法:

IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine());
signer.Init(true, pubParameters);

但是signer对象似乎没有与上面的Java示例相同的方法

我唯一能用的方法是

ProcessBlock(byte[] inbuf, int inOff, int inLen);

但我不知道如何在我的上下文中使用它

这里的任何帮助都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    我不太明白你为什么要用Bouncycastle。下面的小代码片段显示了仅使用的RSA加密/解密示例。网络课程:

    using System;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace RsaForDotNet
    {
        class Program
        {
            static void Main(string[] args)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
                var encrypted_msg = rsa.Encrypt(Encoding.UTF8.GetBytes("Secret Data"), false);
                var encoded_msg = Convert.ToBase64String(encrypted_msg);
                Console.WriteLine(encoded_msg);
                var decoded_msg = Convert.FromBase64String(encoded_msg);
                var decrypted_msg = Encoding.UTF8.GetString(rsa.Decrypt(decoded_msg, false));
                Console.WriteLine(decrypted_msg);
            }
        }
    }
    
  2. # 2 楼答案

    为了帮助他人,要转换的最终代码如下:

    RsaKeyParameters privParameters = new RsaPrivateCrtKeyParameters(mod, pubExp, privExp, p, q, pExp, qExp, crtCoef);
    RsaKeyParameters pubParameters = new RsaKeyParameters(false, mod, pubExp);
    IAsymmetricBlockCipher eng = new Pkcs1Encoding(new RsaEngine());
    eng.Init(false, privParameters);
    byte[] encdata = System.Convert.FromBase64String("{the enc string}");
    encdata = eng.ProcessBlock(encdata, 0, encdata.Length);
    string result = Encoding.UTF8.GetString(encdata);
    

    mod、xp等都是大整数:

    static BigInteger mod = new BigInteger("big int value");
    

    需要以下using指令:

    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Crypto.Engines;
    using Org.BouncyCastle.Crypto.Encodings;
    using Org.BouncyCastle.Math;
    

    可从bouncycastle网站获取http://www.bouncycastle.org/csharp/