JAVA:无法使用xor在字符串中获取加密数据

时间:2014-01-23 10:24:34

标签: java xor

我试图使用字符串打印加密文本,也许我错了。我在简单的文字上做简单的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

2 个答案:

答案 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,您会得到令人惊讶的结果。