JAVA 实现PRF 算法

本文介绍了使用MD5、SHA128或SHA256哈希函数的P_hash在Java中实现的PRF算法,涉及HMAC加密、秘钥处理和种子操作。方法利用Mac实例化HmacSHA256进行连续加密以生成输出。
摘要由CSDN通过智能技术生成
P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + 
HMAC_hash(secret, A(2) + seed) + 
HMAC_hash(secret, A(3) + seed) + ... 
其中 A(0) = seed A(i) = HMAC_hash(secret, A(i-1)) 

hash 为 md5,SHA128,SHA256...

PRF(secret, label, seed) = P_<hash>(secret, label + seed)

JAVA实现

/**
     * PRF算法
     * @param secretKey MAC加密秘钥 new SecretKeySpec(秘钥字节, "HmacSHA256")
     * @param label 标签
     * @param seed 种子
     * @param outPutLen 输出的长度
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     */
    public static byte[] prf(SecretKey secretKey, byte[] label, byte[] seed, int outPutLen) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(secretKey);

        byte[] labelSeed = ByteArrayUtil.byteMergerAll(label, seed);
        byte[] output = new byte[outPutLen];
        int offset = 0;
        // 先获取一次A(1)
        byte[] A0 = mac.doFinal(labelSeed);

        while (offset < outPutLen) {
            // 第一次循环得到 temp =  HMAC_hash(secret, A(1) + seed)
            byte[] temp = mac.doFinal(ByteArrayUtil.byteMergerAll(A0, labelSeed));
            System.arraycopy(temp, 0, output, offset, Math.min(temp.length, outPutLen - offset));
            offset += temp.length;
            // 对A0加密一次得到A1 关键就是不停的对A0进行加密
            A0 = mac.doFinal(A0);
        }

        return output;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

abbcccddddee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值