字节数组 - >字符串 - >加密文本的字节数组:大小不同

时间:2012-04-24 13:24:45

标签: java bytearray

我正在尝试加密消息,该消息可以正常工作并将其作为字节数组返回。然后我将此字节数组转换为字符串,以便通过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);

输出:

  

ENCRYPTED MESSAGE字节长度:256

     

加密消息字符串长度:235

     

ENCRYPTED MESSAGE字节长度: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;
}

3 个答案:

答案 0 :(得分:4)

使用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);

答案 1 :(得分:2)

这是一个编码问题。

1)你有一个字节数组。它包含字节
2)您将其转换为字符串。 一旦执行此操作,您就拥有UTF16编码的字符串。所以你已经取了字节并将它们改成了字符 3)您现在将这些字符转换回字节。但如果原始字节不是UTF8或UTF16,则可能没有相同的字节数。如果平台的默认编码是MacRoman,那么在步骤3中,您将UTF16字符串转换为字节,但将字符视为MacRoman。

答案 2 :(得分:0)

我想有一个很好的理由手动进行加密,但以防万一......您是否考虑使用SSLSocket?