Hello StackOverflow社区,
我一直在这个社区居住了一段时间,但我没有遇到任何其他在线解决方案的问题,或者至少,我无法找到它。
我使用Java创建客户端,一旦客户端连接到服务器,它就会收到一个包含合理和必要信息的数据包,当然它们是加密的;很久以前,我成功地在整个过程中反向设计了加密技术,并且在没有任何问题的情况下用C ++实现了加密,并且得到了充分的测试结果。
现在我试图用Java重写Java中的客户端以获得科学和更好的编码速度,但唯一的问题是数据包与它看起来不同。 例如,通过使用C本机应用程序嗅探数据包,我得到了一个缓冲区,但是我的Java客户端中的相同数据包会产生不同的结果。 我的意思是什么?我的意思是有几个0xFD / BF字节无效,导致缓冲区损坏,然后解密失败。
这些屏幕截图可让您更好地理解
原始正确数据包 Corrent packet
这是Java转储的数据包, CORRUPTED Incorrect packet
我使用Read作为套接字outStream的读取对象类。 你对这个问题的原因有什么看法吗?
private Reader _br = new InputStreamReader(socket.getInputStream());
char[] _data = new char[92];
this._br.read(_data);
_dump(toBytes(_data));

我只是把与此问题相关的代码。
答案 0 :(得分:0)
您正在使用平台默认编码将随机字节(可能是您的密文)解码为字符,该编码似乎是UTF-8。
当然,这通常不起作用,所以更换角色,"�"或U + FFFD,在遇到无效字节序列的字符流中被替换。
然后打印字符,将(现已损坏的)文本编码为UTF-8。 U + FFFD的UTF-8编码是0xEF 0xBF 0xBD。
问题的原因是您将非文本数据视为文本。
更新
问题在于您正在创建InputStreamReader
。不要这样做。仅当输入流包含编码文本时,这才有用。请将输入读入字节数组:
InputStream is = socket.getInputStream();
byte[] data = new byte[92];
for (int pos = 0; pos < data.length; ) {
int n = is.read(data, pos, data.length - pos);
if (n < 0)
throw new EOFException();
pos += n;
}
/* Print what you read for debugging... */
for (byte b : data)
System.out.printf("%02X", b & 0xFF);
System.out.println();
现在data
包含您的数据包。您可以解析它并解密密文。也许生成的纯文本实际上是文本,此时,您可以将其解码为字符。