我正在尝试移植一个使用scrypt生成密码的python脚本。
import pylibscrypt
scrypt = pylibscrypt.scrypt
password = 'test123'.encode("utf_16_be", "replace")
salt = '384eaed91035763e'.decode('hex')
key = scrypt(password, salt, 16384, 8, 1, 32)
print (key.encode('hex'))
结果应为:9F2117416C7B2DE9419A81C4625A28E40C16AC92AAAAAAAAAA3000BB2C35844B3839EB1
在C中,我使用libsodium crypto_pwhash_scryptsalsa208sha256_ll()函数。
如果我尝试从该变量传递密码:
const uint8_t password[] = "test123";
我没有得到相同的钥匙。我尝试从Python脚本中删除。
那么如何将我的C变量转换为与Python变量相同?
编辑:原始软件在Java中,似乎将字符串编码为UTF-16 Big Endian。现在,我需要将C字符串编码为同一格式。
我找到了一个从以下启发的解决方案:从char*
中创建UTF-16字符串 size_t uint8_t_UTF_16(uint8_t *input, uint8_t *output, size_t inlen) {
size_t outlen = 0.0;
for (size_t i = 0; i < inlen; i++) {
if (isascii(input[i])) {
output[i] = 0;
output[i + 1] = input[i / 2];
i++;
outlen += 2;
} else {
output[i] = input[i];
outlen += 0.5;
}
}
return outlen;
}
它确实有效,但我不确定该解决方案是否安全。