Ето част от система, която ще генерира двойка ключове, използвайки AES 256 CBC в OpenSSL. Целта на кода по-долу е да генерира два произволни ключа за достъп, AES ключ и някои други публични данни. AES ключът ще се използва за обмен на споделени тайни.
Отказ от отговорност: НЕ съм експерт по криптография или системи за сигурност. Осъзнавам опасностите, но смисълът на това упражнение е академичен интерес. Ако има начинаещи грешки или нещо изцяло и опасно неправилно, моля, посочете го, за да ми помогнете в обучението.
// The key_generator() will produce the following public keys in addition
// to a couple of other private keys.
// public_identifier
// public_salt
// public_composite_identifier
// public_aes_key
int key_generator(/*some args*/)
{
// Step 1
//Obtain public_identifier. Possibly a hashed value of an unique ASCII string.
unsigned char *public_identifier;
// Step 2
//Generate 256 bit private_primary_random_passkey which is secret.
//This random key is generated once and reused later.
unsigned char *private_primary_random_passkey;
if(RAND_bytes(private_primary_random_passkey, 256) == 0)
return FAILURE;
// Step 3
//Generate private_composite_identifier using public_identifier
//and private_primary_random_passkey.
//IMPORTANT - The method to obtain private_composite_identifier
//may be publicly known.
//The public_identifier is also publicly known but the
//private_primary_random_passkey is secret.
unsigned char *private_composite_identifier;
//<Some code for generating private_composite_identifier>
//.....
//</code>
// Step 4
//Generate temporary temp_private_aes_key and temp_private_aes_IV;
//NOTE - Used dummy vars wherever key length is required.
//Assume correct length is passed in.
int aes_rounds = 25000;
unsigned char *temp_private_aes_key;
unsigned char *temp_private_aes_IV;
if(EVP_BytesToKey(EVP_aes_256_cbc(),
EVP_sha512(),
private_composite_identifier,
private_primary_random_passkey,
private_composite_identifier_length/8,
aes_rounds,
temp_private_aes_key,
temp_private_aes_IV) == 0)
return FAILURE;
// Step 5
//Generate 128 bit random salt which is public.
unsigned char *public_salt;
if(RAND_bytes(public_salt, 128) == 0)
return FAILURE;
// Step 6
//Generate private_composite_identifier and public_composite_identifier
//using temp_private_aes_key and public_salt.
unsigned char *public_composite_identifier;
unsigned char *private_composite_identifier;
if(EVP_BytesToKey(EVP_aes_256_cbc(),
EVP_sha512(),
temp_private_aes_key,
public_salt,
temp_private_aes_key_length/8,
aes_rounds,
private_composite_identifier,
public_composite_identifier) == 0)
return FAILURE;
// Step 7
//Generate 128 bit private_secondary_random_passkey which is secret.
//This random key is generated once and reused later.
unsigned char *private_secondary_random_passkey;
if(RAND_bytes(private_secondary_random_passkey, 128) == 0)
return FAILURE;
unsigned char *private_aes_key;
unsigned char *public_aes_key;
if(EVP_BytesToKey(EVP_aes_256_cbc(),
EVP_sha512(),
private_composite_identifier,
private_secondary_random_passkey,
private_composite_identifier_length/8,
aes_rounds,
private_aes_key,
public_aes_key) == 0)
return FAILURE
}
Ето моите въпроси:
- Трябва ли да се използва двойка ключове RSA вместо AES ключа? Защо едното би било предпочитано пред другото?
- Тъй като ключовете, използвани за създаване на двойката ключове, са дълги, произволно генерирани и солирани, безопасно ли е да използвате същата двойка ключове AES/RSA по-късно? Разбирам рисковете от таблиците на Rainbow и други мерки, но не се ли облекчават тези опасения с произволните соли и ключове, последвани от три нива на генериране на ключове?
- Какви са начините, по които злонамерен нападател може да пресъздаде двойката ключове или да разбие тази система, използвайки публично достъпните данни?
- Всякакви други точки, за които можете да се сетите, за да осуетите или подобрите тази система.
Благодаря за отделеното време.