我正在尝试使用字符串打印加密文本,也许我哪里错了。我正在对纯文本进行简单的异或运算。即将到来的加密文本/字符串我正在放入一个 C 程序并再次执行相同的异或以再次获得纯文本。
但在两者之间,我无法获得正确的加密文本字符串以传递给 C
String xorencrypt(byte[] passwd,int pass_len){
char[] st = new char[pass_len];
byte[] crypted = new byte[pass_len];
for(int i = 0; i<pass_len;i++){
crypted[i] = (byte) (passwd[i]^(i+1));
st[i] = (char)crypted[i];
System.out.println((char)passwd[i]+" "+passwd[i] +"= " + (char)crypted[i]+" "+crypted[i]);/* characters are printed fine but problem is when i am convering it in to string */
}
return st.toString();
}
我不知道是否还需要任何类型的编码,因为如果我这样做了,我将如何从 C 程序解码和解密。
假设 passwd = bond007
然后java程序应该返回akkb78>
进一步的 C 程序将再次解密 akkb78>
为 bond007
。
最佳答案
使用
return new String(crypted);
在那种情况下你不需要st[]
数组。
顺便说一下,bond007
的编码值是 cmm`560 而不是您发布的内容。
编辑
虽然上面的解决方案很可能适用于大多数 java 环境,但为了编码安全,
按照 Alex 的建议,为 String 构造函数提供编码参数。
例如,如果您希望字符串携带 8 位字节:
return new String(crypted, "ISO-8859-1");
从字符串中获取字节时需要相同的参数:
byte[] bytes = myString.getBytes("ISO-8859-1")
或者,使用 Alex 提供的解决方案:
return new String(st);
但是,转换 bytes
至 chars
正确地:
st[i] = (char) (crypted[i] & 0xff);
否则,所有负字节,crypted[i] < 0
不会转换为 char
正确,你会得到令人惊讶的结果。
关于JAVA:无法使用 xor 获取字符串中的加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305349/