gcm example encrypt cipher cbc java string utf-8 bytearray aes

java - example - bytes en ''str=new String(bytes, "UTF8")'' y ''bytes=str.getBytes("UTF8")'' no tienen el mismo valor



cipher java (1)

¡Puedo ver que son diferentes a los bytes con los que creé la cadena! He usado "AES / CBC / PKCS5Padding" para obtener la cadena.

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


Cuando decodifica una cadena como UTF-8 es porque codificó los bytes como UTF-8 o algo compatible. No se puede simplemente tomar un byte[] de bytes aleatorios y convertirlo en una cadena porque es información binaria, no texto.

Lo que puedes hacer es usar un codificador Base64 para el binario y un decodificador Base64 para volver a convertirlo en los bytes originales.

Una forma estrafalaria de hacer esto es usar ISO-8859-1 , pero esta es una mala idea, ya que confunde los datos binarios y de texto.