Декодировать строку Base64 с помощью CryptoJS

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

Сообщение шифруется с помощью 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" не является простой строковой переменной):

// Doesn't work !
var test = CryptoJS.enc.Base64.parse("Hello World").toString();
alert(CryptoJS.enc.Base64.stringify(test));

Но мне нужно использовать строку, поскольку она основана на значении PHP $_GET, которое затем снова декодируется с использованием Javascript. Итак, мой вопрос: как я могу это сделать, чтобы закодировать строку, а затем декодировать результат как строку?

Это мой файл 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 !");
    }
}

person aliasbody    schedule 25.08.2014    source источник


Ответы (1)


Я столкнулся с подобной путаницей, и для справки, вот решение.

Чтобы преобразовать текстовую строку (в кодировке 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), а stringify превращает 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).

Я нашел эту суть полезной.

person decates    schedule 30.12.2014