栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

        基于口令的密钥派生函数用(PBKDF)于密码学和安全协议,用于从一个密钥值派生一个或多个密钥。PBKDF算法有PKCS #5、PKCS #12、PBKDF1、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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921030.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号