Последний блок заполнен неправильно, плохой ключ используется во время расшифровки в AES ECB в JavaScript - PullRequest
0 голосов
/ 29 января 2020

Ниже AES ECB javascript код выдает выходные данные, но при тестировании его в онлайн-инструменте выдает проблему с заполнением «последний блок заполнен неправильно, используется неверный ключ». Есть ли способ решить эту проблему в javascript пожалуйста, предложите

    var encrypted = CryptoJS.AES.encrypt("Test","HhiiAlLHowRYoU69", {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });

        console.log("encryptByAES ciphertext: "+encrypted);

   var decrypted = CryptoJS.AES.decrypt(encrypted,"HhiiAlLHowRYoU69", {
             mode: CryptoJS.mode.ECB,
             padding: CryptoJS.pad.Pkcs7
        });

        console.log("decryptByAES plaintext: "+decrypted);

OUTPUT OF THE ABOVE CODE

encryptByAES ciphertext: U2FsdGVkX1+heFB5M+220TMdq12Q22/zuSNXXMJg4+0=  
decryptByAES plaintext: Test

Ответы [ 2 ]

1 голос
/ 30 января 2020

Crypto JS решает интерпретировать ваш «ключ» как пароль, если вы передадите ему строку. Затем он получает ключ от этого пароля, который сильно отличается от этого пароля.

Для ключа, когда вы передаете строку, он обрабатывается как фраза-пароль и используется для получения фактического ключа и IV. Или вы можете передать WordArray, который представляет фактический ключ. Если вы передаете фактический ключ, вы также должны передать фактический IV.

Именно поэтому ваш зашифрованный текст такой большой : он содержит 8-байтовую соль и зашифрованный текст. Соль в сочетании с паролем для получения ключа. Перед солью стоит строка / magi c Salted__, попробуйте просмотреть зашифрованный текст в шестнадцатеричном редакторе, и вы обнаружите, что 8 первых байтов не так уж случайны.

AES Ключ должен состоять из полностью непредсказуемых бит / байтов. Это означает, что печатаемая строка не может быть ключом, потому что она оставляет непечатные символы по определению. Если вы хотите использовать определенный c тестовый ключ, определите его с помощью шестнадцатеричных символов и используйте Hex.parse из библиотеки Crypto JS.

ECB небезопасен, вам следует использовать аутентифицированный режим, такой как GCM.

0 голосов
/ 04 февраля 2020
const key = CryptoJS.enc.Utf8.parse("HhiiAlLHowRYoU69");

 var encrypted = CryptoJS.AES.encrypt(msg,key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
 console.log("Encrypted data ="+encrypted);

     var decrypted = CryptoJS.AES.decrypt(encrypted,key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    var decryptedText = decrypted.toString( CryptoJS.enc.Utf8 );
 console.log( "decrypted Text = " + decryptedText );

Это рабочее решение, которое я нашел в вышеупомянутой проблеме в javascript.

...