java中带字符串和十六进制的XOR操作

java中带字符串和十六进制的XOR操作,java,string,encryption,hex,xor,Java,String,Encryption,Hex,Xor,我是cobol开发者,但我必须用java开发一些代码。我正在用cobol加密/解密字符串,使用十六进制值作为加密密钥和XOR操作。这些加密数据存储在数据库中,然后我必须用java读取和解密它们。对于使用0x00到0x7F的密钥加密的数据,我在java中使用^(xor)没有问题,问题是当密钥从0x80到0xFF(扩展ASCII)时。我读过一些文章(,)有类似的问题,但我继续同样的问题 在我的代码中,我试图使用密钥0x85(ASCII中的字符“…”)对加密数据进行解码,它应该返回数据“desde c

我是cobol开发者,但我必须用java开发一些代码。我正在用cobol加密/解密字符串,使用十六进制值作为加密密钥和XOR操作。这些加密数据存储在数据库中,然后我必须用java读取和解密它们。对于使用0x00到0x7F的密钥加密的数据,我在java中使用^(xor)没有问题,问题是当密钥从0x80到0xFF(扩展ASCII)时。我读过一些文章(,)有类似的问题,但我继续同样的问题

在我的代码中,我试图使用密钥0x85(ASCII中的字符“…”)对加密数据进行解码,它应该返回数据“desde cobol”。使用sql,我得到的是字符串中的加密值,但其十六进制值是0xE1、0xE0、0xF6、0xE1、0xE0、0xA5、0xE6、0xEA、0xE7、0xEA、0xE9。(我想省略sql代码,但我不知道如何将这些十六进制转换为字符串)。 如何获取解密值“desde cobol”

import java.io.IOException;
import java.lang.Math;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.xml.bind.DatatypeConverter;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.util.Base64;

public class Decode02 {
 public static void main(String args[]) {
    //
    Connection c = null;
    Statement stmt = null;
    String data = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test2.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      stmt = c.createStatement();
      ResultSet rs = stmt.executeQuery( "SELECT * FROM tabla where key = '002';" );
      while ( rs.next() ) {
         String  key = rs.getString("key");

         data = rs.getString("data");


         System.out.println( "CLAVE = " + key );
         System.out.println( "DATOS = " + data );

         System.out.println();
      }
      rs.close();
      stmt.close();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Operation done successfully");


    String shex = "85";
    byte[] keyHex = DatatypeConverter.parseHexBinary(shex);
    System.out.println("Byte: " + keyHex[0]);

    byte[] bhex = new byte[0x85];
    String keyStr = DatatypeConverter.printHexBinary(bhex);
    System.out.println("String: " + keyStr);

    System.out.println("");

    String salida = new String(encode(data,shex));
    System.out.println("Salida: " + salida);

    String salida2 = new String(encode(data,keyStr));
    System.out.println("Salida2: " + salida2);

    System.out.println("");



 }

public static String encode(String s, String key) {
    return base64Encode(xorWithKey(s.getBytes(), key.getBytes()));
}

public static String decode(String s, String key) {
    return new String(xorWithKey(base64Decode(s), key.getBytes()));
}

private static byte[] xorWithKey(byte[] a, byte[] key) {
    byte[] out = new byte[a.length];
    for (int i = 0; i < a.length; i++) {
        out[i] = (byte) (a[i] ^ key[i%key.length]);
    }
    return out;
}

private static byte[] base64Decode(String s) {
    try {
        BASE64Decoder d = new BASE64Decoder();
        return d.decodeBuffer(s);
    } catch (IOException e) {throw new RuntimeException(e);}
}

private static String base64Encode(byte[] bytes) {
    BASE64Encoder enc = new BASE64Encoder();
    return enc.encode(bytes).replaceAll("\\s", "");

 }
}

新字节[0x85]
提供长度为133的数组,其中包含全为零的字节。此外,您没有对从SQL获得的实际数据进行任何处理。而且,数据不是十六进制字符串,因为您得到的是
??
。我从SQL中获得的实际数据是我想要解密的字符串,请参阅我的尝试:string salida=new string(encode(data,shex));String salida2=新字符串(encode(数据,keyStr));是的,该数据是一个带值的字符串:áááöáí¥æçççé
key.getBytes()
使用平台编码将字符转换为字节。在您的例子中,这可能是UTF-8,它将0x7F以上的字符编码为多个字节。我建议您使用二进制密钥(字节[])。如果您真的必须将其表示为字符串,请使用Base64编码;由于数据库中的数据不是十六进制的,所以输出是不同的,而不是从数据库中获取的。它是二进制的,并且不是用ASCII编码的,ASCII只有0x00-0x7f,而是用一些其他编码,比如ISO-8859-1。您应该使用适当的编码将其转换为
String
newbyte[0x85]
提供长度为133的数组,其中包含全为零的字节。此外,您没有对从SQL获得的实际数据进行任何处理。而且,数据不是十六进制字符串,因为您得到的是
??
。我从SQL中获得的实际数据是我想要解密的字符串,请参阅我的尝试:string salida=new string(encode(data,shex));String salida2=新字符串(encode(数据,keyStr));是的,该数据是一个带值的字符串:áááöáí¥æçççé
key.getBytes()
使用平台编码将字符转换为字节。在您的例子中,这可能是UTF-8,它将0x7F以上的字符编码为多个字节。我建议您使用二进制密钥(字节[])。如果您真的必须将其表示为字符串,请使用Base64编码;由于数据库中的数据不是十六进制的,所以输出是不同的,而不是从数据库中获取的。它是二进制的,并且不是用ASCII编码的,ASCII只有0x00-0x7f,而是用一些其他编码,比如ISO-8859-1。您应该使用适当的编码将其转换为
String
Opened database successfully
CLAVE = 002
DATOS = ??????????

Operation done successfully
cipher: 
Byte: -123
String: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


Decoded to be... 
Salida: BwoHCgcKBwoHCg==
Salida2: Dw8PDw8PDw8PDw==