Charset 编码 toString 到 getbyte

Charset encoding toString to getbyte

字符串到字节和返回的转换是不同的。我使用 encypt/decrypt des,当我从服务器收到一个字符串时,服务器生成 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. 您没有正确地将字节数组转换为字符串。您必须使用 new String,而不是 toString().
  2. 在C语言中,可以使用字符串来保存字节。在 Java 中,您不能,因为并非每个字节都是字符的有效表示。

这两个问题都是由于这一行造成的:

String StringtextEncrypted = textEncrypted.toString();

在Java中,所有原始数组直接扩展java.lang.Object。这样的数组 没有 定义 toString 方法,这意味着每个基本数组都继承 the toString method of Object,对于字节数组通常会产生类似“[B@19de8a6f89”的东西。

因此,您不能使用 toString() 将字节数组转换为字符串。您必须直接创建一个字符串:

String stringtextEncrypted = new String(textEncrypted);

但是,这 不安全 除非您知道您的字节实际上表示用 Charset 编码的字符。您的字节未编码为字符集——它们是加密操作的结果。像在 C 中那样在 String 中存储任意字节是不安全的,因为根据用于解码它们的字符集,字节可能包含无效序列,并且此类无效序列将自动替换为指定的 "invalid sequence"新字符串中的 ? 等字符。

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

简而言之,您不能安全地使用字符串来保存您的加密字节。但是,由于 byte[] 是 Object 的子类,您始终可以将加密的字节数组本身放入您的列表中。所有原始数组都是可序列化的。

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

这样的名称