linux ascii到utf-16(然后是sha1和base64)编码
linux ascii to utf-16 (then sha1 and base64) encode
我们有一个通信协议,要求我们对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
在to_string上运行sha1和base64编码,长度为22
结果输出:GCXe7HMDoq/NRqo1WWYJDDYZzP0=
如果我循环到_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(Little Endian):
$ echo -e $(echo -n 'TESTED@8691' | iconv -f utf-8 -t utf-16le | sha1sum - | egrep -o '[0-9a-f]+' | sed -r 's/(..)/\x1/g') | tr -d 'n' | base64
rBbBKqbJodT5awZal/CSCYF/sFo=
对于Big Endian,我得到了YrAwH9v3d88gjvsg0Hypu2Cfjc8=
,这不是你的结果,所以我认为endianness不是这里的问题。
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
处理的字节数。
来自维基百科。
对于互联网协议,IANA已经批准了"UTF-16"、"UTF-16BE"answers"UTF-16LE"作为这些编码的名称。(名字是大小写的不敏感。)别名UTF_16或UTF16在某些情况下可能是有意义的编程语言或软件应用程序,但它们不是互联网协议中的标准名称。
我假设UTF-16BE
和UTF-16LE
分别是Big Endian和Little Endian编码。使用UTF-16的几率很高,但输入数据的端序"错误"。
编辑:快速搜索证实了我的怀疑UTF-16LE是"UTF-16,小恩迪亚"。您的输入数据是Big Endian的几率非常高。如果是这种情况,则所有"高端"UTF-16字节都被放置在"低端"字节位置(反之亦然)。
看看"UTF-16BE"是否能达到预期效果。
- 使用Qt C++计算类似Git的SHA1哈希
- 无法解码base64+deflate数据
- 为什么读取函数在 sha1 c++ 实现中不起作用?
- Base64 图像编码不正确
- 编译时 Base64 解码 C++
- Base64 图像比较
- 升压sha1的不同输出和相同输入的openssl库
- 将 BGR 图像转换为 jpeg 格式的 base64 字符串
- 如何在 c++ 中将 IStream 转换为 Base64 字符串
- 通过 TCP 套接字发送大型 base64 字符串
- 为什么我的从base64解码的函数不起作用?
- 解码 c++ 中以 base64 编码的大量数据
- 是否有函数可以将 base64 字符串解码为张量流 c++ 中的张量
- 解码并保存 base64 C++中的图像文件
- 为什么这个base64解码/编码功能不能正常工作?
- boost SHA1 哈希与 md5sum/sha1sum 的运行时比较
- 将图像.jpg转换为 Base64
- BASE64图像文件用C 编码
- Arduino SHA1-HMAC 和 base64 编码与 Python 之间的问题
- linux ascii到utf-16(然后是sha1和base64)编码