当前位置: 代码迷 >> python >> 将C uint8_t转换为python utf_16_be
  详细解决方案

将C uint8_t转换为python utf_16_be

热度:50   发布时间:2023-06-16 10:06:56.0

我正在尝试移植使用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'))

结果应该是:9f2117416c7b2de9419a81c4625a28e40c16ac92aaa3000bb2c35844b3839eb1

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

如果我尝试通过该变量传递密码:

const uint8_t password[] = "test123"; 

我没有获得相同的钥匙。 我试图从python脚本中删除“ .encode(“ utf_16_be”,“替换”)“,然后得到相同的结果。

那么如何将C变量转换为与python变量相同的变量呢?

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

我发现了一个受启发的解决方案:

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

它确实可以工作,但是我不确定该解决方案是否安全。