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
这里有两个问题:
- 您没有正确地将字节数组转换为字符串。您必须使用
new String
,而不是 toString().
- 在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 变量除外,它们通常是常量)。您应该使用 message
、insertTail
和 deleteTail
.
这样的名称
字符串到字节和返回的转换是不同的。我使用 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
这里有两个问题:
- 您没有正确地将字节数组转换为字符串。您必须使用
new String
,而不是 toString(). - 在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 变量除外,它们通常是常量)。您应该使用 message
、insertTail
和 deleteTail
.