Я бы начал с просмотра следующей ссылки, обратите внимание, что 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);
}