2011-02-09 72 views
2

哎呀iPhone上獲取正確HMACSHA1,我的頭好痛!使用OpenSSL的

語境

我需要寫一些C/Objective-C代碼來解密存儲在遠程服務器上的文件。加密是開源的,並用C#編寫

我使用的是從這個項目libssl.a和libcrypto.a;

https://github.com/x2on/OpenSSL-for-iPhone

我的第一個障礙是,即使得到一個字符串的HMACSHA1是正確的:(該SHA1似乎根據參考網站這裏是正確的 - http://hash.online-convert.com/sha1-generator但HMAC也不行,所以現在一些。代碼;

NSString *input = @"wombats"; 

// Define some strings etc that we need 

unsigned char *inStrg = malloc(256);  
inStrg = (unsigned char *)[input UTF8String]; 
unsigned long lngth = [input length]; 
unsigned char result [EVP_MAX_MD_SIZE]; 
unsigned char hmacresult [EVP_MAX_MD_SIZE]; 

unsigned char newPassPhrase[25]; 
memset(newPassPhrase, 0, 25); 

unsigned char salt[] = "\x01\x02\x03\x04\x05\x06\x07\x08"; 

// The real code requires us to re-hash the input 1000 times. For now lets 
// just check it with 10 (hey even the first is wrong). 

for (int i=0; i<10; i++) 
{ 

// Use openssl 

SHA_CTX shaContext; 
SHA1_Init(&shaContext);  
SHA1_Update(&shaContext, inStrg, lngth); 
SHA1_Final(result, &shaContext); 

unsigned int len; 

// If I look at result now, it matches the reference, so I think it is the next stage that goes wrong. 

HMAC(EVP_sha1(),salt,8,result,20,hmacresult,&len); 

printf("HMAC ----------------- : "); 
hexPrint(hmacresult,len); 

// Copy the result to the input so we can re-hash; 

lngth = len; 
memcpy((char *)inStrg,(char *)hmacresult,len); 

} 

我試圖匹配該代碼是下面的C#片段此代碼生成正確的輸出,並從生產服務器的提取物

byte[] salt={0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 
UTF8Encoding utf8 = new UTF8Encoding(); 

byte[] data = utf8.GetBytes("wombats"); 

HMACSHA1 sha1= new HMACSHA1(); 
sha1.Key = salt; 

for(int i=0; i<10; i++) 
{ 
    sha1.ComputeHash(data); 
    data = sha1.Hash; 
    Console.WriteLine(System.BitConverter.ToString(data)); 
} 

如果我編譯並運行C#代碼,我得到的輸出是以下序列;

DC-F3-1C-C1-2F-8A-86-16-CC-74-1E-DA-25-7B-FF-16-6E-EB-2A-0F 
E7-6A-F4-C6-73-07-DB-E8-52-82-9E-D1-96-BF-06-95-85-C6-94-F4 
1F-E2-61-BC-F0-08-92-3C-14-70-2B-89-EB-46-C9-20-A5-90-65-9B 
etc 

如果我看從iPhone版本的輸出,我得到以下;

44-35-5b-bb-41-0e-bc-c3-d3-58-62-e6-5c-a0-51-6b-bc-97-11-f6 
4c-3b-61-bd-1f-f7-72-13-af-1b-5e-5e-e3-70-8a-31-08-11-67-f2 
41-56-8d-41-c1-3e-02-d0-d2-76-ad-d3-49-ba-71-ff-34-d7-3e-8b 
etc 

因此,顯然有嚴重的錯誤。

如果我只檢查SHA1部分,這似乎是正確的,所以我猜測要麼我使用HMAC的錯誤參數,要麼C#HMACSHA1做了與我的期望不同的事情。

我要補充一點,如果我用一個合適的ASCII鹽,在線生成的結果,在這裏http://hash.online-convert.com/sha1-generator也匹配的C#代碼強烈讓我懷疑這是我的,這是錯誤的iPhone℃。

任何人都可以幫助我解決這個難題是什麼,我跑出來的,此刻的想法!

+0

好,我已經解決了 - DOH!令人驚訝的是,多次將它寫出來可以使該便士下降。我是雙SHA1哈希 - 下降,它一切正常! – Roger 2011-02-09 19:25:11

回答

1

刪除重複的SHA1修復它。 DOH!

SHA_CTX shaContext; 
SHA1_Init(&shaContext);  
SHA1_Update(&shaContext, inStrg, lngth); 
SHA1_Final(result, &shaContext); 

刪除所有這些。

0

這可能是值得你花時間去使用<CommonCrypto/CommonHMAC.h>中的方法(不是框架,只是在/usr/include的標題)。