Java公钥-私钥解密问题

Java公钥-私钥解密问题,java,encoding,cryptography,public-key-encryption,Java,Encoding,Cryptography,Public Key Encryption,我正在尝试对下面代码中提到的消息进行加密和解密。基本上,我想用公钥加密消息,并将加密消息从字节数组转换为字符串。并将此字符串解密为原始文本。这两种方法都有。这里加密工作正常,但解密失败(错误是“数据必须以零开始”)。我认为这是因为我将加密字节数组转换为字符串 我如何解决这个问题?(我想将加密的字节数组作为字符串并使用它进行解密)还有其他方法(使用公钥和私钥)吗 如果您查看这个页面(),您将需要执行base-64编码以将字节转换为字符串,然后对其进行解密,您只需对其进行解码,然后进行解密 例如,B

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

我如何解决这个问题?(我想将加密的字节数组作为字符串并使用它进行解密)还有其他方法(使用公钥和私钥)吗

如果您查看这个页面(),您将需要执行base-64编码以将字节转换为字符串,然后对其进行解密,您只需对其进行解码,然后进行解密

例如,Base-64编码使用字节的前7位来生成可打印或可发送电子邮件的内容

更新:


我犯了一个错误,有64个字符需要进行编码,这也是为了使它更容易作为可打印的东西使用。

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

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


由于这种攻击,大多数集成RSA的协议都使用RSA对随机生成的会话密钥进行加密,或对哈希函数进行签名,这些函数的输出应该与随机密钥无法区分,或者使用非常仔细格式化的消息,这些消息将无法正确解释。(详情请参见HAC中的注释8.63。)

投票被否决,因为这是误导性的/正确的。如果OP愿意使用字节数组,则不需要base64编码。而且,“使用字节的前7位”根本不是base64的工作方式@Jumbogram-好的,64个字符,我会更正它,但我希望测试是从加密到字符串(保存到文件),然后解密。Base-64是最好的选择。加密将使超过一半的字节(平均)无法读取,或者即使没有匹配的ascii符号,解密的消息也应该像原始消息一样可读,因此应该再次将其转换为字符串,不会出现任何问题。此外,由于解密和加密的调用是用字节[]完成的,所以我没有理由在中间再次转换它。我想纠正我以前的评论。在中间可能有很多理由把它转换成字符串,但一般来说,我认为应该避免。如果你想加密,然后发送电子邮件,你会把它作为附件吗?如果希望将消息作为xml文件的一部分包含,则字节可能是一个困难。一般来说,将其转换为字符串、放在需要的地方、然后返回字节比较容易。不应将加密的字节数组直接转换为字符串。如果您需要以可打印形式将其转换为Base64。您可以使用Apache commons codec:[链接(])中的Base64编码器
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) {


}