Задать вопрос
savostin
@savostin
Еще один программист

C++ OpenSSL (1.1.1) EVP_BytesToKey -> CryptoJS.PBKDF2. Почему разные key и iv?

Подскажите пожалуйста, где ошибка. Пытаюсь получить один и тот же key/iv из password/salt.
В c++:
typedef uchar aes_salt_t[8];
typedef uchar aes_key_t[32];
typedef uchar aes_iv_t[32];
int m_count = 1000;
const string pass = "password";
aes_key_t   m_key;
aes_iv_t    m_iv;
aes_salt_t  m_salt = "12345678";
bzero(m_key, sizeof(m_key));
bzero(m_iv, sizeof(m_iv));
OpenSSL_add_all_algorithms();
const EVP_CIPHER* cipher = EVP_get_cipherbyname("aes-256-cbc");
const EVP_MD*     digest = EVP_get_digestbyname("sha256");
int ks = EVP_BytesToKey(cipher,    // cipher type
			  digest,    // message digest
			  m_salt,    // 8 bytes
			  (uchar*)m_pass.c_str(), // pass value
			  m_pass.length(),
			  m_count,   // number of rounds
			  m_key,
			  m_iv);
cout << encode_base64(m_key, 32) << endl;
cout << encode_base64(m_iv, 16) << endl;


В CryptoJS (web):
var password = "password";
var salt = "12345678";
var saltWA = CryptoJS.enc.Utf8.parse(salt);
var keyIvWA = CryptoJS.PBKDF2(
            password,
            saltWA, {
                keySize: (32 + 16) / 4,   // Верно?
                iterations: 1000,
                hasher: CryptoJS.algo.SHA256
            }
        );
var keyWA = CryptoJS.lib.WordArray.create(keyIvWA.words.slice(0, 32 / 4));
var ivWA = CryptoJS.lib.WordArray.create(keyIvWA.words.slice(32 / 4, (32 + 16) / 4));

console.log(keyWA.toString(CryptoJS.enc.Base64))
console.log(ivWA.toString(CryptoJS.enc.Base64))


Почему разный вывод? Почему CryptoJS ничего не спрашивает про cipher, только про digest, а OpenSSL использует оба?
  • Вопрос задан
  • 159 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
savostin
@savostin Автор вопроса
Еще один программист
Вопрос решился откатом на версию CryptoJS 3.3.0 (была последняя, 4.0)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы