使用RSA java解密Base64加密字符串后的垃圾值

使用RSA java解密Base64加密字符串后的垃圾值,java,ios,encryption,cryptography,rsa,Java,Ios,Encryption,Cryptography,Rsa,在我的android应用程序中,我正在实现RSA加密解密 我们在ios和android上都有这个应用程序 每当ios使用我的公钥对消息进行加密时,都会在base64中发送加密文本,而在android端,我会使用私钥对其进行解密 问题是每当我解密数据时,它都会给出被垃圾填充包围的加密消息 如下图所示: K������N�T�X�08���我�二,�Z� 尝试使用“RSA/ECB/PKCS1Padding”而不是“RSA/ECB/NoPadding”或类似方法来计算算法的值。周围的随机字符实际上是随

在我的android应用程序中,我正在实现RSA加密解密

我们在ios和android上都有这个应用程序

每当ios使用我的公钥对消息进行加密时,都会在base64中发送加密文本,而在android端,我会使用私钥对其进行解密

问题是每当我解密数据时,它都会给出被垃圾填充包围的加密消息

如下图所示:

K������N�T�X�08���我�二,�Z� 尝试使用
“RSA/ECB/PKCS1Padding”
而不是
“RSA/ECB/NoPadding”
或类似方法来计算
算法的值。周围的随机字符实际上是随机填充字节。填充是RSA加密不可分割的一部分,不应跳过


请注意,
KeyPairGenerator
仍应使用
“RSA”
,生成器与加密模式和/或填充模式无关。

从等式中去掉base64和字符串转换:查看正在加密的原始字节,以及解密后的原始字节。但我想通过服务器传输数据,那么,我如何在不使用base64转换的情况下进行传输呢?我没有说过您需要在不使用base64的情况下进行传输。我说你需要看看你加密的原始字节和你解密的原始字节。理想情况下,在不需要base64端的情况下尝试相同的代码(例如,写入本地文件并以这种方式进行测试)。你能给我一个示例代码吗?我很难理解你想说什么。我不一定要谈论代码。我说的是进行更多的诊断。您应该查看加密前后的数据,以及解密前后的数据。首先,您是否尝试解密正确的字节数?解密后你会得到多少字节,这是正确的数字吗?所有这些都可以在调试器中完成。我建议您尝试编写一个简短但完整的程序,在单个应用程序中演示该问题,但最好是在桌面Java中,而不是在移动设备上,作为一个起点。我尝试了这一点,但这是通过java.security.NoSuchAlgorithmException:KeyPairGenerator RSA/ECB/PKCS1Padding实现未找到Hey@owlstead thanx..它正在工作..我们面临的另一个问题是从base64字符串加载私钥。每当我试图取回私钥(在android上生成)时在base64的ios上,它抛出了错误的标记异常,但ios上生成的私钥在我的android端重新生成。我们尝试了许多排列,但没有帮助。通常情况下,您不分发私钥-您在本地生成私钥,然后对公钥进行签名。这可能是Base64编码中的格式不同(PKCS#8与PKCS#12)。最好再发布一个附加问题,并包含这两个问题的base64编码(当然使用测试密钥)。@ownstead Thanx寻求帮助。.我更改了算法,所有问题都解决了,加密-解密工作正常。非常感谢您的帮助。但是在java上,加密需要8到10秒。如何使它更快。我用会话密钥加密消息,然后用接收方的公共密钥加密会话密钥(基本上是PGP实现),那么它如何能更快呢?有几个主要原因导致了这样糟糕的计时:一个是随机数生成器没有获得足够的熵,RSA密钥对生成。当然还有大量的数据。通常,您每隔一段时间只创建一次密钥对(然后您必须为公钥建立信任)。因此,将密钥对生成从等式中移除。
        public static String RSADecrypt(final String result, Context context, PrivateKey key)
        throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
        BadPaddingException, InvalidKeySpecException
{
    Log.d(TAG, "Decryption of " + result);
    String decrypted = "";
    try
    {
        byte[] b = Base64.decode(result, Base64.DEFAULT);
        Cipher cipher1;
        cipher1 = Cipher.getInstance(ALGO);
        cipher1.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedBytes = cipher1.doFinal(b);
        decrypted = new String(decryptedBytes,"US-ASCII");
        Log.d(TAG, "Decrypted text " + decrypted);
        Toast.makeText(context, decrypted, Toast.LENGTH_LONG).show();;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        Log.d(TAG, "Exception in decryption");
    }
    return decrypted;

}