Возможная ошибка кодировки сообщения - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать простой класс, который отображает кодируемое сообщение, закодированное сообщение и декодированное сообщение. Но я думаю, что мой класс не так. Вот что я сделал с расширением функции:

String messageToEncode = "a";

try {
    //We create a key
    SecretKey key = KeyGenerator.getInstance("AES").generateKey();
    // We choose method AES in order to encode message
    Cipher cipher = Cipher.getInstance("AES");
    //We enter the encoding phase of the message
    cipher.init(Cipher.ENCRYPT_MODE, key);
    //We transform the encoded message from String to Byte
    byte[] res = cipher.doFinal(messageToEncode.getBytes());
    //We transform the encoded message from Byte to String. Here we have a coded message that needs the key to be read
    String codedMessage = Base64.getEncoder().encodeToString(res);
    //We enter the decoding phase of the message
    cipher.init(Cipher.DECRYPT_MODE, key);
    //We decode the encoded message
    byte[] res2 = cipher.doFinal(Base64.getDecoder().decode(codedMessage));
    //We display the decoded message
    String decodedMessage = new String(res2);
    //We display the message sent at the beggin
    System.out.println("Message:" + messageToEncode);
    //We display the encoded message
    System.out.println("Encoded message:" + codedMessage);
    //We display the decoded message
    System.out.println("Decoded message:" + decodedMessage);
    //We recover the key 
    byte[] keyByte = key.getEncoded();
    //We display the key
    System.out.println(Base64.getEncoder().encodeToString(keyByte));
} catch (Exception ex) {
}

}

И у меня на выходе:

Message to code:a
Encoded message:oIgc5kuv8ROgCqNkpndCPQ==
Decoded message:a
u645vsT3RP5FRHLtGfIhrA==

Я думаю, что мой класс false, поскольку кодируемое сообщение состоит только из одной буквы, а закодированное сообщение состоит из 26 букв! Разве он не должен состоять из одной буквы? Поэтому я хотел бы, чтобы то, что я получил, было нормальным, пожалуйста.

Заранее благодарю всех, кто находит время, чтобы помочь мне.

PS: я использую JDK 12 с NetBeans 11.

1 Ответ

1 голос
/ 14 апреля 2020

То, что вы видите, - это то, что вы должны ожидать.

AES - это блочный шифр: он шифрует данные блоками по 16 байт. Если входные данные не кратны 16 байтам, они дополняются. Я ожидаю, что исходная длина данных будет как-то включена, поэтому меня не удивит, если результат шифрования одного байта в AES будет немного длиннее 16 байт.

Base64 выводит 4 байта на каждый блок из 3 байтов на входе. В 16 входных байтах имеется 6 таких блоков, поэтому зашифрованное сообщение становится не менее 24 байтов в base64.

...