转换字符串到字节和后面是不同的。我使用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
答案 0 :(得分:0)
这里有两个问题:
new String
,而不是toString()。这两个问题都归于这一行:
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中的约定是所有变量名和方法名都以小写字母开头(静态最终变量除外,它们通常是常量)。您应该使用message
,insertTail
和deleteTail
等名称。