2015-08-18 2 views
-1

Я вижу, что они отличаются от байтов, с которых я создал строку! Я использовал «AES/CBC/PKCS5Padding», чтобы получить строку.байт в 'str = new String (байты, "UTF8")' и 'bytes = str.getBytes ("UTF8")' не то же значение

public static void main(String[] args) { 

    try { 
     int randomNumber = CNStationQueueUtil.randInt(0, 99999); 
     String key = "AES_KEY_TAKENUMB"; 
     byte[] bytes = EncryptHelper.encrypt(key, String.format("%%%d%%%d", 1001, randomNumber)); 
     String str = new String(bytes, "UTF8"); 
     System.out.println("str = " + str); 
     System.out.println(); 
     byte[] utf8Bytes = str.getBytes("UTF8"); 
     printBytes(utf8Bytes, "utf8Bytes"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 



public class EncryptHelper { 

    public static byte[] encrypt(String key, String value) 
      throws GeneralSecurityException { 

     byte[] raw = key.getBytes(Charset.forName("UTF-8")); 
     if (raw.length != 16) { 
      throw new IllegalArgumentException("Invalid key size."); 
     } 

     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec, 
       new IvParameterSpec(new byte[16])); 
     return cipher.doFinal(value.getBytes(Charset.forName("UTF-8"))); 
    } 

    public static String decrypt(String key, byte[] encrypted) 
      throws GeneralSecurityException { 

     byte[] raw = key.getBytes(Charset.forName("UTF-8")); 
     if (raw.length != 16) { 
      throw new IllegalArgumentException("Invalid key size."); 
     } 
     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec, 
       new IvParameterSpec(new byte[16])); 
     byte[] original = cipher.doFinal(encrypted); 

     return new String(original, Charset.forName("UTF-8")); 
    } 
} 
+0

Можете ли вы поделиться полным примером, пожалуйста? – Mureinik

+0

Как вы сравниваете 'str' с' байтами'? Они должны быть разными, поскольку один содержит 'char', а другой содержит' byte' –

+0

попробуйте «UTF-8» вместо «UTF8» –

ответ

1

Когда вы декодировать строку как UTF-8 это потому, что вы закодированы байты как UTF-8 или что-то совместимы. Вы не можете просто взять byte[] случайных байтов и превратить его в строку, потому что это двоичные данные, а не текст.

Что вы можете сделать, это использовать кодировщик Base64 для двоичного и декодера Base64, чтобы вернуть его обратно в исходные байты.

Хакерный способ сделать это - использовать ISO-8859-1, но это плохая идея, поскольку вы вводите в заблуждение двоичные и текстовые данные.