Ⅰ SHA1的SHA1演算法描述
在SHA1演算法中,我們必須把原始消息(字元串,文件等)轉換成位字元串。SHA1演算法只接受位作為輸入。假設我們對字元串「abc」產生消息摘要。首先,我們將它轉換成位字元串如下:
01100001 01100010 01100011
―――――――――――――
『a』=97 『b』=98 『c』=99
這個位字元串的長度為24。下面我們需要5個步驟來計算消息摘要MAC。 消息必須進行補位,以使其長度在對512取模以後的余數是448。也就是說,(補位後的消息長度)%512 = 448。即使長度已經滿足對512取模後余數是448,補位也必須要進行。
補位是這樣進行的:先補一個1,然後再補0,直到長度滿足對512取模後余數是448。總而言之,補位是至少補一位,最多補512位。還是以前面的「abc」為例顯示補位的過程。
原始信息: 01100001 01100010 01100011
補位第一步:01100001 01100010 01100011 1
首先補一個「1」
補位第二步:01100001 01100010 01100011 10…..0
然後補423個「0」
我們可以把最後補位完成後的數據用16進制寫成下面的樣子
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
經過以上的處理之後,數據的長度是448了,我們可以進行下一步操作。 所謂的補長度是將原始數據的長度補到已經進行了補位操作的消息後面。通常用一個64位的數據來表示原始消息的長度。如果消息長度不大於2^64,那麼第一個字就是0。在進行了補長度的操作以後,整個消息就變成下面這樣了(16進制格式)
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
如果原始的消息長度超過了512,我們需要將它補成512的倍數。然後我們把整個消息分成一個一個512位的數據塊,分別處理每一個數據塊,從而得到消息摘要。 一系列的常量字K(0), K(1), ... , K(79),如果以16進制給出。它們如下:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79). 在SHA1中我們需要一系列的函數。每個函數ft (0 <= t <= 79)都操作32位字B,C,D並且產生32位字作為輸出。ft(B,C,D)可以如下定義
ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79). 必須使用進行了補位和補長度後的消息來計算消息摘要。計算需要兩個緩沖區,每個都由5個32位的字組成,還需要一個80個32位字的緩沖區。第一個5個字的緩沖區被標識為A,B,C,D,E。第二個5個字的緩沖區被標識為H0, H1, H2, H3, H4
。80個字的緩沖區被標識為W0, W1,..., W79
另外還需要一個一個字的TEMP緩沖區。
為了產生消息摘要,在第3.2部分中定義的512位(16個字)的數據塊M1, M2,..., Mn
會依次進行處理,處理每個數據塊Mi 包含80個步驟。
在處理所有數據塊之前,緩沖區{Hi} 被初始化為下面的值(16進制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
現在開始處理M1, M2, ... , Mn。為了處理 Mi,需要進行下面的步驟
(1). 將 Mi 分成 16 個字 W0, W1, ... , W15, W0 是最左邊的字
(2). 對於 t = 16 到 79 令
W[t] = S1(W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16]).
(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 對於 t = 0 到 79,執行下面的循環
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C = S30(B); B = A; A = TEMP;
(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在處理完所有的 Mn, 後,消息摘要是一個160位的字元串,以下面的順序標識
H0 H1 H2 H3 H4.
對於SHA256,SHA384,SHA512。你也可以用相似的辦法來計算消息摘要。對消息進行補位的演算法完全是一樣的。
SHA1在許多安全協議中廣為使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視為是MD5(更早之前被廣為使用的散列函數)的後繼者。
Ⅱ 請問SHA1加密演算法也是不可逆的嗎
SHA-1與MD5都是摘要演算法,且為不可逆演算法;
應用角度來講,適用性比安全性重要,兩個演算法長度有所不同,SHA-1 160位,MD5 128位。
如果從安全形度,在計算出摘要後,對摘要進行簽名,可以增加抗抵賴、防篡改的能力,詳情請查看數字簽名的資料。
Ⅲ C# SHA1演算法
32位無符號整數類型常量,0x5A827999這個是16進制數,具體是什麼用那就不知道,要看在什麼地方用了。
Ⅳ c# SHA1演算法如何寫
首先引用這個命名空間
using System.Security.Cryptography;
//建立SHA1對象
SHA1 sha = new SHA1CryptoServiceProvider();
//將mystr轉換成byte[]
ASCIIEncoding enc = new ASCIIEncoding();
byte[] dataToHash = enc.GetBytes(mystr);
//Hash運算
byte[] dataHashed = SHA1.ComputeHash(dataToHash );
//將運算結果轉換成string
string hash = BitConverter.ToString(dataHashed).Replace("-", "");
return hash;
Ⅳ c語言 實現sha1演算法
你再知道裡面搜「sha1演算法」就有。void sha1_finish( sha1_context *ctx, uint8 digest[20] )函數就是你要的。
Ⅵ 伺服器證書SHA1和SHA2演算法有和區別
SHA1演算法是為了兼容部分低版本的伺服器,而在幾年前SHA1演算法逐漸淘汰,由於發展,SHA1演算法已經滿足不了安全需求,從而有更高版本SHA2替代。SHA2演算法的證書更加安全,目前能夠兼容xp sp3以上的客戶端系統。如果需要安裝SHA2演算法可以找天威誠信的技術人員進行安裝。
Ⅶ sha1演算法會不會導致信息不可還原
Algorithm)又叫安全哈希加密技術,是當今世界最先近的加密演算法。主要用於文件身份識別、數字簽名和口令加密等。對於明文信息A,通過SHA1演算法,生成一條160位長的識別碼B。且明文信息A和識別碼B之間同時滿足以下條件:1、對於任意兩條不同的明文信息A1、A2,其識別碼B1、B2都不相同。2、無法通過逆向演算法由識別碼B倒推出明文信息A。MOONCRM的用戶密碼採用SHA1加密存儲,即伺服器上存儲的只是由用戶密碼生成的識別碼,而用戶密碼本身並沒有存儲在伺服器上。用戶輸入登陸口令時,系統會根據輸入口令生成相應識別碼並與系統中所存儲的識別碼進行比較,如二者一致,則認為口令正確。系統中沒有存儲用戶原始的口令值,即使有人獲得口令文件,也無法破解用戶登陸密碼,確保用戶密碼絕對安全。
Ⅷ 安全哈希演算法sha1和sm3演算法的區別
sha1是一種雜湊演算法,通俗的說即對數據使用sha1演算法進行計算,得到的結果就是sha1值(校驗值),可用於數字簽名、驗簽。
sm3是國密演算法,2010年國家密碼管理局發布,也是一種雜湊演算法,功能和sha1演算法相似,但演算法實現不一樣,破解難度比sha1更大,能達到sha256的水平(sha256是比特幣的加密方式),也可用於數字簽名、驗簽。
Ⅸ java 的SHA1演算法怎麼實現
importjava.security.*;
/*
*TestEncrypt.java
*Author:MKing
*LastDate:2005-11-21
*Description:-1,etc.
*/
publicclassTestEncrypt{
publicTestEncrypt(){}
publicStringEncrypt(StringstrSrc,StringencName){
//,
//.
//encNamedafaultto"MD5"
MessageDigestmd=null;
StringstrDes=null;
byte[]bt=strSrc.getBytes();
try{
if(encName==null||encName.equals("")){
encName="MD5";
}
md=MessageDigest.getInstance(encName);
md.update(bt);
strDes=bytes2Hex(md.digest());//toHexString
}catch(NoSuchAlgorithmExceptione){
System.out.println("Invalidalgorithm.");
returnnull;
}
returnstrDes;
}
publicStringbytes2Hex(byte[]bts){
Stringdes="";
Stringtmp=null;
for(inti=0;i<bts.length;i++){
tmp=(Integer.toHexString(bts[i]&0xFF));
if(tmp.length()==1){
des+="0";
}
des+=tmp;
}
returndes;
}
publicstaticvoidmain(String[]args){
TestEncryptte=newTestEncrypt();
StringstrSrc="可以加密漢字.Oh,andenglish";
System.out.println("SourceString:"+strSrc);
System.out.println("EncryptedString:");
System.out.println("UseDef:"+te.Encrypt(strSrc,null));
System.out.println("UseMD5:"+te.Encrypt(strSrc,"MD5"));
System.out.println("UseSHA:"+te.Encrypt(strSrc,"SHA-1"));
System.out.println("UseSHA-256:"+te.Encrypt(strSrc,"SHA-256"));
}
}
代碼格式看起來舒服一點
Ⅹ 急求sha1演算法的c或者c++實現
http://www.packetizer.com/security/sha1/
sha1.zip
sha1-c.zip