我正忙着尝试移植看起来像这样的
的Java代码 Cipher rsa = Cipher.getInstance("RSA/ECB/nopadding");
rsa.init(Cipher.DECRYPT_MODE, RSAPrivateKey);
decryptedData = rsa.doFinal(data, 0, 128);
到C#,但是看起来像RSACryptoServiceProvider,强制您使用OEAP或PKCS1填充。我知道没有填充不安全,但在这种情况下,我使用一个封闭的源客户端,所以我无法做任何事情。有没有解决这个填充问题的方法?
答案 0 :(得分:1)
您可能希望从BouncyCastle获取代码http://www.bouncycastle.org/csharp/,并修改以下链接中的代码,并确保它可以使用您在上面列出的加密。
http://www.java2s.com/Code/Java/Security/Whatisinbouncycastlebouncycastle.htm
答案 1 :(得分:0)
BouncyCastle 将帮助我们进行无填充RSA加密。
public string RsaEncryptWithPublic(string clearText, string publicKey)
{
// analogue of Java:
// Cipher rsa = Cipher.getInstance("RSA/ECB/nopadding");
try
{
var bytesToEncrypt = Encoding.ASCII.GetBytes(clearText);
var encryptEngine = new RsaEngine(); // new Pkcs1Encoding (new RsaEngine());
using (var txtreader = new StringReader("-----BEGIN PUBLIC KEY-----\n" + publicKey+ "\n-----END PUBLIC KEY-----"))
{
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
}
var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
return encrypted;
}
catch
{
return "";
}
}
也不要忘记将其放在顶部:
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.OpenSsl;