2017-02-15 113 views
0

我在尝试移植使用scrypt生成密码的python脚本。将C uint8_t转换为python utf_16_be

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')) 

结果应该是:9f2117416c7b2de9419a81c4625a28e40c16ac92aaa3000bb2c35844b3839eb1

在C中,我使用libsodium crypto_pwhash_scryptsalsa208sha256_ll()函数。

如果我试图从变量传递密码:

const uint8_t password[] = "test123"; 

我没有得到相同的密钥。我试图从python脚本中移除“.encode(”utf_16_be“,”replace“)”,然后我得到相同的结果。

那么我怎样才能转换我的C变量是相同的python变量?

编辑:原始软件是在Java中,似乎编码字符串为UTF-16大端。现在我需要将C字符串编码为相同的格式。

+0

为什么不把它编码为ASCII?密码是否有可能包含任何非ascii字符? –

+0

我认为python软件必须支持unicode,所以这就是为什么它不是ascii。 – 01BTC10

+0

既然它是一个密码,你可能会限制它只ascii-only .. –

回答

0

我发现从灵感的解决方案:Create UTF-16 string from char*

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; 
} 

它的工作,但我不知道,这个解决方案是安全的。