2015-12-20 204 views
1

我一直试图使用“DESede”加密对一些数据进行编码和解码。 编码进行得很好,但我在解码时遇到问题。 我得到的格式像“[B @ 7764dc81”(只是一个示例值),应该是字节[]格式的编码数据,但我以字符串的形式得到这个数据(这是一个要求) ,现在,我想“[B @ 7764dc81”(只是一个示例值)从字符串转换为字节[]形式,但不幸的是,它不适合我。将字符串转换为byte []和byte []转换为JAVA中的字符串

函数String.getBytes();一次又一次返回不同的结果,其中调用此方法的String对象是相同的。但是通过方法(Arrays.toString(String.getBytes()))获得的数组值返回相同的值,并且这让我很头疼。

基本上,我想根据机器的主板序列号和MAC地址对一些值进行编码,将这两个键连接起来,并生成一个新的密钥。之后,我想解码获得的密钥,将其拆分回来,并检查密钥是否与MAC地址和主板序列号的原始值完全匹配。我在后面的程序中遇到问题。我在“[B @ f56dec29”(只是一个示例值)格式中获得了两个分片字符串值,我希望它们是byte []格式,以便我可以将它们传递到我的ObjectCrypter.decryptF()函数中。此外,这个函数引发一个异常,说“密钥长度必须是8的倍数......”。 主要功能在日期可视化方面有很大帮助,正确的人可能会乍一看猜测实际发生的情况。 我有两个文件,和下面的代码给出: Security.java

public class Security { 

public static void main(String[] args) throws NoSuchAlgorithmException,UnknownHostException, SocketException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, UnsupportedEncodingException 
{ 
    String algorithm = "DESede"; 
    ObjectCrypter obj = null; 
    Key symKey = KeyGenerator.getInstance(algorithm).generateKey(); 
    Cipher c = Cipher.getInstance(algorithm); 
    String serial = getSerialNumber(); 
    String mac = getMacAddress(); 


    serial = getSerialNumber(); 
    mac = getMacAddress(); 
    byte[] encryptionBytes1 = obj.encryptF(serial,symKey,c); 
    System.out.println("Serial: " + serial); 
    System.out.println("Encr: " + encryptionBytes1); 
    System.out.println("Decr: " + obj.decryptF(encryptionBytes1, symKey, c)); 
    byte[] encryptionBytes2 = obj.encryptF(mac,symKey,c); 
    System.out.println("MAC: " + mac); 
    System.out.println("Encr: " + encryptionBytes2); 
    System.out.println("Decr: " + obj.decryptF(encryptionBytes2, symKey, c)); 


    System.out.println("EncryptionBytes: "+encryptionBytes1); 
    System.out.println("Array EncBytes: "+Arrays.toString(encryptionBytes1)); 
    String ts = encryptionBytes1.toString(); 
    System.out.println("TesString: "+ts); 
    System.out.println("TesString ConvBytes: "+ts.getBytes("ISO-8859-1")); 
    System.out.println("TesString ConvBytes2: "+ts.getBytes("ISO-8859-1")); 
    System.out.println("ts array: "+Arrays.toString(ts.getBytes("ISO-8859-1"))); 
    byte[] tsec = ts.getBytes("ISO-8859-1"); 
    System.out.println("tsec array: "+Arrays.toString(tsec)); 
    System.out.println("esTrEncrypt: "+tsec); 
    System.out.println("esTrEncryptBytes1: "+tsec.toString().getBytes("ISO-8859-1")); 
    System.out.println("esTRarray1: "+Arrays.toString(tsec)); 
    System.out.println("esTrEncryptBytes2: "+tsec.toString().getBytes("ISO-8859-1")); 
    System.out.println("esTRarray1: "+Arrays.toString(tsec)); 
    System.out.println("esTrEncryptBytes3: "+tsec.toString().getBytes("ISO-8859-1")); 
    System.out.println("esTRarray1: "+Arrays.toString(tsec)); 
    String decoded = new String(encryptionBytes1, "ISO-8859-1"); 
    System.out.println("Decoded: "+decoded); 
    byte[] encoded = decoded.getBytes("ISO-8859-1"); 
    System.out.println("Encoded: "+encoded); 
    System.out.println("ArrayEncoded: "+Arrays.toString(encoded)); 
    String decrypted = obj.decryptF(encoded, symKey, c); 
    System.out.println("decrypted: "+decrypted); 

    serial = getSerialNumber(); 
    mac = getMacAddress(); 
    byte[] encryptionBytes12 = obj.encryptF(serial,symKey,c); 
    System.out.println("Serial: " + serial); 
    System.out.println("Encr: " + encryptionBytes12); 
    System.out.println("Decr: " + obj.decryptF(encryptionBytes1, symKey, c)); 
    byte[] encryptionBytes22 = obj.encryptF(mac,symKey,c); 
    System.out.println("MAC: " + mac); 
    System.out.println("Encr: " + encryptionBytes22); 
    System.out.println("Decr: " + obj.decryptF(encryptionBytes2, symKey, c)); 
}//end test 
public static String generateData() throws NoSuchAlgorithmException, NoSuchPaddingException, UnknownHostException, SocketException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException 
{ 
    String part1 = null, part2 = null; 
    String algorithm = "DESede"; 
    ObjectCrypter obj = null; 
    Key symKey = KeyGenerator.getInstance(algorithm).generateKey(); 
    Cipher c = Cipher.getInstance(algorithm); 
    String serial = getSerialNumber(); 
    String mac = getMacAddress(); 
    byte[] encryptionBytes = obj.encryptF(serial, symKey, c); 
    part1 = encryptionBytes.toString(); 
    byte[] encryptionBytes2 = obj.encryptF(mac, symKey, c); 
    part2 = encryptionBytes2.toString(); 
    part1 = sliceString(part1); 
    part2 = sliceString(part2); 
    return part1+part2; 
}//end generateData 


public static boolean checkLicense(String license) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnknownHostException, SocketException, UnsupportedEncodingException 
{ 
    String part1 = null, part2 = null; 
    String genSerial = null, genMac = null; 
    if (license.length() == 16) 
    { 
     part1 = "[[email protected]" + license.substring(0, 8); 
     part2 = "[[email protected]" + license.substring(8, license.length()); 
    }//end if 
    else if (license.length() == 15) 
    { 
     part1 = "[[email protected]" + license.substring(0, 7); 
     part2 = "[[email protected]" + license.substring(7, license.length()); 
    }//end if 
    else 
    { 
     return false; 
    }//end else 


    byte[] bpart1 = part1.getBytes("ISO-8859-1"); 
    byte[] bpart2 = part2.getBytes("ISO-8859-1"); 

    System.out.println("bytes: "+bpart1 + "\t" + bpart2); 

    System.out.println("parts: "+part1 + "\t" + part2); 
    String algorithm = "DESede"; 
    ObjectCrypter obj = null; 
    Key symKey = KeyGenerator.getInstance(algorithm).generateKey(); 
    Cipher c = Cipher.getInstance(algorithm); 
    genSerial = sliceString(obj.decryptF(bpart1, symKey, c)); 
    genMac = sliceString(obj.decryptF(bpart2, symKey, c)); 
    System.out.println(genSerial + "\t" + genMac); 
    System.out.println(getSerialNumber() + "\t" + getMacAddress()); 
    if (genSerial == getSerialNumber() && genMac == getMacAddress()) 
    { 
     return true; 
    }//end if 
    else 
    { 
     return false; 
    }//end else 
}//end checkLicense 
public static String sliceString(String arg) 
{ 
    return arg.substring(3); 
}//end sliceString 

public static String getSerialNumber() 
{ 
    String output = ""; 
    try 
    { 
     Process p=Runtime.getRuntime().exec("wmic baseboard get serialnumber"); 
     //p.waitFor(); 
     BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = ""; 
     int index = 0; 
     while((line = reader.readLine()) != null) 
     { 
      if (line.length() > 0) 
      { 
       output = line; 
      }//end if 
     }//end while 
    } 
    catch(IOException e1) {} 
    return output; 
}//end extractMBSerialNumber 

public static String getMacAddress() throws UnknownHostException, SocketException 
{ 
    InetAddress ip; 
    ip = InetAddress.getLocalHost(); 

    NetworkInterface network = NetworkInterface.getByInetAddress(ip); 
    byte[] mac = network.getHardwareAddress(); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < mac.length; i++) { 
     sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));   
    } 
    return sb.toString(); 
} 

}

为ObjectCrypter.java的代码是:

public class ObjectCrypter { 
static String algorithm = "DESede"; 

static byte[] encryptF(String input,Key pkey,Cipher c) throws InvalidKeyException, BadPaddingException, 

IllegalBlockSizeException { 

    c.init(Cipher.ENCRYPT_MODE, pkey); 

    byte[] inputBytes = input.getBytes(); 

    return c.doFinal(inputBytes); 
} 

static String decryptF(byte[] encryptionBytes,Key pkey,Cipher c) throws InvalidKeyException, 

BadPaddingException, IllegalBlockSizeException { 

    c.init(Cipher.DECRYPT_MODE, pkey); 

    byte[] decrypt = c.doFinal(encryptionBytes); 

    String decrypted = new String(decrypt); 
    return decrypted; 
} 

}

+1

您的文章很长。尝试更具体。 – Maroun

+0

如果这是为了实现复制保护,您将面临艰苦的战斗。 –

回答

1

您的[[email protected]只是toString()的结果byte []。如果你想创建基于字节的字符串,你需要使用String bytes = new String (yourbytearray);

或者更好

new String (yourbytes, Charset.forName ("utf-8")); 

你不应该从字面上使用这些字符串你的方式。

“[B @” 只是短用于阵列[在地址@地址加字节B的 ...

同样从字符串转换为byte []是:

byte [] bytedata = yourstring.getBytes (Charset.forName ("utf-8")); 
+0

我怎么会这么愚蠢,认为胡言乱语是一个有效的价值!!? 非常感谢,让我知道基地址表示法。它解决了很多混乱。我需要重做这件事。谢谢!! –

0

当您致电toString()byte[]。你会得到类似[[email protected]的东西。

数组中的实际值不是文本表示的一部分,所以如果您收到[[email protected],那么您已经丢失了所有的值。

+0

有没有解决方案? –

+0

不要在'byte []''上调用'toString()'。如果您需要加密字节数组,请不要转换为字符串并返回。 – Andreas

0

不能将字节(二进制)用作字符串。这是一个误解。

你应该转换它。几个礼仪。基数64或十六进制,例如

使用Base64,它给出了这样的:

import javax.xml.bind.DatatypeConverter ; 

byte[] bt= ... // what you get 

// Conversion B64 
String encodedb64=DatatypeConverter.printBase64Binary(bt); 

// CONVERSION base 64 => byte => String 
// base 64 => byte 
byte [] byteArrayreverse=DatatypeConverter.parseBase64Binary(encodedb64); 
+0

非常感谢。 DatatypeConverter在这里为我解决了很多问题。 –

相关问题