2016-12-02 6 views
1

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

Любая помощь очень ценится пожалуйста!

iv = crypto.randomBytes(16), 
orig = 'A confidential message.'; 
//Crypto JS creates key 
var password = "sixteen byte key"; 
var salt = CryptoJS.lib.WordArray.random(128/8); 
var key = CryptoJS.PBKDF2(password, salt, { keySize: 128/32, iterations: 1000 }); 
console.log("step1 generated key: "+ key); 

//Convert key for crypto use - as a Buffer 
var hashHex = key.toString(CryptoJS.enc.Hex); 
var hash = new Buffer(hashHex,'hex'); 

//Test encryption and decryption with crypto (Node) 
//use CryptoJS key to encrypt data using crypto cipheriv 
var cipher2 = crypto.createCipheriv('aes-128-cbc', hash, iv); //iv must be a buffer 
var encrypted1 = cipher2.update(orig, 'utf8', 'hex'); 
var encrypted2 = encrypted1 += cipher2.final('hex'); 
console.log("Crypto string:", encrypted2.toString()); 

// Start decrypt 
var decipher = crypto.createDecipheriv('aes-128-cbc', hash, iv); 
var dec = decipher.update(encrypted2, 'hex', 'utf8') 
dec += decipher.final('utf8'); 
console.log("Crypto decrypted msg:", dec); 

//test with crypto JS (ie the client) 
//CryptoJS key is a string 
var encryptedCJS = CryptoJS.AES.encrypt(orig, key.toString(), { iv: iv, mode: CryptoJS.mode.CBC}); 
console.log("CryptoJS encrypted: "+encryptedCJS); 

var decryptedCryptoJS = CryptoJS.AES.decrypt(encryptedCJS, key.toString(), { mode: CryptoJS.mode.CBC, iv: iv }); 
console.log("CryptoJS decrypted msg: "+decryptedCryptoJS.toString(CryptoJS.enc.Utf8)); 

//This part does not work - use message encrypted by crypto but cannot decrypt with CryptoJS. decryptedCryptoJSFinal is empty 
var decryptedCryptoJSFinal = CryptoJS.AES.decrypt(encrypted2, key.toString(), {iv: iv, mode: CryptoJS.mode.CBC}); 
console.log("FINAL CryptoJS decrypted: "+decryptedCryptoJSFinal.toString(CryptoJS.enc.Utf8)); 

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

+0

FWIW вы можете использовать один и тот же узел 'crypto' API, если вы используете WebPack/browserify/др. – mscdex

+0

@mscdex Хорошее спасибо. FWIW Я хотел использовать другую библиотеку, поскольку на самом деле сервер может быть Java, .Net и т. Д. Кстати, я думаю, что я взломал его, CryptoJS ожидает, что «расшифровка» будет решена, поэтому я думаю, что проблема там есть. Все еще доказательство исправить в мо. – user7239926

ответ

0

Я думаю, что ваша проблема в клиенте, если вы передаете «ключ» и «iv» в виде строк в «CryptoJS.AES.encrypt», тогда CryptoJS принимает ваш «ключ» и случайную «соль» и генерирует другой секретный ключ для шифрования. Вы можете проверить, что он генерирует разные cipherTexts из одного и того же ключа clearText с одним и тем же ключом и iv, они всегда будут разными, потому что каждый секретный ключ генерируется внутри CryptoJS каждый раз, когда вы запускаете эту функцию.

Чтобы избежать этого, вам необходимо передать кодировку «ключ» и «iv» (в «шестнадцатеричном» или «базовом64» в зависимости от используемого кода), а затем CryptoJS интерпретирует, что ему не нужно генерировать секрет и берет ваш ключ для шифрования.

Проверить этот пример:

//BACKEND with node crypto aes-256-cbc-> generate key and ciphertext 
///////////////////////////////////////////////////////////////////// 
var crypto = require('crypto'); 
var algorithm = 'aes-256-cbc'; 
var inputEncoding = 'utf8'; 
var outputEncoding = 'base64'; 
var pt = 'HELLO'; 

//generate key and iv 
var masterKey = "253D3FB468A0E24677C28A624BE0F939"; 
var salt = "0000000000000000"; 
var keySize = 256/8; 
var ivSize = 128/8; 
var iterations = 100; 
var outputKey = crypto.pbkdf2Sync(masterKey, salt, iterations, keySize+ivSize, "sha1"); 

// obtain key and IV splitting outputKey 
var buffer = new Buffer(outputKey, inputEncoding); 
var secretKey = buffer.slice(0, keySize); 
var iv = buffer.slice(keySize, (keySize+ivSize)); 

console.log('secretKey->',secretKey.toString('base64')); 
console.log('iv->',iv.toString('base64'));  

//encrypt 
var encrypt = crypto.createCipheriv(algorithm, secretKey, iv); 
var encrypted = encrypt.update(pt, inputEncoding, outputEncoding); 
encrypted += encrypt.final(outputEncoding); 
console.log('Ciphering "%s"', pt); 
//We obtain a 
console.log('CipherText base64' string "%s ', encrypted.toString()); 



//FRONTEND with node CryptoJS aes-256-cbc-> generate same key and obtain cleartext 
//////////////////////////////////////////////////////////////////// 
var masterKey = "253D3FB468A0E24677C28A624BE0F939"; 
var salt ="0000000000000000"; 
var iterations = 100; 
var keySize = 256; 
var ivSize = 128; 
var outputKey = CryptoJS.PBKDF2(masterKey, salt, { 
    keySize: (keySize+ivSize)/32, 
    iterations: iterations 
}); 
// the underlying words arrays might have more content than was asked: remove insignificant words 
outputKey.clamp(); 

// split key and IV 
var secretKey = CryptoJS.lib.WordArray.create(outputKey.words.slice(0, 
keySize/32)); 
var iv = CryptoJS.lib.WordArray.create(outputKey.words.slice(keySize/32)); 

console.log('secretKey->', secretKey.toString(CryptoJS.enc.Base64)); 
console.log('iv->', iv.toString(CryptoJS.enc.Base64)); 

var decrypted = CryptoJS.AES.decrypt(ct, secretKey,{iv: iv});//Default mode CBC { mode: CryptoJS.mode.CFB }); 
console.log('CipherText->', ct); 
console.log('ClearText decrypted', decrypted.toString(CryptoJS.enc.Utf8)); 

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

  • Нет связанных вопросов^_^