class aesRand
{
public:
using cipher_evp_t = EVP_CIPHER_CTX;
static aesRand& instance(){
static aesRand _instance;
return _instance;
}
aesRand():enc(nullptr), index(0){
}
private:
cipher_evp_t *enc;
int index;
unsigned char buf[2][32];
public:
void init(uint32_t seed)
{
unsigned char ivec[16] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
};
const unsigned char key[] = {"1234567812345678"};
memset(buf, 0, sizeof(char)*2*32);
if(enc){
EVP_CIPHER_CTX_free(enc);
enc = nullptr;
}
enc = EVP_CIPHER_CTX_new();
int32_t ret = EVP_EncryptInit_ex(enc, EVP_aes_128_cbc(), NULL, key, ivec);
if(ret == 0){
return;
}
printf("seed: %dn", seed);
*(int32_t*)buf[index] = seed;
return;
}
long random(){
encrypt(buf[index], buf[!index]);
index = !index;
return *(long*)buf[index];
}
void encrypt(const unsigned char *buf_in, unsigned char *buf_out){
int out_len = 32;
EVP_EncryptUpdate(enc, buf_out,&out_len, buf_in, 32) ;
}
};
#define aes_srand(seed) aesRand::instance().init(seed)
#define aes_random() aesRand::instance().random()
//test code
aes_srand(time(NULL));
long rand_value = aes_random();
效率上与libc的random相差无几
安全性上,无法通过当前值推算出下一个值
最后
以上就是天真萝莉最近收集整理的关于一种基于aes加密的伪随机数生成器的全部内容,更多相关一种基于aes加密内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复