2012-06-28 41 views
1

我有關於md5 :)的跨語言問題。 我有這樣的代碼在Java中:在C++ vs Java中的md5 base64編碼器

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哈希,我會得到完全不同的哈希(更長和更醜陋:))。

幫助!!!

謝謝!如AZI指出的,我使用openssl/md5.h中的MD5方法。

+0

請向我們展示您正在使用的C++代碼的相關部分。 – yms

+2

我猜測,如果函數給你一個十六進制字符串,你必須將它轉換爲一個字節序列{0x16,0xfe,0x1e,...,0x68},然後base-64將它編碼。不過,我對圖書館不夠熟悉,無法給出正確的答案。 –

+0

'someString.getBytes()'使用默認的OS /語言編碼;如果C++沒有這樣做,最好明確地給一個編碼:'someString.getBytes(「UTF-8」)或'「Windows-1252」'。 _遺憾的是,您的代碼不可能需要在多臺計算機上運行._對於C++,請搜索「Base64Encode」。 –

回答

3

這裏是C++代碼,即可獲得MD5

#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

+0

這正是我用來獲取md5的方法。但是,我如何在C++中將md5轉換爲base64格式(就像在你所提供的鏈接中一樣)? –

+0

請參閱最新的答案。 – Azi

0

解決的辦法是使用Azi和Mike Seymour所說的一切......因此,要獲得MD5哈希值,您必須使用Azi提供的解決方案。然後,Java中的東西使用了類似Mike的建議......它使用二進制編碼base64。

我的解決辦法是看代碼由阿紫提供的鏈接:

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

而且將它移植到C++。幸運的是,這並不難... 如果有人想要C++代碼,請留下評論。 謝謝大家!