CryptoJS.enc.Base64.stringify()和普通的Base64加密有什么区别?

8
我正在尝试将以下哈希加密为base64:
6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096

需要访问一个网站的API。该网站在JavaScript中显示了一个示例脚本,使用CryptoJS.enc.Base64.stringify()方法加密哈希值。 使用此方法得到的结果为:
a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=

然而,我尝试了所有的在线base64加密工具,但都得到了以下结果:
NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==

我需要在C++中创建编码字符串。 我已经尝试了4种不同的base64encode实现(OpenSSL和自定义代码),但仍然得到上面的结果,API始终回答我的字符串未正确编码。

那么有什么区别,并且有人知道一个的C++实现吗?


请查看以下链接:http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64.js,了解`stringify`和`parse`方法的详细信息。主要区别在于WordArray,它是CryptoJS数据格式无关的表示形式。 - Hackerman
1个回答

20

我们来称呼

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编码)。在线计算器不知道它是否是十六进制编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接