概述
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加密的伪随机数生成器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复