c++实现java的SHA1PRNG算法

 java AES 中出现的随机算法 SHA1PRNG 生成key:

// 对密钥进行处理
    private static byte[] getRawKey(byte[] seed) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance(AES);
        //for android
        SecureRandom sr = null;
        // 在4.2以上版本中,SecureRandom获取方式发生了改变
         if (android.os.Build.VERSION.SDK_INT >= 17) {
             sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
         } else {
            sr = SecureRandom.getInstance(SHA1PRNG);
         }
        // for Java
        // secureRandom = SecureRandom.getInstance(SHA1PRNG);
        sr.setSeed(seed);
        kgen.init(128, sr); //256 bits or 128 bits,192bits
        //AES中128位密钥版本有10个加密循环,192比特密钥版本有12个加密循环,256比特密钥版本则有14个加密循环。
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

对应C++来说,就是做了两次sha1,流程如下:

1.生成安全密钥:

1)要加密的key明文:假设为dplyjc

2).将加密的string字符串明文调用sha1哈希出字节流形式的key

3).将sha1重置后,再调用sha1,传入字节流形式的key,生成字节流形式的key值。

class SHA1PRNG {
public:
    SHA1PRNG(const std::string& seed) : state(seed) {}

    std::string nextBytes(int numBytes) {
        std::string output;
        while (output.size() < numBytes) {
            byte hash[CryptoPP::SHA1::DIGESTSIZE];
            CryptoPP::SHA1().CalculateDigest(hash, (byte*)state.data(), state.size());
            state.assign((char*)hash, CryptoPP::SHA1::DIGESTSIZE);
            CryptoPP::SHA1().CalculateDigest(hash, (byte*)state.data(), state.size());
            state.assign((char*)hash, CryptoPP::SHA1::DIGESTSIZE);
            output += state;
        }
        return output.substr(0, numBytes);
    }

private:
    std::string state;
};

调用

SHA1PRNG prng("dplyjc");
std::string rawKey = prng.nextBytes(16); //key

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子建莫敌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值