2016-04-07 4 views
2

Я попытался зашифровать в угловом использовании AES librery от AES.Шифрование в javascript и расшифровка в C# с алгоритмом AES

Я шифрую строку, используя метод CryptoJS.AES.encrypt() от AES.

вот мой код:

var txtloginKod = 'Some String...'; 
    var key = CryptoJS.enc.Utf8.parse('8080808080808080'); 
    var iv = CryptoJS.enc.Utf8.parse('8080808080808080'); 
    var encryptedlogin = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(txtloginKod), key, 
    { 
     keySize: 128/8, 
     iv: iv, 
     mode: CryptoJS.mode.CBC, 
     padding: CryptoJS.pad.Pkcs7 
    }); 

Метод CryptoJS.AES.encrypt() возвращает объект в мои encryptedlogin переменных.

Я не знаю, как отправить этот объект на мой веб-сервер WCF в C#

Когда я пытаюсь отправить объект отверстие (и определить метод веб-службы ожидает получить C# Object) - я получил эту ошибку:

«Преобразование круговой структуры JSON»

+1

Это протокол https. – dbugger

+0

Есть ли какие-либо проблемы с моим ответом? Если нет, и он решил вашу проблему, вы можете [принять] (http://meta.stackexchange.com/q/5234/266187). –

ответ

0

Вы должны были бы сериализовать шифротекст себя. Есть много способов сделать это.

Если ключ не является строкой, а WordArray (как в вашем случае), то простой encryptedlogin.toString() будет генерировать кодированную строку Base64, содержащую только зашифрованный текст. Помните, что вам нужно включить исходный файл enc-base64.js.

Если «ключ» (фактически пароль) является строкой, то применяется деривация ключа, совместимого с OpenSSL. В этом случае encryptedlogin.toString() будет строкой, кодированной Base64, которая содержит строку «Salted__», 8-байтовую случайную соль и зашифрованный текст.

Если вы хотите получить зашифрованный текст, то encryptedlogin.ciphertext.toString() предоставит вам строку с шестнадцатеричным кодированием, которая содержит только зашифрованный текст, а encryptedlogin.iv.toString() предоставит вам кодировку с шестнадцатеричным кодированием. Таким образом вы можете создать строку с кодировкой Base64 encryptedlogin.ciphertext.toString(CryptoJS.enc.Base64).

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

На стороне сервера вы должны декодировать значения (Base64 или Hex в зависимости от того, что вы использовали во время шифрования), и использовать их с классом AesCryptoServiceProvider (или аналогичным) для расшифровки зашифрованного текста.


Помните, что вам дополнительно необходимо аутентифицировать ваш зашифрованный текст, чтобы обнаружить (злонамеренные) манипуляции. Это можно сделать с помощью схемы шифрования-затем-MAC с сильным MAC, например HMAC-SHA256.

Кроме того, если ключ передается вместе с зашифрованным текстом или над небезопасным каналом, то это в основном просто обфускация данных и не обеспечивает реальной безопасности. Подробнее: Javascript Cryptography Considered Harmful

-1

Проверить пожалуйста https://social.msdn.microsoft.com/Forums/vstudio/en-US/47800a60-4461-4f8e-a8d1-751fa62c7884/aes-encrypt-in-javascript-and-decrypt-in-c?forum=csharpgeneral

Кроме того, вы должны использовать реализацию CryptoJS v3.1.2 AES, чтобы использовать его. Вы можете скачать его здесь: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/crypto-js/CryptoJS%20v3.1.2.zip

Код Js стороны вы можете найти здесь: jsfiddle.net/aEKw5/22/

Таким образом, используя информацию выше, вы можете кодировать на стороне C# и декодировать ее на js. или наоборот.