【问题标题】:md5 base64 encoder in C++ vs JavaC++ 与 Java 中的 md5 base64 编码器
【发布时间】:2012-06-28 15:36:32
【问题描述】:

我有一个关于 md5 的跨语言问题 :)。 我在 Java 中有这段代码:

BASE64Encoder encoder = new BASE64Encoder();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(someString.getBytes());
byte[] bMac = md.digest();
String anotherString = encoder.encodeBuffer(bMac);

这会在 md5 和 base64 中对字符串进行编码和哈希处理。像 "aaa&1" 这样的字符串变成 Fv4eRn4R0/mB+uc4j1GGaA==

现在的问题是:如何在 C++ 中做到这一点?我正在使用 openssl/md5.h,但与任何其他在线 md5 编码器一样(经过一个小的谷歌搜索),它会得到一个像这样的哈希: 16fe1e467e11d3f981fae7388f518668

看起来是十六进制的。如果我尝试在 base64 中转换 md5 哈希,我会得到一个完全不同的哈希(更长更丑:))。

求救!!!

谢谢!

L.E.:正如 AZI 所指出的,我使用 openssl/md5.h 中的 MD5 方法。

【问题讨论】:

  • 请向我们展示您正在使用的 C++ 代码的相关部分。
  • 我猜,如果函数给你一个十六进制字符串,你必须把它转换成字节序列{0x16,0xfe,0x1e,...,0x68},然后base-64编码。不过,我对图书馆不够熟悉,无法给出正确的答案。
  • someString.getBytes() 使用默认的操作系统/语言编码;如果 C++ 也没有这样做,最好明确给出编码:someString.getBytes("UTF-8")"Windows-1252"不幸的是,您的代码需要在多台计算机上运行并非不可能。对于 C++,请搜索“Base64Encode”。

标签: java c++ md5


【解决方案1】:

这里是获取md5的C++代码

#include <openssl/md5.h>
unsigned char *MD5(const unsigned char *d, 
               unsigned long n,
               unsigned char *md);

示例:

unsigned char inbuf[] = "aaa&1";
unsigned char outbuf[20];
MD5(inbuf, strlen(inbuf), outbuf);

for (i = 0; i < 20; i++) {
    printf("%02x ", outbuf[i]);
}

如果 16fe1e467e11d3f981fae7388f518668 的十六进制转换为 Base64 则 Hex to Base64 你将得到 Fv4eRn4R0/mB+uc4j1GGaA==

可以参考Howto base64 encode with C/C++ and OpenSSL将其编码为Base64

【讨论】:

  • 这正是我用来获取 md5 的方法。但是如何在 C++ 中从 md5 转换为 base64 格式(与您提供的链接完全相同)?
【解决方案2】:

解决方案是使用 Azi 和 Mike Seymour 所说的一切...所以,要获得 MD5 哈希,您必须使用 Azi 提出的解决方案。然后 Java 中的东西使用了 Mike 建议的东西......它从二进制编码为 base64。

我的解决办法是看阿子提供的链接中的代码:

http://tomeko.net/online_tools/hex_to_base64.php?lang=en

并将其移植到 C++ 中。幸运的是,这并不难做到…… 如果有人想要 C++ 代码,请发表评论。 谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多