【问题标题】:Byte Array -> String -> Byte Array for encrypted text: not the same size字节数组 -> 字符串 -> 加密文本的字节数组:大小不同
【发布时间】:2012-04-24 13:24:45
【问题描述】:

我正在尝试加密一条消息,该消息有效并将其作为字节数组返回。然后我将此字节数组转换为字符串,以便通过 tcp 网络消息发送。另一方面,我将字符串转换回字节数组,但是结果数组更大,我不知道为什么。我认为这可能与编码有关,就像我使用“MacRoman”一样,我没有这个问题,但是程序需要能够在不支持这种编码的系统上运行,所以我决定使用 UTF -8.

        String message="222233332221";

        //Encrypt message
        byte[] encryptedMsg = encryptString(message, temp.loadCASPublicKey());
        System.out.println("ENCRYPTED MESSAGE byte Length: "+encryptedMsg.length);


        //Convert to String in order to send
        String stringMessage = new String(encryptedMsg);
        System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length());

        //Convert String back to Byte[] and decrpt
        byte[] byteMessage = stringMessage.getBytes("UTF-8");
        System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);

输出:

加密消息字节长度:256

加密消息字符串长度:235

加密消息字节长度:446

谁能指出我正确的方向,为什么生成的字节数组是 446 字节而不是 256 字节。

encryptString 部分如下。我相信这会返回一个 UTF-8 字节数组?

private static byte[] encryptString(String message, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    byte[] cipherData = cipher.doFinal(message.getBytes("UTF-8"));     
    return cipherData;
}

【问题讨论】:

  • 为什么不直接通过套接字发送字节?为什么要改成字符串?
  • @Nikhar - 这将是我的首选方式,但不幸的是我正在集成到现有系统中,所以这不是一个选择。
  • 您应该将一个字符集传递给 String 构造函数。
  • 将您的字符串构造为:String stringMessage = new String(encryptedMsg, "UTF-8");
  • 字符串旨在存储文本,而不是二进制数据。您不应该期望能够将二进制文件存储在字符串、写入器或读取器等文本组件中而不会损坏。

标签: java bytearray


【解决方案1】:

设法使用 Base64 修复它。

        byte[] encryptedMsg = Base64.encodeBase64(encryptString(message, temp.loadCASPublicKey()));


        System.out.println("ENCRYPTED MESSAGE byte Length: "+encryptedMsg.length);


        //Convert to String in order to send
        String stringMessage = new String(encryptedMsg, "UTF-8");
        System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length());

        //Convert String back to Byte[] and decrpt
        byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8"));
        System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);

【讨论】:

  • 感谢您发布您的答案。对我尝试做的事情很有帮助,并且对使用 Base64 进行编码进行了简单的解释,并且很好地使用了它。
【解决方案2】:

这是一个编码问题。

1) 你有一个字节数组。它包含字节
2)您将其转换为字符串。 一旦你这样做了,你就有了一个 UTF16 编码的字符串。因此,您已获取字节并将它们更改为字符。
3) 您现在将这些字符转换回字节。但是,如果原始字节不是 UTF8 或 UTF16,则您的字节数可能不同。如果平台的默认编码是 MacRoman,那么在第 3 步中,您将 UTF16 字符串转换为字节,但将字符视为 MacRoman。

【讨论】:

  • 好的。我已经用 encryptString 函数更新了我的问题。这不意味着原始字节数组也是 UTF-8 吗?另外,我已将 eclipse 默认为 UTF-8。
【解决方案3】:

我想手动进行加密是有充分理由的,但以防万一……您考虑改用 SSLSocket 吗?

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2020-06-22
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2015-03-19
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多