一种基于aes加密的伪随机数生成器

本文介绍了一个名为`aesRand`的类,用于AES-128 CBC加密方式生成随机数。它强调了算法的安全性和效率,通过实例化和初始化种子实现随机性,与标准库random性能相当,但提供了额外的安全保障。
摘要由CSDN通过智能技术生成
    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: %d\n", 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相差无几
安全性上,无法通过当前值推算出下一个值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值