7

我的 android 应用程序有一些问题。我正在尝试与 RSA 加密/解密相关的应用程序。这是我的问题:

我可以清楚地加密短句,但是当我尝试将此消息解密为原始文本时,我给出了一个错误(“RSA 块的数据太多”)。而且,如果我想加密一个长句子,我也会遇到同样的错误。我搜索了这个问题,并在这个网站上找到了一些解决方案:

站点 1

站点 2

站点 3

但是我什么都不懂,这些解决方案太复杂了。我该如何解决这个问题,谁能给我一个更简单的解决方案?谢谢你。

编辑:这些是我用于这个项目的代码块。

public String RSAEncrypt(String plain) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, UnsupportedEncodingException {

    publicKey = getPublicKey();
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] cipherData = cipher.doFinal(plain.getBytes());
    return Base64.encodeToString(cipherData, Base64.DEFAULT);
}

public String RSADecrypt(byte[] encryptedBytes) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, UnsupportedEncodingException {

    privateKey = getPrivateKey();
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);      
    byte[] cipherData = cipher.doFinal(encryptedBytes);
    return Base64.encodeToString(cipherData, Base64.DEFAULT);
}
4

2 回答 2

23

RSA 只能加密比密钥对的模数短几个字节的消息。额外的字节用于填充,确切的数字取决于您使用的填充方案。

RSA 用于密钥传输,而不是数据加密。如果您有一条长消息,请使用随机密钥使用 AES 对其进行加密。然后使用消息接收者的公钥使用 RSA 加密 AES 密钥。你应该使用Cipher类的wrap()unwrap()方法。

这就是 PGP、S/MIME、TLS(大致)和任何其他正确设计的 RSA 加密方案的工作原理。

于 2013-10-18T17:03:49.760 回答
-1

在我的用例中,我需要从我的应用程序加密一些到服务器的请求数据。

如果我用 RSA 加密 AES 密钥,那是没有意义的,因为使用 RSA 而不是 AES 的目的是防止逆向工程获取 AES 密钥(而 RSA 需要存储在服务器中的私钥进行解密)。由于 AES 密钥需要本地存储在应用程序中,因此我无法使用 erickson 建议的方法。

相反,我将长字符串拆分为List<String>(服务器提供商建议的每个长度);并加密每个字符串。

之后,将List<String>json 数组传递给服务器,让服务器解密并重新加入它们。

当然,这种方法需要您的服务器的支持,并且可能存在性能问题。

于 2018-05-16T04:27:21.883 回答