Вот заглушка системы, которая будет генерировать пару ключей, используя 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 и другими мерами, но разве эти проблемы не облегчаются с помощью случайных солей и ключей, за которыми следуют три уровня генерации ключей?
- Какими способами злоумышленник может воссоздать пару ключей или взломать эту систему, используя общедоступные данные?
- Любые другие моменты, которые вы можете придумать, чтобы помешать или улучшить эту систему.
Спасибо за ваше время.