CryptoJS.enc.Base64.stringify() 与普通Base64加密的区别

Difference between CryptoJS.enc.Base64.stringify() and normal Base64 encryption

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

6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096

需要访问网站API。该网站在 JavaScript 中显示了一个使用 CryptoJS.enc.Base64.stringify() 方法加密散列的示例脚本。 这种方法的结果是

a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=

但是,我尝试过的每个在线 base64 加密工具都会给我以下结果:

NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==

我需要用 C++ 创建编码字符串。我也已经尝试了 4 种不同的 base64encode 实现(OpenSSL 和自定义代码),但我也得到了上述结果,并且 API 总是回答我的字符串未正确编码。

那么区别在哪里,有人知道 CryptoJS.enc.Base64.stringify() 的 C++ 实现吗?

我们打电话

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