Для cipher перевожу данные из byte[] в строку, потом из той же строки обратно. но обратно получаю не то же самое, в чем может быть ошибка?

Рейтинг: -1Ответов: 1Опубликовано: 23.02.2023

Всем привет, подскажите плиз: перевожу данные из byte[] в строку, потом из той же строки обратно. но обратно получаю не то же самое, в чем может быть ошибка?

public String encryptString(String text) {
    byte[] encrypted = null;
    try {
      // encrypt the text
      cipher.init(Cipher.ENCRYPT_MODE, aesKey);
      encrypted = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    return new String(encrypted, StandardCharsets.UTF_8);
  }

  public String decryptString(String encrypted) {
    byte[] text = null;
    try {
      // decrypt the text
      cipher.init(Cipher.DECRYPT_MODE, aesKey);
      text = cipher.doFinal(encrypted.getBytes(StandardCharsets.UTF_8));
    } catch (Exception e) {
      e.printStackTrace();
    }    
    return new String(text, StandardCharsets.UTF_8);
  }

эти методы вызываются так:

String encrypted = crypto.encryptString(activationCode);

String activationQuery = URLEncoder.encode(encrypted, StandardCharsets.UTF_8);
System.err.println(encrypted);
System.err.println(activationQuery);

//test decrypt
String activationQueryD = URLDecoder.decode(activationQuery, StandardCharsets.UTF_8);
System.err.println(activationQueryD);
System.err.println(crypto.decryptString(activationQueryD));

Ответы

▲ 1Принят

Проблема в том, что зашифрованные байты не всегда могут быть преобразованы в строку с помощью набора символов UTF-8, и наоборот.

Вместо конструктора String можно использовать конвертацию через Base64:

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public String encryptString(String text) {
    byte[] encrypted = null;
    try {
      // encrypt the text
      cipher.init(Cipher.ENCRYPT_MODE, aesKey);
      encrypted = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    return Base64.getEncoder().encodeToString(encrypted);
  }

  public String decryptString(String encrypted) {
    byte[] text = null;
    try {
      // decode the encrypted text
      byte[] encryptedBytes = Base64.getDecoder().decode(encrypted);
      
      // decrypt the text
      cipher.init(Cipher.DECRYPT_MODE, aesKey);
      text = cipher.doFinal(encryptedBytes);
    } catch (Exception e) {
      e.printStackTrace();
    }    
    return new String(text, StandardCharsets.UTF_8);
  }