使用模数和指数的C#中的RSA / ECB / PKCS1Padding解密

时间:2015-01-08 08:04:32

标签: java c# .net cryptography rsa

我有来自java服务器的加密值。我需要解密它。该服务的文档为我提供了以下解密算法,提供者将向我发送“m”和“e”值:

Java代码:

private  String RSA_Decryption(String encryptedData) 
        throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException,     IOException, IllegalBlockSizeException, BadPaddingException, GeneralSecurityException 
{
    BigInteger m = new BigInteger("verylongnumber1");
    BigInteger e = new BigInteger("verylongnumber2");

    RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
    KeyFactory fact = KeyFactory.getInstance("RSA");
    PrivateKey privateKey = fact.generatePrivate(keySpec);

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
    byte[] decValue = cipher.doFinal(decordedValue);
    String decryptedValue = new String(decValue, "UTF-8");

    return decryptedValue;     
}

我需要在C#中转换它。到目前为止,我尝试了以下 C#代码(使用.NET中的BigInteger类):

string m = "verylongnumber1";
string e = "verylongnumber2";

RSAParameters info = new RSAParameters();
var modulus = BigInteger.Parse(m).ToByteArray();
if (modulus.Length == 129) Array.Resize(ref modulus, 128); // it gives me 129 characters, the last being 0

var exponent = BigInteger.Parse(e).ToByteArray();

info.Modulus = modulus.Reverse().ToArray();
info.D = exponent.Reverse().ToArray();

var encryptedData = Convert.FromBase64String(@"gEQwzXpaARzC2pz9ahiyji8G/K9xecMzh6qi7hMmih4kR4hBwwjfcX83lNet91/hzHX9if1XwAe7/fO5xgXR8qLY+sZu9mj+iXiaSgYyQO3VyxcMD6q/wiVBXpOCX/LmG6qCVbFgn6LZvvcx9fUjVEn3FJFpqUhQh9PvNjmg8ks=");

var decryptedValue = this.Decrypt(encryptedData, info);
string decryptedBarcode = Encoding.Default.GetString(decryptedValue);

byte[] decryptedBytes;
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider())
{
    rsa1.ImportParameters(info); // throws exception with "Bad data" message
    decryptedBytes = rsa1.Decrypt(encryptedData, false);
}

但是,当我想在rsa1实例中导入keyInfo时,我收到“Bad Data”消息的异常。

我也尝试过:

  • 设置info.Exponent而不是info.D
  • 使用Chew Keong提供的BigInteger类和getBytes方法获取模数和指数的字节数(同样,使用和不使用反向设置info.Exponent和info.D中的数组)。

“Bad Data”消息导致同样的异常。

任何人都可以帮我将这个java代码翻译成C#等价物吗?

1 个答案:

答案 0 :(得分:1)

遗憾的是,标准的RSACryptoServiceProvider并不适合这种特殊情况......请亲自看看:

如果您尝试导入RSAParameters,则有几个字段可供您填写......

模数...你的密钥对的公共模数... m在你的情况下 指数...公共指数...公钥的一部分,用于加密

D ...私有指数...私钥的一部分,用于解密,e在您的情况下

P和Q ......密钥对的2个主要部分...... P * Q =模数
DP和DQ ......数学捷径的中间值(中国剩余定理),用于更快的解密方式

所以...你得到了模数和私有指数......虽然这通常足以解密,但它不是完整的密钥对...... P和Q都缺失了...... P和Q我们可以计算其余的......

RSACryptoServiceProvider希望你提供完整的密钥对,如果你想要解密...一个缺失的值,你会得到那个令人讨厌的加密版本告诉你"坏数据"

哎呀......一切都输了吗?不...前段时间还有另外一个关于RSA的问题,我写了一些只使用大整数处理RSA的行,而且根本没有RSACryptoServiceProvider ... Public key encryption with RSACryptoServiceProvider

也许这可以帮助您解密您的价值