我是靠谱客的博主 天真萝莉,最近开发中收集的这篇文章主要介绍一种基于aes加密的伪随机数生成器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    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加密的伪随机数生成器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(91)

评论列表共有 0 条评论

立即
投稿
返回
顶部