Istnieje wiele pytań na ten temat, to samo rozwiązanie, ale to nie działa dla mnie. Mam prosty test z szyfrowaniem. Sam szyfrowanie/deszyfrowanie działa (tak długo jak obsługuję ten test z samą tablicą bajtów, a nie jako Strings). Problem polega na tym, że nie chcemy traktować go jako tablicy bajtów, ale jako String, ale kiedy koduję tablicę bajtów do łańcucha i powrotem, wynikowa tablica bajtów różni się od oryginalnej tablicy bajtów, więc odszyfrowywanie już nie działa. Próbowałem następujące parametry w odpowiednich metod ciąg znaków: UTF-8, UTF8, UTF-16, UTF8. Żadna z nich nie działa. Wynikowa tablica bajtów różni się od oryginału. Jakieś pomysły, dlaczego tak się dzieje?Problemy z konwertowaniem tablicy bajtów na ciąg znaków i powrotem do tablicy bajtów
Encrypter:
public class NewEncrypter
{
private String algorithm = "DESede";
private Key key = null;
private Cipher cipher = null;
public NewEncrypter() throws NoSuchAlgorithmException, NoSuchPaddingException
{
key = KeyGenerator.getInstance(algorithm).generateKey();
cipher = Cipher.getInstance(algorithm);
}
public byte[] encrypt(String input) throws Exception
{
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] inputBytes = input.getBytes("UTF-16");
return cipher.doFinal(inputBytes);
}
public String decrypt(byte[] encryptionBytes) throws Exception
{
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] recoveredBytes = cipher.doFinal(encryptionBytes);
String recovered = new String(recoveredBytes, "UTF-16");
return recovered;
}
}
To jest test, gdzie próbuję go:
public class NewEncrypterTest
{
@Test
public void canEncryptAndDecrypt() throws Exception
{
String toEncrypt = "FOOBAR";
NewEncrypter encrypter = new NewEncrypter();
byte[] encryptedByteArray = encrypter.encrypt(toEncrypt);
System.out.println("encryptedByteArray:" + encryptedByteArray);
String decoded = new String(encryptedByteArray, "UTF-16");
System.out.println("decoded:" + decoded);
byte[] encoded = decoded.getBytes("UTF-16");
System.out.println("encoded:" + encoded);
String decryptedText = encrypter.decrypt(encoded); //Exception here
System.out.println("decryptedText:" + decryptedText);
assertEquals(toEncrypt, decryptedText);
}
}
Najpierw należy przekonwertować bajty na coś, co można przedstawić jako ciąg. Zwykle poprzez konwersję na hex lub base64. –
Jaka jest rzeczywista różnica w tablicach bajtów przed i po konwersji na ciąg znaków? – Herms
@Roger Lindsjö: dzięki za przywiezienie. Spróbuję natychmiast. – Bevor