Я пытаюсь создать простую веб-страницу с целью отправки и зашифрованного сообщения на сервер (который будет создавать файл с этим контентом), затем создается ссылка, и пользователь, получивший предоставленную ссылку, сможет увидеть зашифрованный value (поскольку он предоставляет имя файла и ключа).
Сообщение зашифровывается с использованием CryptoJS AES, и результат кодируется Base64, который затем декодируется, только Base64 зашифрованного сообщения и зашифрованное сообщение больше не отправляются на сервер, и это делается с использованием Javascript.
Мой вопрос здесь. У меня есть сообщение, скажем, «Hello World», который я кодирую с помощью Base64, и это дает мне следующее:
1ffffffff5a8ae57
Если я отправлю это значение переменной, а затем просто использую эту переменную, она покажет результат:
// Works ! var test = CryptoJS.enc.Base64.parse("Hello World"); alert(CryptoJS.enc.Base64.stringify(test));
Это нормально. Но если я попытаюсь написать непосредственно текст (или просто сделать toString (), он не работает … что тоже нормально, потому что переменная 'test' не является простой переменной String):
// Doesn't work ! var test = CryptoJS.enc.Base64.parse("Hello World").toString(); alert(CryptoJS.enc.Base64.stringify(test));
Но мне нужно использовать String, поскольку она основана на значении PHP $ _GET, которое затем декодируется с помощью Javascript снова. Итак, мой вопрос: как я могу это сделать, чтобы кодировать String, а затем декодировать результат как String?
Это мой файл engine.js:
// Encrypt the message using a generated key function encrypt(message, key) { return CryptoJS.AES.encrypt(message, key); } // Encode String to Base64 function encodeBase64(value) { return CryptoJS.enc.Base64.parse(value.toString()); } // Decode String from Base64 Enconding function decodeBase64(encodedValue) { return CryptoJS.enc.Base64.stringify(encodedValue); } // Decrypt the message using the generated key function decrypt(encrypted, key) { return CryptoJS.AES.decrypt(encrypted, key).toString(CryptoJS.enc.Utf8); } // Generate the random key function generateKey() { return CryptoJS.lib.WordArray.random(16).toString(); } // Generate the random fileName function generateFileName() { return CryptoJS.lib.WordArray.random(16).toString(); } // Convert the text on the form with the encrypted version to be sent into the server function SendMessage(message, FinalURL) { if ((message.value).trim()) { var xmlhttp = new XMLHttpRequest; xmlhttp.open("POST", "index.php", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // Generate the Key and Encrypt the Message var key = generateKey(); var encryptedData = encrypt(message.value, key); var fileName = generateFileName(); xmlhttp.send("fileName=" + fileName + "&encryptedMsg=" + encodeBase64(encryptedData)); var finalURL = document.URL + "?MessageID=" + fileName + "&Key=" + key; FinalURL.innerHTML = "<p>Final URL: <a href=" + finalURL + ">" + finalURL + "</a></p>"; } else { alert("There is no text to be encrypted !"); } }
Я столкнулся с подобной путаницей, и для справки, вот решение.
Чтобы превратить текстовую строку (кодировку UTF-8) в строку base-64 , вам необходимо:
var textString = 'Hello world'; // Utf8-encoded string var words = CryptoJS.enc.Utf8.parse(textString); // WordArray object var base64 = CryptoJS.enc.Base64.stringify(words); // string: 'SGVsbG8gd29ybGQ='
Чтобы превратить строку с кодировкой base-64 в текст (кодировка UTF-8) , это:
var base64 = 'SGVsbG8gd29ybGQ='; var words = CryptoJS.enc.Base64.parse(base64); var textString = CryptoJS.enc.Utf8.stringify(words); // 'Hello world'
Как видно из примеров, приведенных в документации CryptoJS , синтаксический анализ предназначен для синтаксического анализа строки в формате, который ожидает кодер (в WordArray), и строкой превращает WordArray в строку.
Из документации:
var words = CryptoJS.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ=='); var base64 = CryptoJS.enc.Base64.stringify(words); // 'Hello, World!'
WordArray – это независимое от формата представление данных CryptoJS. Форматы (такие как Base64 и Utf8) являются интерфейсами между этим форматом WordArray и строками, которые могут содержать данные, закодированные в любом формате. Поэтому для изменения форматов вам нужен форматтер с обоих концов, один синтаксический разбор и одно строковое (т.е. кодирование). В этом случае вам нужно помнить, что когда мы пишем «Hello World», это текст, закодированный в определенном формате (я предполагаю UTF-8).
Я нашел этот Гист полезным.