Стэнфордская библиотека Javascript Crypto. (SJCL) шифровать и дешифровать без отправки параметров
В демоверсии SJCL есть флажок "Отправить параметры и аутентифицированные данные вместе с сообщением". уменьшить сообщение до очень короткой строки.
Я не могу найти список с допустимыми параметрами для использования в функции шифрования (и дешифрования):
var encryptedMessage = sjcl.encrypt(key,message, ??? );
var decryptedMessage = sjcl.decrypt(key,encryptedMessage);
4 ответа
Если вы введете пароль, отправьте текст и нажмите "Зашифровать", результат будет в поле "Зашифрованный текст", например:
пароль: "pass", сообщение: "text", данные, прошедшие проверку: "xxx"
Результат:
{
"iv":"tjp81jkAzUpW1bI9gLDDpg==", // iv Base64 encoded
"v":1, // version
"iter":1000, // iteration count
"ks":128, // key size in bits
"ts":64, // authentication strength
"mode":"ccm", // mode
"adata":"xxx", // authenticated data
"cipher":"aes", // cipher
"salt":"lx06UoJDNys=", // key derivation salt
"ct":"Gv7ptKdTtUz6AGtX" // ciphet text
}
Пример использования с сайта:
sjcl.encrypt("password", "data")
sjcl.decrypt("password", "encrypted-data")
Подвох в том, что несмотря на наличие заявленных режимов CCM
а также OCB2
обычно не поддерживаются на разных платформах.
Спасибо за вашу помощь!!! Для минимальных накладных расходов на сообщения в моей базе данных это решение работает для меня:
//Encrypt
var encryptedMessage = sjcl.encrypt("myPassword","myMessage",{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
var parsedMessage = JSON.parse(encryptedMessage);
delete parsedMessage.mode;
delete parsedMessage.iter;
delete parsedMessage.ks;
delete parsedMessage.ts;
delete parsedMessage.v;
delete parsedMessage.cipher;
delete parsedMessage.salt;
delete parsedMessage.adata;
encryptedMessageWithoutParameters = JSON.stringify(parsedMessage);
//Decrypt
var parsedMessage = JSON.parse(encryptedMessageWithoutParameters);
jQuery.extend(parsedMessage,{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
messageWithParameters = JSON.stringify(parsedMessage);
var decryptedMessage = sjcl.decrypt("myPassword",messageWithParameters);
//Result > "myMessage"
Использовать этот:
<script type="text/javascript" src="js/sjcl.js"></script>
<script type="text/javascript">
var cypheredMsg = sjcl.encrypt("secret", "Hi Amresh!");
var plainMsg = sjcl.decrypt("secret", cypheredMsg);
console.log(cypheredMsg);
console.log(plainMsg);
</script>
Спасибо, Штеффен. Разделение параметров может быть немного чище, поэтому мы можем перебирать варианты для удаления. Кроме того, соль должна быть base64, которую мы можем легко сгенерировать с помощью функции JavaScript btoa().
//Encrypt
var salt = btoa( "myGeneratedSalt" );
var options = {mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:salt}
var encryptedMessage = sjcl.encrypt("myPassword","myMessage",options);
var parsedMessage = JSON.parse(encryptedMessage);
var prop;
for (prop in options) {
delete parsedMessage[prop];
}
encryptedMessageWithoutParameters = JSON.stringify(parsedMessage);
//Decrypt
var parsedMessage = JSON.parse(encryptedMessageWithoutParameters);
jQuery.extend(parsedMessage,options);
messageWithParameters = JSON.stringify(parsedMessage);
var decryptedMessage = sjcl.decrypt("myPassword",messageWithParameters);
//Result > "myMessage"