2013-01-12 36 views
1

我一直在努力從openssl/sha.h獲取sha1()函數,但是我得到了隨機輸出和一些警告。我已經閱讀了很多內容,並嘗試了一些示例代碼,但是我收到了所有警告,並且顯示不正確。C中的SHA1錯誤實現

這裏是代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <openssl/sha.h> 

int main() 
{ 
const unsigned char data[] = "Hello, World"; 
unsigned long length = sizeof(data); 
unsigned char hash[SHA_DIGEST_LENGTH]; 
SHA1(data, length, hash); 
printf("%02x \n", hash); 
return 0; 

} 

下面是我收到警告:

sha.c: In function ‘main’: 
sha.c:12: warning: ‘SHA1’ is deprecated (declared at /usr/include/openssl/sha.h:124) 
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’ 
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’ 

當我運行它,我得到的輸出: 62652b34

任何幫助將是大!

+1

如果比較的結果一些試驗檯的數據,確保長度是正確的。在大多數情況下,「Hello,World」的長度應該是12,但在這裏我認爲它是13,因爲sizeof()也是ascii零字符。 –

回答

2

在我全力以赴之前,我還花了一段時間。最好的方法是使用EVP,它爲幾乎所有的東西提供通用功能。

#include <openssl/evp.h> 

在調用散列函數之前,您需要調用此im main。初始化你的哈希。否則,openssl會抱怨算法不可用。

OpenSSL_add_all_algorithms(); 

模式必須是 「SHA256」, 「SHA512」, 「SHA1」 的字符串。 dataToHash是輸入,數據尺寸是輸入的大小, outHashed應該已經被分配,哈希將在那裏寫

unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) { 
    unsigned int md_len = -1; 
    const EVP_MD *md = EVP_get_digestbyname(mode); 
    if(NULL != md) { 
     EVP_MD_CTX mdctx; 
     EVP_MD_CTX_init(&mdctx); 
     EVP_DigestInit_ex(&mdctx, md, NULL); 
     EVP_DigestUpdate(&mdctx, dataToHash, dataSize); 
     EVP_DigestFinal_ex(&mdctx, outHashed, &md_len); 
     EVP_MD_CTX_cleanup(&mdctx); 
    } 
    return md_len; 
} 

的使用示例(這不是測試,我使用上面的代碼在C++包裝)

const char *inData = "test data2"; 
unsigned char outHash[20]; // output is already allocated 
hash("SHA1", inData, 10, outHash); 

你不應該使用SHA1我直接推薦它不推薦使用(你的代碼可能會在下一個版本中爆發)。 如果你想使用你的版本,你需要打印的每個字符爲十六進制:

int i; 
for(i=0; i<SHA_DIGEST_LENGTH; i++) { 
    printf("%02x", hash[i]); 
} 
+0

感謝您的幫助。我也有evp.h的棄用問題。是否有什麼不同,我想現在使用其他人呢? –

+0

@ user1626342嗯,這很奇怪,你應該不會有任何問題與evp被棄用。你能發佈代碼/警告嗎? – Ha11owed

+0

我猜想,因爲我使用的是mac OS,所以我不得不添加一堆if header。 –

0

通過打印無符號的字符

+0

這是不對的。這將發送散列的數組地址作爲無符號min-two-diget int打印,如果值<10(我幾乎可以向你保證)。這和OP的代碼之間的唯一區別是它將地址輸出爲無符號整型而不是十六進制。這兩個都不正確。 – WhozCraig

1

不能轉儲整個緩衝區這樣刪除的警告。你需要循環它,比如下面。您獲得的輸出值實際上是hash緩衝區的地址,這顯然不是您要查找的內容。要在緩衝區中的十六進制字節傾倒文本

所以......

int main() 
{ 
    const unsigned char data[] = "Hello, World"; 
    unsigned long length = sizeof(data); 
    unsigned char hash[SHA_DIGEST_LENGTH]; 
    SHA1(data, length, hash); 

    int i=0; 
    for (;i< sizeof(hash)/sizeof(hash[0]);++i) 
     printf("%02x \n", hash[i]); 

    return 0; 

} 

關於你的警告,棄用是因爲該接口是過時的執行加密運算你嘗試(SHA1)。 OpenSSL中有更新的接口是當前的。特別考慮EVP接口。