3

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

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

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) {


}
4

3 回答 3

2

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

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

更新:

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

于 2011-03-19T01:03:25.813 回答
2

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

于 2011-03-19T01:07:13.843 回答
2

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

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

于 2011-03-19T02:00:10.883 回答