Charset将toString编码为getbyte

时间:2015-11-04 16:46:22

标签: java sockets character-encoding tostring

转换字符串到字节和后面是不同的。我使用encypt / decrypt des,当我通过Server重新接收一个字符串时,服务器生成toString(),我使myString.getByte进行解密。解密不起作用,因为当使用填充密码解密时输入长度必须是8的倍数...任何人都可以帮助我。谢谢。 服务器:

String keySession=DesKeySession.toString();
    String Message=keySessione+"1.1.1.1";
       byte [] text=(Message).getBytes();

           // Encrypt the text
        byte[] textEncrypted = desCipher.doFinal(text);
        String StringtextEncrypted = textEncrypted.toString();
        OutLista.InsertTail(StringtextEncrypted);
//list to send client with all information
outToClient.writeObject(OutLista);

客户端:

        String mesage=listaFromServer.DeleteTail();


        byte [] messaggioKab=(message).getBytes();          

        // Initialize the same cipher for decryption
           desCipher.init(Cipher.DECRYPT_MODE, myDesKey); 


        // Decrypt the text
           byte[] textDecrypted = desCipher.doFinal(messaggioKab);//error

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. 您没有正确地将字节数组转换为字符串。您必须使用new String,而不是toString()。
  2. 在C中,您可以使用字符串来保存字节。在Java中,您不能,因为并非每个字节都是字符的有效表示。
  3. 这两个问题都归于这一行:

    String StringtextEncrypted = textEncrypted.toString();
    

    在Java中,所有原始数组都直接扩展java.lang.Object。这样的数组定义一个toString方法,这意味着每个原始数组都继承the toString method of Object,对于一个字节数组,它通常产生类似&#34; [B @ 19de8a6f89&#34;。< / p>

    因此,您无法使用toString()将字节数组转换为String。您必须直接创建一个String:

    String stringtextEncrypted = new String(textEncrypted);
    

    但是,除非您知道您的字节实际上代表用Charset编码的字符,否则不安全。您的字节不是在字符集中编码的 - 它们是加密操作的结果。在C中存储任意字节永远不会安全,因为字节可能包含根据用于解码它们的字符集的无效序列,并且这些无效序列将自动替换为指定的&#34;无效序列&#34;新字符串中的?字符。

    (使用的实际字符集是平台的默认字符集,因为您没有明确指定一个;这是您的代码的另一个问题,因为客户端和服务器可能没有相同的默认字符集,但上述问题需要先纠正。)

    简单地说,您无法安全地使用String来保存加密的字节。但是,由于byte[]是Object的子类,因此您始终可以将加密的字节数组本身放在列表中。所有原始数组都是可序列化的。

    顺便说一句,Java中的约定是所有变量名和方法名都以小写字母开头(静态最终变量除外,它们通常是常量)。您应该使用messageinsertTaildeleteTail等名称。