Вот мое решение для PHP, Ruby & Swift.
Я столкнулся с проблемами при использовании CryptoJS в моем тесте.
мой код такой
var data = "Hello World";
var key = "57119C07F45756AF6E81E662BE2CCE62";
var iv = "GsCJsm/uyxG7rBTgBMrSiA==";
var encryptedData = CryptoJS.AES.encrypt(data,
CryptoJS.enc.Hex.parse(key), {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Base64.parse(iv)
}
);
console.log("encryptedData: " + encryptedData);
// var crypttext = encryptedData.toString();
var crypttext = "k4wX2Q9GHU4eU8Tf9pDu+w==";
var decryptedData = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(crypttext)
}, CryptoJS.enc.Hex.parse(key), {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Base64.parse(iv)
});
console.log("decryptedData: " + decryptedData);
результат console.log
encryptedData: 97SwKfGtNARERiSYyZxdAQ==
decryptedData:
Я посмотрел на ваш код PHP. Вы используете 32-символьный ключ, который явно закодирован в шестнадцатеричном формате, но вместо того, чтобы декодировать его в байты, вы используете символы непосредственно. Следовательно aes-256-cbc
шифр тоже не так.
Если вы не хотите изменять вводящий в заблуждение код PHP, вы можете просто сделать ту же ошибку в CryptoJS: CryptoJS.enc.Utf8.parse(key)
вместо CryptoJS.enc.Hex.parse(key)
,
Соображения безопасности:
IV должен быть непредсказуемым (читай: случайно). Не используйте статический IV, потому что это делает шифр детерминированным и, следовательно, не является семантически безопасным. Злоумышленник, наблюдающий шифротексты, может определить, когда тот же префикс сообщения был отправлен ранее. IV не секрет, поэтому вы можете отправить его вместе с зашифрованным текстом. Обычно он просто добавляется к зашифрованному тексту и отсекается перед расшифровкой.
Лучше аутентифицировать ваши шифротексты так, чтобы атаки набивка оракула не возможно. Это можно сделать с помощью аутентифицированных режимов, таких как GCM или EAX, или с шифровать-то-MAC схема.
Других решений пока нет …