如何用Qt实现与Crypto-js一致的PBKDF2派生密钥?
Qt与Crypto-js PBKDF2输出不一致的解决方法
问题根源
- 参数单位差异:Crypto-js的
keySize是32位字长,不是字节。你设置的keySize:8实际派生的是8×4=32字节的密钥,所以输出是64位十六进制字符串(32字节转十六进制),而非你预期的8字节。 - 输出格式差异:Crypto-js的
toString()默认输出十六进制,而你的Qt代码用了toBase64(),格式不匹配。
修正后的Qt代码
要生成和Crypto-js完全一致的结果,需要调整派生长度为32字节,并将输出转为小写十六进制:
auto iterations = 10000; auto keyLen = 32; // 对应Crypto-js的keySize:8(每个keySize单位是4字节) auto res = QPasswordDigestor::deriveKeyPbkdf2( QCryptographicHash::Sha1, QString("water").toUtf8(), QString("saltsaltsalt").toUtf8(), iterations, keyLen ); // 转为小写十六进制字符串,和Crypto-js输出格式对齐 auto result = res.toHex().toLower();
验证结果
运行代码后,result的值将和Crypto-js示例输出完全一致:
04b72ee92a8850bfdbe7cf801348a6701d11931702dcecad52f0b3351bedd01c
内容的提问来源于stack exchange,提问作者Tiago Stein
相关产品推荐
相关产品推荐

