4

我正忙于移植看起来像这样的 Java 代码

        Cipher rsa = Cipher.getInstance("RSA/ECB/nopadding");
        rsa.init(Cipher.DECRYPT_MODE, RSAPrivateKey);
        decryptedData = rsa.doFinal(data, 0, 128);

到 C#,但似乎 RSACryptoServiceProvider 会强制您使用 OEAP 或 PKCS1 填充。我知道没有填充是不安全的,但在这种情况下,我使用的是闭源客户端,所以我对此无能为力。有没有办法解决这个填充问题?

4

2 回答 2

2

您可能想从 BouncyCastle,http: //www.bouncycastle.org/csharp/ 获取代码,并从下面的链接修改代码,并确保它可以使用您上面列出的加密。

http://www.java2s.com/Code/Java/Security/Whatisinbouncycastlebouncycastle.htm

于 2009-10-12T01:50:04.290 回答
1

BouncyCastle将帮助我们进行 nopadding 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;
于 2019-01-31T10:46:59.597 回答