基于口令的密钥派生——scrypt PBKDF

        基于口令的密钥派生函数用(PBKDF)于密码学和安全协议,用于从一个密钥值派生一个或多个密钥。PBKDF算法有PKCS #5、PKCS #12PBKDF1、PBKDF2、scrypt PBKDF等,PKCS #5、PBKDF1、PBKDF2对比研究可参考图表——基于口令的密钥派生标准对比分析,本文主要对scrypt PBKDF算法进行研究。

        scrypt算法应用了PBKDF2算法,并且包含了Salsa20/8 Core Function、scryptBlockMix Algorithm、scryptROMix Algorithm,算法具体描述如下:

1. The Salsa20/8 Core Function

        Salsa20/8 Core是Salsa20 Core的一个循环变体。它是一个从64字节字符串到64字节字符串的哈希函数。注意,Salsa20/8 Core不是一个加密哈希函数,因为它不具有碰撞抗性。算法C语言代码如下图所示:

2. The scryptBlockMix Algorithm

 输入参数

       r: 块的数量。

       B :  B[0] || B[1] || ... || B[2*r-1],长度为128 * r 字节长度的字符串,作为 2*r 个64字节长的字符串组;即B[i](i=0,1,...,2*r-1)为64字节长度的字符串组

输出参数:

         B'[0] || B'[1] || ... || B'[2*r-1] :128 * r 字节长度的字符串

执行步骤:

步骤1:

        X = B[2*r - 1]

步骤2:

        for i = 0,1,..., 2*r-1

              T =  X  xor  B[ i ]

               X = salsa(T)

               Y [i]  = X

        end for

步骤3 :

         B' = Y[0] || Y[2] || ... || Y[2 * r - 2] || Y[1] || Y[3] || ... || Y[2 * r - 1]

其中,salsa为Salsa20/8 Core Function。

返回数据

        B'

3. The scryptROMix Algorithm

 输入参数

        r: 块的数量。

        B : 长度为128 * r 字节长度的字符串。

        N:CPU/内存消耗参数,2的幂次,大于1,小于2^(128 * r / 8 )

输出参数:

         B':128 * r 字节长度的字符串

执行步骤:

 步骤1:

        X = B

步骤2:

        for i = 0,1,..., N-1

             V [i] =  X

             X = scryptBlockMix(X)

        end for

 步骤3 :

        for i = 0,1,..., N-1

              j = int ( X ) mod N   (int (  B[0] || B[1] || ... || B[2*r-1] ) 定义为B[2*r-1] 小端存储的整数integer)

              T = X  xor  V [ j ]

              X = scryptBlockMix(X)

        end for

返回数据

        B'  = X

4. The scrypt Algorithm

输入参数

        P:口令字符串

        S:盐值

        N:CPU/内存消耗参数,2的幂次,大于1,小于2^(128 * r / 8 )

        r: 块的数量。

        parallel:执行的并行混淆操作的次数       

        dkLen:导出密钥DK的字节长度,≤ (2^32 – 1) × hLen,hLen为32

输出参数:

         DK:导出密钥

执行步骤:

步骤1:

        初始化一个数组B,该数组由parallel 个128 *r字节的块组成,如下:

         B[0] || B[1] || ... || B[p-1] = PBKDF2-HMAC-SHA256(P, S, 1, p * 128 * r),即使用PBKDF2算法生成p * 128 * r字节长的字符串,其迭代次数为1。

步骤2:

           for i = 0,1,..., parallel -1

                  B[i] = scryptROMix (r, B[i], N)

            end for

步骤3 :

        DK = PBKDF2-HMAC-SHA256(P,  B[0] || B[1] || ... || B[p-1]​​​​​​​, 1, dkLen)
返回数据:

       DK

相关资料

The scrypt Password-Based Key Derivation Function

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值