Java AES Encryption получает разные результаты - PullRequest
0 голосов
/ 22 сентября 2018

Я много искал и пока не получил ясности по моей конкретной проблеме.У меня есть процесс, использующий node.js, который шифрует некоторые элементы данных и сохраняет вывод шестнадцатеричной строки.Чтобы не вдаваться в подробности этого конкретного процесса, результаты такие же, как у следующего онлайн-инструмента здесь .

Если вы введете в этот инструмент следующее:

Enter text to be Encrypted:  "666326911"
Select Mode: "CBC"
Key Size in Bits: "256"
Enter IV: (Leave blank)
Enter Secret Key: "c88ba867994f440963f55b727cdd3cb7"
Output Text Format: "Hex"

Вывод шифрования даст вам «C08F3DD7F5F7ACD0FC3710ADDFBF596C».Этот результат соответствует моему процессу.

Теперь мне нужно использовать Java для шифрования данных таким же образом.Мой код дает мне совершенно разные результаты, и я не могу точно определить, где произошла моя ошибка.Вот код Java, который я использую:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
Key key = new SecretKeySpec(Hex.decodeHex("c88ba867994f440963f55b727cdd3cb7"), "AES");
IvParameterSpec iv = new IvParameterSpec(new byte[16]);
cipher.init(Cipher.ENCRYPT_MODE,key,iv);
byte[] testString = "666326911".getBytes("UTF-8");
byte[] encrypted = cipher.doFinal(testString);
System.out.println("Encrypt Hex: "+Hex.encodeHexString(encrypted));

Этот код дает мне результат "DA6711D88635E82B68673D9C077B070F".Может кто-нибудь сказать мне, где моя очевидная ошибка или неверное предположение?

Спасибо, Скотт

РЕДАКТИРОВАТЬ:

Изменение кода на:

SecretKeySpec key = new SecretKeySpec("c88ba867994f440963f55b727cdd3cb7".getBytes("UTF-8"), "AES");

приводит к «InvalidKeyException: Недопустимый размер ключа»

1 Ответ

0 голосов
/ 22 сентября 2018

Кажется, проблема в SecretKeyspec.

В онлайн-инструменте вы используете его как простую строку.

Здесь вы рассматриваете его как шестнадцатеричное число и декодируете егоfirst.

Если вы попробуете

Key key = new SecretKeySpec("c88ba867994f440963f55b727cdd3cb7".getBytes(), "AES");

, то вы получите те же результаты.


Это копия-вставка кода, который я использую:

try {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    Key key = new SecretKeySpec("c88ba867994f440963f55b727cdd3cb7".getBytes("UTF-8"), "AES");
    IvParameterSpec iv = new IvParameterSpec(new byte[16]);
    cipher.init(Cipher.ENCRYPT_MODE, key, iv);

    byte[] testString = "666326911".getBytes("UTF-8");

    byte[] encrypted = cipher.doFinal(testString);
    System.out.println("Encrypt Hex: " + Hex.encodeHexString(encrypted));
} catch (Exception e) {
    System.err.println("Uh-ohh...");
    e.printStackTrace();
}

И вывод:

Encrypt Hex: c08f3dd7f5f7acd0fc3710addfbf596c

Process finished with exit code 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...