Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将RSA加密Java代码移植到C#_C#_Java_Rsa_Porting_Bouncycastle - Fatal编程技术网

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

将RSA加密Java代码移植到C#,c#,java,rsa,porting,bouncycastle,C#,Java,Rsa,Porting,Bouncycastle,我正在尝试将以下Java代码移植到C#等效程序: public static String encrypt(String value, String key) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { byte[] bytes =

我正在尝试将以下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);
}
到目前为止,我使用.NET的BouncyCastle库成功地在C#中编写了以下内容:

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#cipher初始化中指定它就足够了,以获得相同的加密类型(尽管结果不一样,这与此无关)。

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

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

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


这可能就是你的两个方法输出不一样的原因。

更让人好奇的是,尽管它们给出了不同的答案,但当你解密它们时,它们会给出相同的输入吗?是的,UTF8解码字符串是相同的,显然是两个密钥结构的模和指数(Java中的公钥,C#中的RsaKeyParameters)都是一样的。我不尝试解密结果,因为我不需要它,程序也不需要私钥。重复?您可以尝试为java和C#指定RSA/ECB/NoPadding吗?@pd40我测试它是为了好玩。它在C#和Java中提供相同的输出。