【发布时间】:2014-01-28 19:33:54
【问题描述】:
这是一个系统的存根,它将在 OpenSSL 中使用 AES 256 CBC 生成密钥对。下面代码的目的是生成两个随机密钥、一个 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 表和其他措施的风险,但这些担忧是否通过随机盐和密钥以及随后的三级密钥生成得到缓解?
- 恶意攻击者可以通过哪些方式重新创建密钥对或使用公开数据破坏此系统?
- 您能想到的任何其他可以阻止或增强此系统的要点。
感谢您的宝贵时间。
【问题讨论】:
-
AES 是对称的。 RSA 是不对称的。
-
@JonathonReinhart - 感谢您指出 n00b 错误。 :) 如果在第 7 步中我们从可用信息生成 RSA 密钥对并使用该密钥对进行未来加密,您能否重新考虑这些问题?
标签: c security encryption cryptography openssl