将 RSA 加密 Java 代码移植到 C#

本文关键字:代码 RSA 加密 Java | 更新日期: 2023-09-27 18:37:20

我正在尝试将以下 Java 代码移植到 C# 等效项:

public static String encrypt(String value, String key) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    byte[] bytes = value.getBytes(Charset.forName("UTF-8"));
    X509EncodedKeySpec x509 = new X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(key));
    KeyFactory factory = KeyFactory.getInstance("RSA");
    PublicKey publicKey = factory.generatePublic(x509);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    bytes = cipher.doFinal(bytes);
    return DatatypeConverter.printBase64Binary(bytes);
}

到目前为止,我设法用 C# 编写了以下内容,使用 .NET 的 BouncyCastle 库:

public static string Encrypt(string value, string key)
    {
        var bytes = Encoding.UTF8.GetBytes(value);
        var publicKeyBytes = Convert.FromBase64String(key);
        var asymmetricKeyParameter = PublicKeyFactory.CreateKey(publicKeyBytes);
        var rsaKeyParameters = (RsaKeyParameters) asymmetricKeyParameter;
        var cipher = CipherUtilities.GetCipher("RSA");
        cipher.Init(true, rsaKeyParameters);
        var processBlock = cipher.DoFinal(bytes);
        return Convert.ToBase64String(processBlock);
    }

但是,即使使用相同的参数调用,这两种方法也会产生不同的结果。出于测试目的,我使用以下公共 RSA 密钥:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLCZahTj/oz8mL6xsIfnX399Gt6bh8rDHx2ItTMjUhQrE/9kGznP5PVP19vFkQjHhcBBJ0Xi1C1wPWMKMfBsnCPwKTF/g4yga6yw26awEy4rvfjTCuFUsrShSPOz9OxwJ4t0ZIjuKxTRCDVUO7d/GZh2r7lx4zJCxACuHci0DvTQIDAQAB

您能否帮助我成功移植 Java 代码或建议一种替代方案以在 C# 中获得相同的结果?

EDIT1:每次运行程序时,Java 中的输出都不同。我不认为指定了任何填充,所以我不明白是什么使输出随机。

EDIT2:Java默认使用PKCS1,因此在C#密码初始化中指定它就足够了,以获得相同的加密类型(尽管结果不同,这在这一点上无关紧要)。

将 RSA 加密 Java 代码移植到 C#

作为一个有根据的猜测,我会说Java添加了随机填充以创建更强的加密。

RSA 的大多数实际实现都是这样做的,正如 wiki 所说......

由于RSA加密是一种确定性加密算法(即没有随机组件),攻击者可以通过加密公钥下的可能明文并测试它们是否等于密文,成功地对密码系统发起选定的明文攻击。如果攻击者无法区分两种加密,即使攻击者知道(或选择了)相应的明文,则称为语义安全。如上所述,不带填充的 RSA 在语义上是不安全的。

这可能就是您的两种方法输出不同的原因。