У меня есть вопрос, относящийся к коду шифрования в этом вопросе:
Crypto ++ шифровать и дешифровать в двух разных программах на C ++
Если я хочу использовать пользовательский ключ / iv, как я могу это сделать?
Если я хочу использовать пользовательский ключ / iv, как я могу это сделать?
Просто подключите его к шифру с режимом. Есть много режимов на выбор, но вы должны использовать аутентифицированный режим шифрования, такой как EAX, CCM или GCM. Увидеть Категория: Режим для обсуждения режимов в Crypto ++.
Приведенный ниже код принимает пароль или секрет, вводит шифр, а затем шифрует и кодирует сообщение. Далее он декодирует зашифрованное сообщение. Наконец, он печатает некоторые параметры.
try {
// KDF parameters
string password = "Super secret password";
unsigned int iterations = 15000;
char purpose = 0; // unused by Crypto++
// 32 bytes of derived material. Used to key the cipher.
// 16 bytes are for the key, and 16 bytes are for the iv.
SecByteBlock derived(32);
// KDF function
PKCS5_PBKDF2_HMAC<SHA256> kdf;
kdf.DeriveKey(derived.data(), derived.size(), purpose, (byte*)password.data(), password.size(), NULL, 0, iterations);
// Encrypt a secret message
string plaintext = "Attack at dawn", ciphertext, recovered;
// Key the cipher
EAX<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(derived.data(), 16, derived.data() + 16, 16);
AuthenticatedEncryptionFilter ef(encryptor, new StringSink(ciphertext));
ef.Put((byte*)plaintext.data(), plaintext.size());
ef.MessageEnd();
// Key the cipher
EAX<AES>::Decryption decryptor;
decryptor.SetKeyWithIV(derived.data(), 16, derived.data() + 16, 16);
AuthenticatedDecryptionFilter df(decryptor, new StringSink(recovered));
df.Put((byte*)ciphertext.data(), ciphertext.size());
df.MessageEnd();
// Done with encryption and decryption
// Encode various parameters
HexEncoder encoder;
string key, iv, cipher;
encoder.Detach(new StringSink(key));
encoder.Put(derived.data(), 16);
encoder.MessageEnd();
encoder.Detach(new StringSink(iv));
encoder.Put(derived.data() + 16, 16);
encoder.MessageEnd();
encoder.Detach(new StringSink(cipher));
encoder.Put((byte*)ciphertext.data(), ciphertext.size());
encoder.MessageEnd();
// Print stuff
cout << "plaintext: " << plaintext << endl;
cout << "key: " << key << endl;
cout << "iv: " << iv << endl;
cout << "ciphertext: " << cipher << endl;
cout << "recovered: " << recovered << endl;
}
catch(CryptoPP::Exception& ex)
{
cerr << ex.what() << endl;
}
Запуск программы приводит к следующему выводу.
$ ./cryptopp-test.exe
plaintext: Attack at dawn
key: 7A8C7732898FB687669CB7DBEFBDD789
iv: 0AA980BABE72797E415C9B8979BF30EF
ciphertext: 197D0BD1A12577393AD1B1696B75D0FC6B8A142CF15B5F887AA965CE75F0
recovered: Attack at dawn
Еще лучше использовать интегрированную схему шифрования. Crypto ++ предоставляет два из них. Первый Схема интегрированного шифрования эллиптической кривой который действует над полями эллиптического проклятия. Второй Схема интегрированного шифрования дискретного логарифма, который работает над полем целых чисел.
Есть ряд неочевидных причин, почему его «даже лучше», но большая его IND-CCA2. Другие, более практичные: вы не может повторно использовать контекст безопасности, потому что правильное использование встроено в систему; и отступы были удалены, что значительно упрощает доказательства и позволяет избежать потенциальных оракулов. Система также основана на Дискретные журналы, что делает его проблемой, основанной на Диффи-Хеллмане, и считается, что она везде трудна.