Java公钥私钥解密问题

我正在尝试加密和解密消息,如下面的代码所示。 基本上我想用公钥加密消息,并将该加密消息从字节数组转换为String。 并将此字符串解密为原始文本。 以下是这两种方法。 这里加密工作正常,但解密失败(错误是“数据必须从零开始”)。 我认为这是因为我将加密的字节数组转换为String。

我该如何解决这个问题? (我希望将加密的字节数组作为字符串并用于解密)是否有其他方法(使用公钥和私钥)

public static String getEncryptedMessage(String publicKeyFilePath, String plainMessage) { byte[] encryptedBytes; try { Cipher cipher = Cipher.getInstance("RSA"); byte[] publicKeyContentsAsByteArray = getBytesFromFile(publicKeyFilePath); PublicKey publicKey = getPublicKey(publicKeyContentsAsByteArray); cipher.init(Cipher.ENCRYPT_MODE, publicKey); encryptedBytes = cipher.doFinal(plainMessage.getBytes()); return new String(encryptedBytes); } catch (Throwable t) { } } public static String getDecryptedMessage( String privateKeyFilePath, String encryptedMessage) { byte[] decryptedMessage; try { Cipher cipher = Cipher.getInstance("RSA"); byte[] privateKeyContentsAsByteArray = getBytesFromFile(privateKeyFilePath); PrivateKey privateKey = getPrivateKey(privateKeyContentsAsByteArray); cipher.init(Cipher.DECRYPT_MODE, privateKey); decryptedMessage = cipher.doFinal(encryptedMessage.getBytes()); return new String(decryptedMessage); } catch (Throwable t) { } 

如果您查看此页面( http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial ),您将需要执行base-64编码将字节转换为字符串,然后解密它,您只需解码它然后解密。

例如,Base-64编码使用字节的前7位来制作可打印或可邮寄的内容。

更新:

我犯了一个错误,它还会编码64个字符,以便更容易使用它作为可打印的东西。

为什么不将消息视为从加密到解密的字节数组? 为什么要在中间将它改为String? (我知道这似乎是一个问题,但它实际上是一个答案…)

直接在未格式化的数据上使用RSA可能会使您的应用程序容易受到自适应选择的密文攻击 。 有关详细信息,请参阅“应用密码学手册”第8章第288-289页,这是一本可从CRC Press免费获得的书。 (非常值得购买绑定版本 ,如果你真的对密码学感兴趣 – 你会对价格的质量感到震惊。)

由于这种攻击,大多数集成RSA的协议使用RSA加密随机生成的会话密钥或签署散列函数,其输出应该与随机无法区分,或使用非常仔细格式化的消息,这些消息将无法正确解释。 (有关详细信息,请参阅HAC中的注释8.63 。)