简体   繁体   中英

Interconversion of String into byte[] and byte[] into String in JAVA

I've been trying to encode and decode some data using "DESede" encryption. Encoding goes fine, but I'm facing problems with the decoding. I get the encoded data in the format like "[B@7764dc81" (just an example value), which is supposed to be in byte[] format, but I get this data in the form of a string (It's a requirement), and now, I want "[B@7764dc81"(just an example value) to be converted from string into byte[] form, but unluckily, it's not working out for me.

The function String.getBytes(); return different results again and again, where the String object calling this method is the same. But the Array values obtained through the method (Arrays.toString(String.getBytes())) returns the same values, and this is messing my mind.

Basically, I want to encode some values, based on the machine's Motherboard's serial number, and the MAC address, concatenate both the keys, and generate a new key. After that, I want to decode the the obtained key, split it back, and check if the key exactly matches the original values of the MAC address and the Motherboard's serial number, or not. I'm having a problem with the later procedure. I get two sliced string values in a "[B@f56dec29"(just an example value) format, and I want them to be in byte[] format, so that I may pass them into my ObjectCrypter.decryptF() function. Also, this function raises an exception with the statement, that says "key length must be a multiple of 8...". The main function helps a lot in visualizing the date, and the right person may guess at the first glance that what actually is going on. I've two files, and the code is given below: 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 = "[B@" + license.substring(0, 8);
        part2 = "[B@" + license.substring(8, license.length());
    }//end if
    else if (license.length() == 15)
    {
        part1 = "[B@" + license.substring(0, 7);
        part2 = "[B@" + 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();
}

}

The code for ObjectCrypter.java is:

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;
}

}

Your [B@7764dc81 is just the result of toString () on a byte [] . If you want to create a string based on the bytes you'll need to use String bytes = new String (yourbytearray);

Or better

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

You should not use these strings literally the way you do.

"[B@" is just short for an array [ of bytes B at address @ plus the address...

Likewise the conversion from string to byte [] is:

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

When you call toString() on a byte[] . you get something like [B@7764dc81 .

The actual values in the array are not part of the text representation, so if you're receiving [B@7764dc81 , then you already lost all the values.

You cannot use bytes (binary) as a String. It's a misunderstanding.

You should convert it . Several manners. Base64 or Hexa, for example

with base64, it gives this:

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM