基于口令的密钥派生函数用(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
相关资料