2014-10-08 4 views
0

У меня проблема с AES-шифрованием. У меня есть зашифрованный текст.CryptoJS AES. Как повторить шифрование

var keyString = 'b46393431e8dfaa3feec333b6ba02d0b277b8552f092e49e3a2e9b9739ac23ea'; 
var message1 = "message to encrypt"; 
var encrypted = CryptoJS.AES.encrypt(message1, keyString, {mode: CryptoJS.mode.CFB}); 
console.log(encrypted); //U2FsdGVkX1862TrLeAHJssPnGWVfQ9AzPtF64560nerd1xOM+72ad+ZdyXMl5sLF 

И теперь, я хочу проверить, что в следующий раз я зашифрую тот же текст. У меня нет переменных сообщений, но у меня есть зашифрованный текст.

var message2 = "message to encrypt"; 
var iv = CryptoJS.enc.Hex.parse(encrypted.iv.toString()); 
var key = CryptoJS.enc.Hex.parse(keyString); 
var encrypted1 = CryptoJS.AES.encrypt(message2, key, {iv: iv, mode: CryptoJS.mode.CFB}); 
console.log(encrypted1); //xbPp9LFwl12hkLKwlvjpMaVj5Rss7YUbR0fP61wFXw8= 

Но если переменная message1 == message2, я хочу получить тот же зашифрованный текст. Если я установлю iv и ключ, как во второй раз - я получу в следующий раз тот же результат. Но в первый раз я хочу генерировать функцию IV в функции регистрации. Является ли это возможным?

+0

Ваше понимание того, что представляет собой вектор «Intitialization Vector (IV)», является ошибочным. –

+0

Хорошо, может быть, вы поможете мне это понять? Я пытаюсь решить эту проблему в течение нескольких дней. – warlight

ответ

0

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

Вы можете префикс IV (сгенерированный перед вызовом encrypt) в зашифрованный текст, если вы хотите получить его позже. Если я не ошибаюсь, соль уже помещена в зашифрованный текст для совместимости паролей (OpenSSL), поэтому вы можете получить его из байт 8..15 после декодирования.

Обратите внимание, что повторное использование IV или соли обычно небезопасно для любого режима работы (CFB в вашем примере), хотя это зависит от режима работы , так как небезопасно повторение IV. Это хорошо для сравнения, но я бы не хранил несколько зашифрованных текстов с идентичным IV или солью.

Обычно существуют лучшие способы создания такой же функциональности для специфических схем, как описано выше.

+0

Какой способ вы предпочитаете для этой проблемы? Если я правильно понимаю, ключ - это объект, а пароль - строка, да? Если у меня есть ключ объекта - я могу установить IV. Но если у меня есть строка - при шифровании она будет генерироваться случайным образом. Я не понимаю, что вы предлагаете префикс IV o зашифрованного текста. Можете ли вы написать образец на JS? – warlight

+0

нет. Я не могу понять, если я буду использовать PBKDF, какую соль мне использовать? – warlight

+0

'var keyString = 'b46393431e8dfaa3feec333b6ba02d0b277b8552f092e49e3a2e9b9739ac23ea'; var message = "сообщение для шифрования"; var encrypted = CryptoJS.AES.encrypt (message, keyString); var iv = encrypted.iv; var key = CryptoJS.PBKDF2 (keyString, encrypted.salt); var encrypted1 = CryptoJS.AES.encrypt (message, key, {iv: iv}); ' Что случилось? – warlight

Смежные вопросы