gpt4 book ai didi

c++ - linux ascii 到 utf-16(然后是 sha1 和 base64)编码

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:12 28 4
gpt4 key购买 nike

我们有一个通信协议(protocol),要求我们对 UTF-16 编码密码的 SHA1 哈希进行 Base64 编码。我们已经获得了 Java、javascript 和 visual basic 示例,但是我们在 Linux (redhat) 下运行

提供的测试字符串:TESTED@8691
最终输出:rBbBKqbJodT5awZal/CSCYF/sFo=

我试过了

iconv_t conv = iconv_open("UTF-16LE","ASCII"); // open succeeds
char *from_string=strdup("TESTED@8691");
size_t from_length=strlen(from_string);
size_t to_length=from_length*3;
size_t original_to_length=to_length;

char *to_string=(char*)calloc(1,to_length);
int convert_return=iconv(conv,&from_string,&from_length,&to_string,&to_length);
// convert_return is 0 indicating success, to_length is 11, from_length is 0

对长度为22的to_string进行sha1和base64编码
结果输出:GCXe7HMDoq/NRqo1WWYJDDYZzP0=

如果我遍历 to_string 我得到:

for (int i=0; i<original_to_length-to_length; ++i) {
printf("to_string %d = %x",i,to_string[i]);
}

output:
to_string 0 = 0
to_string 1 = 0
to_string 2 = 0
to_string 3 = 0
to_string 4 = 0
to_string 5 = 0
to_string 6 = 0
to_string 7 = 0
to_string 8 = 0
to_string 9 = 0
to_string 10 = 0
to_string 11 = 0
to_string 12 = 0
to_string 13 = 0
to_string 14 = 21
to_string 15 = 0
to_string 16 = 0
to_string 17 = 0
to_string 18 = 4
to_string 19 = 7e
to_string 20 = 13
to_string 21 = e

这是 javascript 转换:

function str2rstr_utf16le(input)
{
var output = "";
for(var i = 0; i < input.length; i++)
output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
(input.charCodeAt(i) >>> 8) & 0xFF);

return output;
}

我错过了什么?
谢谢你

最佳答案

我使用 shell 脚本进行了检查,看起来你得到的结果确实是正确的,只要你假设 UTF-16 是 UTF-16LE(小端):

$ echo -e $(echo -n 'TESTED@8691' | iconv -f utf-8 -t utf-16le | sha1sum - | egrep -o '[0-9a-f]+' | sed -r 's/(..)/\\x\1/g') | tr -d '\n'  | base64
rBbBKqbJodT5awZal/CSCYF/sFo=

对于 Big-Endian,我得到 YrAwH9v3d88gjvsg0Hypu2Cfjc8= 这不是您的结果,所以我认为字节顺序不是这里的问题。

man page for iconv(3)状态:

The  iconv  function converts one multibyte character at a
time, and for each character conversion it increments
*inbuf and decrements *inbytesleft by the number of con­
verted input bytes, it increments *outbuf and decrements
*outbytesleft by the number of converted output bytes, and
it updates the conversion state contained in cd.

这表明 iconv 修改了您的目标缓冲区指针 (to_string) - 这就是为什么您将它传递给 &to_string,而不是 to_string 本身。因此,您可能需要在 iconv 之后和进一步操作(SHA1 和 BASE64)之前减去从 to_string 处理的字节数。

关于c++ - linux ascii 到 utf-16(然后是 sha1 和 base64)编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687434/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com