日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenSSL】OpenSSL之SHA

發布時間:2024/4/24 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenSSL】OpenSSL之SHA 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. SHA-1介紹
    • 02. SHA-0和SHA-1
      • 2.1 SHA-0的破解
      • 2.2 SHA-1的破解
    • 03. OpenSSL中SHA
    • 04. SHA1測試
    • 05. 附錄

01. SHA-1介紹

SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)是一種密碼散列函數,美國國家安全局設計,并由美國國家標準技術研究所(NIST)發布為聯邦數據處理標準(FIPS)。SHA-1可以生成一個被稱為消息摘要的160位(20字節)散列值,散列值通常的呈現形式為40個十六進制數。

SHA-1已經不再視為可抵御有充足資金、充足計算資源的攻擊者。2005年,密碼分析人員發現了對SHA-1的有效攻擊方法,這表明該算法可能不夠安全,不能繼續使用,自2010年以來,許多組織建議用SHA-2或SHA-3來替換SHA-1。Microsoft、Google以及Mozilla都宣布,它們旗下的瀏覽器將在2017年前停止接受使用SHA-1算法簽名的SSL證書。

2017年2月23日,CWI Amsterdam與Google宣布了一個成功的SHA-1碰撞攻擊,發布了兩份內容不同但SHA-1散列值相同的PDF文件作為概念證明。

02. SHA-0和SHA-1

最初載明的算法于1993年發布,稱做安全散列標準(Secure Hash Standard),FIPSPUB 180。這個版本現在常被稱為SHA-0。它在發布之后很快就被NSA撤回,并且由1995年發布的修訂版本FIPS PUB 180-1(通常稱為SHA-1)取代。SHA-1和SHA-0的算法只在壓縮函數的消息轉換部分差了一個比特的循環位移。根據NSA的說法,它修正了一個在原始算法中會降低散列安全性的弱點。然而NSA并沒有提供任何進一步的解釋或證明該弱點已被修正。而后SHA-0和SHA-1的弱點相繼被攻破,SHA-1似乎是顯得比SHA-0有抵抗性,這多少證實了NSA當初修正算法以增進安全性的聲明。

SHA-0和SHA-1可將一個最大2比特的消息,轉換成一串160位的消息摘要;其設計原理相似于MIT教授Ronald L. Rivest所設計的密碼學散列算法MD4MD5

2.1 SHA-0的破解

在CRYPTO98上,兩位法國研究者提出一種對SHA-0的攻擊方式:在2的計算復雜度之內,就可以發現一次碰撞(即兩個不同的消息對應到相同的消息摘要);這個數字小于生日攻擊法所需的2,也就是說,存在一種算法,使其安全性不到一個理想的散列函數抵抗攻擊所應具備的計算復雜度。

2004年時,Biham和Chen也發現了SHA-0的近似碰撞,也就是兩個消息可以散列出幾乎相同的數值;其中162比特中有142比特相同。他們也發現了SHA-0的完整碰撞(相對于近似碰撞),將本來需要80次方的復雜度降低到62次方。

2004年8月12日,Joux, Carribault, Lemuet和Jalby宣布找到SHA-0算法的完整碰撞的方法,這是歸納Chabaud和Joux的攻擊所完成的結果。發現一個完整碰撞只需要2的計算復雜度。他們使用的是一臺有256顆Itanium2處理器的超級計算機,約耗80,000 CPU工時。

2004年8月17日,在CRYPTO2004的Rump會議上,王小云,馮登國(Feng)、來學嘉(Lai),和于紅波(Yu)宣布了攻擊MD5、SHA-0和其他散列函數的初步結果。他們攻擊SHA-0的計算復雜度是2,這意味著他們的攻擊成果比Joux還有其他人所做的更好。請參見MD5安全性。

2005年二月,王小云和殷益群、于紅波再度發表了對SHA-0破密的算法,可在2的計算復雜度內就找到碰撞。

2.2 SHA-1的破解

鑒于SHA-0的破密成果,專家們建議那些計劃利用SHA-1實現密碼系統的人們也應重新考慮。在2004年CRYPTO會議結果公布之后,NIST即宣布他們將逐漸減少使用SHA-1,改以SHA-2取而代之。

2005年,Rijmen和Oswald發表了對SHA-1較弱版本(53次的加密循環而非80次)的攻擊:在2的計算復雜度之內找到碰撞。

2005年二月,王小云、殷益群及于紅波發表了對完整版SHA-1的攻擊,只需少于2的計算復雜度,就能找到一組碰撞。(利用生日攻擊法找到碰撞需要2的計算復雜度。)

這篇論文的作者們寫道;“我們的破密分析是以對付SHA-0的差分攻擊、近似碰撞、多區塊碰撞技術、以及從MD5算法中查找碰撞的消息更改技術為基礎。沒有這些強力的分析工具,SHA-1就無法破解。”此外,作者還展示了一次對58次加密循環SHA-1的破密,在2個單位操作內就找到一組碰撞。完整攻擊方法的論文發表在2005年八月的CRYPTO會議中。

殷益群在一次面談中如此陳述:“大致上來說,我們找到了兩個弱點:其一是前置處理不夠復雜;其二是前20個循環中的某些數學運算會造成不可預期的安全性問題。”

2005年8月17日的CRYPTO會議尾聲中王小云、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在2個計算復雜度內找到碰撞。

2006年的CRYPTO會議上,Christian Rechberger和Christophe De Cannière宣布他們能在容許攻擊者決定部分原消息的條件之下,找到SHA-1的一個碰撞。

在密碼學的學術理論中,任何攻擊方式,其計算復雜度若少于暴力搜索法所需要的計算復雜度,就能被視為針對該密碼系統的一種破密法;但這并不表示該破密法已經可以進入實際應用的階段。

就應用層面的考量而言,一種新的破密法出現,暗示著將來可能會出現更有效率、足以實用的改良版本。雖然這些實用的破密法版本根本還沒誕生,但確有必要發展更強的散列算法來取代舊的算法。在“碰撞”攻擊法之外,另有一種反譯攻擊法(Pre-image attack),就是由散列出的字符串反推原本的消息;反譯攻擊的嚴重性更在碰撞攻擊之上,但也更困難。在許多會應用到密碼散列的情境(如用戶密碼的存放、文件的數字簽名等)中,碰撞攻擊的影響并不是很大。舉例來說,一個攻擊者可能不會只想要偽造一份一模一樣的文件,而會想改造原來的文件,再附上合法的簽名,來愚弄持有公鑰的驗證者。另一方面,如果可以從密文中反推未加密前的用戶密碼,攻擊者就能利用得到的密碼登錄其他用戶的賬戶,而這種事在密碼系統中是不能被允許的。但若存在反譯攻擊,只要能得到指定用戶密碼散列過后的字符串(通常存在影檔中,而且可能不會透露原密碼信息),就有可能得到該用戶的密碼。

2017年2月23日,Google公司公告宣稱他們與CWI Amsterdam合作共同創建了兩個有著相同的SHA-1值但內容不同的PDF文件,這代表SHA-1算法已被正式攻破。

03. OpenSSL中SHA

sha.h內容如下

/** Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the OpenSSL license (the "License"). You may not use* this file except in compliance with the License. You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#ifndef HEADER_SHA_H # define HEADER_SHA_H# include <openssl/e_os2.h> # include <stddef.h>#ifdef __cplusplus extern "C" { #endif/*-* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!* ! SHA_LONG has to be at least 32 bits wide. !* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ # define SHA_LONG unsigned int# define SHA_LBLOCK 16 # define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a* contiguous array of 32 bit wide* big-endian values. */ # define SHA_LAST_BLOCK (SHA_CBLOCK-8) # define SHA_DIGEST_LENGTH 20typedef struct SHAstate_st {SHA_LONG h0, h1, h2, h3, h4;SHA_LONG Nl, Nh;SHA_LONG data[SHA_LBLOCK];unsigned int num; } SHA_CTX;int SHA1_Init(SHA_CTX *c); int SHA1_Update(SHA_CTX *c, const void *data, size_t len); int SHA1_Final(unsigned char *md, SHA_CTX *c); unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); void SHA1_Transform(SHA_CTX *c, const unsigned char *data);# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a* contiguous array of 32 bit wide* big-endian values. */typedef struct SHA256state_st {SHA_LONG h[8];SHA_LONG Nl, Nh;SHA_LONG data[SHA_LBLOCK];unsigned int num, md_len; } SHA256_CTX;int SHA224_Init(SHA256_CTX *c); int SHA224_Update(SHA256_CTX *c, const void *data, size_t len); int SHA224_Final(unsigned char *md, SHA256_CTX *c); unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); int SHA256_Init(SHA256_CTX *c); int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); int SHA256_Final(unsigned char *md, SHA256_CTX *c); unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); void SHA256_Transform(SHA256_CTX *c, const unsigned char *data);# define SHA224_DIGEST_LENGTH 28 # define SHA256_DIGEST_LENGTH 32 # define SHA384_DIGEST_LENGTH 48 # define SHA512_DIGEST_LENGTH 64/** Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64* being exactly 64-bit wide. See Implementation Notes in sha512.c* for further details.*/ /** SHA-512 treats input data as a* contiguous array of 64 bit* wide big-endian values.*/ # define SHA512_CBLOCK (SHA_LBLOCK*8) # if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) # define SHA_LONG64 unsigned __int64 # define U64(C) C##UI64 # elif defined(__arch64__) # define SHA_LONG64 unsigned long # define U64(C) C##UL # else # define SHA_LONG64 unsigned long long # define U64(C) C##ULL # endiftypedef struct SHA512state_st {SHA_LONG64 h[8];SHA_LONG64 Nl, Nh;union {SHA_LONG64 d[SHA_LBLOCK];unsigned char p[SHA512_CBLOCK];} u;unsigned int num, md_len; } SHA512_CTX;int SHA384_Init(SHA512_CTX *c); int SHA384_Update(SHA512_CTX *c, const void *data, size_t len); int SHA384_Final(unsigned char *md, SHA512_CTX *c); unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); int SHA512_Init(SHA512_CTX *c); int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); int SHA512_Final(unsigned char *md, SHA512_CTX *c); unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); void SHA512_Transform(SHA512_CTX *c, const unsigned char *data);#ifdef __cplusplus } #endif#endif

函數說明

SHA1算法,是對MD5的升級,計算結果長度20個字節;推薦用戶使用此算法, SHA256,SHA384,SHA512是對SHA1的升級;函數的使用方法同SHA1相同。int SHA_Init(SHA_CTX *c); 初始化SHA Context; 返回值: 1 成功,0 失敗;int SHA_Update(SHA_CTX *c, const void *data, size_t len); 用戶循環調用此函數,可以將不同數據加在一起計算SHA1的值; 返回值: 1 成功,0失敗;int SHA_Final(unsigned char *md, SHA_CTX *c); 輸出SHA1的數據; 返回值: 1 成功,0失敗;unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); SHA_Init,SHA_Update,SHA_Final 三個函數的組合;直接計算出SHA1數值; 返回值: 1 成功, 0失敗;void SHA_Transform(SHA_CTX *c, const unsigned char *data); 傳遞數據,內部函數,用戶不需使用此函數;

04. SHA1測試

參考代碼:

#define _CRT_SECURE_NO_WARNINGS #include <iostream>#include <openssl/sha.h>using namespace std;//測試SHA int main(void) {int ret = -1;int i = 0;SHA_CTX c;const void *data = "讓程序改變我們的生活";unsigned char md[SHA_DIGEST_LENGTH];unsigned char buf[SHA_DIGEST_LENGTH * 2 + 1];//1. 初始化ret = SHA1_Init(&c);if (1 != ret){cout << "SHA1_Init failed.." << endl;return 1;}//2. 添加數據ret = SHA1_Update(&c, data, strlen((char*)data));if (1 != ret){cout << "SHA1_Update failed.." << endl;return 1;}//3. 計算結果memset(md, 0, SHA_DIGEST_LENGTH);ret = SHA1_Final(md, &c);if (1 != ret){cout << "SHA1_Final failed.." << endl;return 1;}//4. 輸出結果memset(buf, 0, SHA_DIGEST_LENGTH * 2 + 1);for (i = 0; i < SHA_DIGEST_LENGTH; i++){sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;cout << "===========================" << endl;memset(md, 0, SHA_DIGEST_LENGTH);SHA1((unsigned char *)data, strlen((char*)data), md);memset(buf, 0, SHA_DIGEST_LENGTH * 2 + 1);for (i = 0; i < SHA_DIGEST_LENGTH; i++){//&buf[0] 0xEF --> "EF" sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;system("pause");return 0; }

測試結果:

05. 附錄

5.1 百度百科: SHA-1

5.2 參考: https://ctf-wiki.github.io/ctf-wiki/crypto/hash/sha1/

5.3 官方網站:https://www.openssl.org/

總結

以上是生活随笔為你收集整理的【OpenSSL】OpenSSL之SHA的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。