Расшифровка AES возвращает пустую строку - PullRequest
0 голосов
/ 01 декабря 2018

Я начал узнавать о некоторых криптовалютах и ​​пытался реализовать шифрование AES в стороннем проекте на angular 7. Шифрование возвращает зашифрованный текст, но когда я расшифровываю шифр, он возвращает пустую строку.Я попытался выполнить поиск в Интернете, но не могу найти какое-либо решение, может быть, кто-нибудь может помочь.

 encryptPasswords(credentials: PasswordData) {

        const password = credentials.password;

        // msgString is expected to be Utf8 encoded
        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const iv = CryptoJS.lib.WordArray.random(16);
        const encrypted = CryptoJS.AES.encrypt(password, key, {
            iv: iv
        });
        return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
    }

    decryptPasswords(credentials: PasswordData) {
        /*
        * Decrypt payload
        * @param {string}  ciphertextStr - Encrypted Payload
        * @return {}
        */

        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const ciphertext = CryptoJS.enc.Base64.parse(credentials.password);

        // split IV and ciphertext
        const iv = ciphertext.clone();
        iv.sigBytes = 16;
        iv.clamp();
        ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
        ciphertext.sigBytes -= 16;

        // decryption
        const decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, key, {
            iv: iv
        });
        console.log(decrypted);
        return decrypted.toString(CryptoJS.enc.Utf8);
    }

PS: - Я все еще учусь, поэтому может быть какая-то глупая ошибка: P

спасибо в Advance

1 Ответ

0 голосов
/ 02 декабря 2018

Я бы начал с просмотра следующей ссылки, обратите внимание, что ciphertext = ....).toString()

  • , вызывающий encrypt.toString(), выводит шифрование, уже закодированное base64.

Тогдавы заметите, что они немедленно передают вывод ciphertext = ....).toString() для расшифровки.

https://github.com/brix/crypto-js#object-encryption


Я не уверен, что последствия использования encrypt.ciphertext лично я не используютак что я не в состоянии прокомментировать это ... но я знаю, что вывод следующего не то же самое ... Это было бы что-то, чтобы исследовать дальше.

console.log(encrypted.toString())
console.log(CryptoJS.enc.Base64.stringify(encrypted.ciphertext))

Обратите внимание: Я полагаю, что при расшифровке ожидается, что зашифрованный текст будет base64 строкой ... это по крайней мере так в моем приложении.


Я подозреваю encrypt.toString() противCryptoJS.enc.Base64.stringify(encrypted.ciphertext) может быть началом вашей проблемы ... но, глядя на процесс конкатенации, я подозреваю, что там тоже могут быть проблемы.

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

Это приведет к объединению iv:ciphertext с разделителем : и base64 ... еслиу вас были опасения, что вы могли бы base64 вывести это, прежде чем передать его по проводам ... не то, чтобы это сделало его безопасным ... но это было бы по крайней мере еще одним слоем запутывания.

btoa(iv)+':'+encrypted.toString()

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

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


Редакция

Надеемся, что это копирование и вставка... если это будет рабочая базовая линия, которую вы можете изменить при необходимости.

encryptPasswords(credentials: PasswordData) {

        const password = credentials.password;

        // msgString is expected to be Utf8 encoded
        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const iv = CryptoJS.lib.WordArray.random(16);
        const encrypted = CryptoJS.AES.encrypt(password, key, {
            iv: iv
        });

        return btoa(btoa(iv)+':'+encrypted.toString())
        // return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
    }

    decryptPasswords(credentials: PasswordData) {
        /*
        * Decrypt payload
        * @param {string}  ciphertextStr - Encrypted Payload
        * @return {}
        */

        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        // const ciphertext = CryptoJS.enc.Base64.parse(stringBase64);
        const ciphertextArray = atob(stringBase64).split(':');

        const iv = ciphertextArray[0];
        const ciphertext = ciphertextArray[1]

        // split IV and ciphertext
        // const iv = ciphertext.clone();
        // iv.sigBytes = 16;
        // iv.clamp();
        // ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
        // ciphertext.sigBytes -= 16;

        // decryption
        const decrypted = CryptoJS.AES.decrypt(ciphertext, key, {
            iv: iv
        });

        return decrypted.toString(CryptoJS.enc.Utf8);
    }
...