JavaScript Шифрование AES показывает неверный результат против Java Android - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь преобразовать строку, используя метод AES в JavaScript, для этого мне нужно всего лишь использовать библиотеку Crypto Js.

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

Это то, что мне нужно;

Данные: {"test":1}
Секрет: NdRgUkXp2s5v8y/A

Результат должен быть таким: chib8X9Fnr7Vtn4VLRybKg==

Причина, по которой я ссылаюсь на сайт, не знаю режим и метод заполнения вышеупомянутого результата, но приведенный ниже результат показывает ожидаемый от сервера, если вы знаете режим вышеупомянутого результата, вы также можете сослаться на это.

Вы можете ссылаться на онлайн-шифрование, используя https://www.devglan.com/online-tools/aes-encryption-decryption для проверки.

Это то, что я получаю, когда использую JavaScript, что неверно;

var encrypted = CryptoJS.AES.encrypt('{"test",1}', "NdRgUkXp2s5v8y/A");
console.log(encrypted.toString()) 

Результат: U2FsdGVkX1/GS5CecHJ10Z4qvSP8hY1NkDNtKGlg3OE= Также он меняется каждый раз при генерации.

Я использую эту библиотеку https://cryptojs.gitbook.io/docs/

1 Ответ

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

Вы передаете текстовое значение в виде секрета вместо текста в кодировке UTF-8, а значение, полученное с упомянутого веб-сайта, шифруется с использованием метода заполнения PKCS7 в режиме ECB . Обычно этот метод поддерживается большинством Android Java методов шифрования.

Шифрование с использованием CryptoJS.pad.Pkcs7 и убедитесь, что вы предоставили секрет как UTF-8 как CryptoJS.enc.Utf8.parse(key) не в текстовом формате.

let data = '{"test":1}'
let key = 'NdRgUkXp2s5v8y/A'

var encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
});

console.log(encrypted.toString());

Метод расшифровки

var decrypted = CryptoJS.AES.decrypt(encrypted.toString(), CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
})

console.log(decrypted.toString(CryptoJS.enc.Utf8))

В приведенном ниже примере показано, что зашифрованные значения соответствуют ожидаемым.

let data = '{"test":1}'
let key = 'NdRgUkXp2s5v8y/A'

/*
* Encryption
*/
var encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
});

console.log(encrypted.toString());

/*
* Decryption
*/
var decrypted = CryptoJS.AES.decrypt(encrypted.toString(), CryptoJS.enc.Utf8.parse(key), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
})

console.log(decrypted.toString(CryptoJS.enc.Utf8) + "\n")
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
...