我有一个来自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”消息异常。
我也尝试过:
一切都导致带有“错误数据”消息的相同异常。
谁能帮我翻译成C#等价的Java代码吗?
不幸的是,标准的RSACryptoServiceProvider不适合这种特定情况...请自己看:
如果您尝试导入RSAParameters,则有几个字段供您填写...
模数...密钥对的通用模数...在您的情况下为m
指数...公有指数...公钥的一部分,用于加密
D ...私有指数...私钥的一部分,用于解密(在您的情况下为e)
P和Q ...密钥对的2个质数... P * Q =模
DP和DQ ...数学快捷方式的中间值(中国余数定理),用于更快的解密方式
所以...您得到了模数和私有指数...虽然通常足以解密,但它不是完整的密钥对... P和Q缺失...有了P和Q,我们可以计算出休息...
RSACryptoServiceProvider希望您提供完整的密钥对,如果您想解密...一个缺失的值,您将得到那个讨厌的cryptographicexception,告诉您“坏数据”
如此...一切都输了吗?否……前一段时间,还有一个关于RSA的问题,我为此写了几行仅使用bigintegers处理RSA的行,而根本没有使用RSACryptoServiceProvider ...使用RSACryptoServiceProvider进行公钥加密
也许可以帮助您将价值解密
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句