Это происходит из-за того, что строки изменяют ваши байты, вам действительно следует использовать Base64 , если строки обязательны.
Если вы хотите протестировать этот код:
byte[] aByte = {-45};
System.out.println(Arrays.toString(new String(aByte, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8)));
Будет выведено: [-17, -65, -67] (что не -45).
В любом случае, несколько советов для вас:
- Вы не можетешифровать с помощью «ECB» и расшифровывать с помощью «CBC».
- IV не должно быть константой.вы должны сгенерировать новый IV для каждого сообщения и отправить его вместе с сообщением.
- Не указывайте
"UTF-8"
use StandardCharsets.UTF_8
(обратите внимание, что при использовании android: StandardCharsets.UTF-8
- это API 19+, поэтому вам следуетесть константа для Charset.forName("UTF-8")
)
Вот пример кода для того, как сделать это с Base64:
public byte[] encrypt(String message, String key, String iv) throws Exception {
Cipher encrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "AES");
encrypt.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(Base64.getDecoder().decode(iv)));
return encrypt.doFinal(/*Get bytes from your message*/message.getBytes(StandardCharsets.UTF_8));
}
public String decrypt(String encryptedMessage, String key, String iv) throws Exception{
Cipher decrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "AES");
decrypt.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(Base64.getDecoder().decode(iv)));
return new String(decrypt.doFinal(Base64.getDecoder().decode(encryptedMessage)), StandardCharsets.UTF_8);
}
И запустить его с
//your message
String message = "Hello World!";
//generate a new AES key. (an AES key is just a random sequence 16 bytes)
SecureRandom random = new SecureRandom();
byte[] aesKey = new byte[16];
random.nextBytes(aesKey);
//generate a new initialization vector (iv) which is also a random sequence of 16 bytes.
byte[] iv = new byte[16];
random.nextBytes(iv);
String aesKeyAsString = Base64.getEncoder().encodeToString(aesKey);
String ivAsString = Base64.getEncoder().encodeToString(iv);
//encrypt
byte[] encrypted = encrypt(message, aesKeyAsString, ivAsString);
//enocde your encrypted byte[] to String
String encryptedString = Base64.getEncoder().encodeToString(encrypted);
//decrypt
String decrypted = decrypt(encryptedString, aesKeyAsString, ivAsString);
//print your results
System.out.println("Encrypted: " + encryptedString + " Decrypted: " + decrypted);
Выходы:
Зашифровано: | зашифрованная строка зависит от сгенерированного ключа и iv |Расшифровано: Hello World!
Вы также можете использовать более эффективный способ и использовать byte [] вместо Strings, но это ваш выбор.