我正在尝试将以下哈希加密到base64:
6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096
需要访问网站的API。该网站使用CryptoJS.enc.Base64.stringify()
方法在JavaScript中显示示例脚本以加密哈希。
这种方法的结果是
a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=
但是,我尝试的每个在线base64加密工具都给出了以下结果:
NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==
我需要在C ++中创建编码字符串。我也已经尝试了4种不同的base64encode实现(OpenSSL和自定义代码),但我也得到了上面的结果,并且API总是回答我的字符串没有正确编码。
那么区别在哪里,有人知道CryptoJS.enc.Base64.stringify()
的C ++实现吗?
答案 0 :(得分:7)
让我们来电话
a = "6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096";
b = "a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=";
c = "NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==";
两次转换都是正确的,但取决于您的实际需求。
例如,以下两个方程式
toBase64FromBytes(toBytesFromUtf8(a)) == c
toBase64FromBytes(toBytesFromHex(a)) == b
信任某种在线计算器是一个坏主意,因为他们通常不会透露他们如何编码内容,因此您将获得任意结果。如果您自己编程,如果您按照文档获得预期的结果。
我怀疑你通过将哈希或加密结果打印到控制台得到a
,如下所示:
console.log(result.toString()); // a
CryptoJS中的大多数result
个对象都是WordArray
类型。当您在这样的对象上调用toString()
函数时,您将获得该二进制对象的十六进制编码字符串。
如果您打印result.toString(CryptoJS.enc.Base64)
,那么您将获得二进制结果的Base64编码字符串。
如果您使用a
并将其直接编码为Base64,则可能假设a
已经是字符串(例如UTF-8编码)。在线计算器不知道它是十六进制编码的。