我试图使用字符串打印加密文本,也许我错了。我在简单的文字上做简单的xor。来自加密的文本/字符串我正在放入一个C程序并再次执行相同的xor以再次获得纯文本。
但介于两者之间,我无法获得正确的加密文本字符串以传递给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
。
答案 0 :(得分:0)
更改此行:
return st.toString();
用这个
return new String(st);
答案 1 :(得分:0)
使用
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
,您会得到令人惊讶的结果。