sha演算法實現
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"));
}
}
代碼格式看起來舒服一點
⑵ 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;
⑶ SHA-512加密演算法
package Test;
import java.security.MessageDigest;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.awt.Component; //開始提示
import javax.swing.JOptionPane; //界面
class SHACoder {
public static String encodeSHA512(byte[] data) throws Exception {
// 初始化MessageDigest,SHA即SHA-1的簡稱
MessageDigest md = MessageDigest.getInstance("SHA-512");
// 執行摘要方法
byte[] digest = md.digest(data);
return new HexBinaryAdapter().marshal(digest);
}
}
public class SHATest {
private static final Component button = null;
public static void main(String[] args) throws Exception {
JOptionPane.showConfirmDialog(button,"是否開始加密(SHA-512)",null, JOptionPane.YES_NO_OPTION);
System.out.println("請輸入需要加密的內容:");
String testString="asd`12asd31";
System.out.println(SHACoder.encodeSHA512(testString.getBytes()));
}
}
⑷ c語言 實現sha1演算法
你再知道裡面搜「sha1演算法」就有。void sha1_finish( sha1_context *ctx, uint8 digest[20] )函數就是你要的。
⑸ 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(更早之前被廣為使用的散列函數)的後繼者。
⑹ 什麼是SHA演算法
和MD5演算法類似,SHA (Security Hash Algorithm) 演算法也是一種信息摘要生成演算法,SHA 是美國的 NIST 和 NSA 設計的一種標準的 Hash 演算法。
SHA-1 是第一代 SHA 演算法標准,後來的 SHA-224、SHA-256、SHA-384 和 SHA-512 被統稱為 SHA-2。
顯然,信息摘要越長,發生碰撞的幾率就越低,破解的難度就越大。但同時,耗費的性能和佔用的空間也就越高。
如上所述,SHA-1和SHA-2是該演算法不同的兩個版本,它們的構造和簽名的長度都有所不一樣,可以把SHA-2理解為SHA-1的繼承者。
SSL行業選擇SHA作為數字簽名的散列演算法,從2011到2015,一直以SHA-1位主導演算法。但隨著互聯網技術的提升,SHA-1的缺點越來越突顯。目前SHA-2已經成為新的標准,所以現在簽發的SSL證書,必須使用SHA-2演算法簽名。也許有人偶爾會看到SHA-2 384位的證書,很少會看到224位,因為224位不允許用於公共信任的證書,512位,不被軟體支持。
下面是SSL證書的SHA-1和SHA-2簽名對比
兩者在表面上似乎沒有什麼特別,但是數字簽名對於SSL / TLS的安全性具有重要的作用。哈希值越大,組合越多,其安全性就越高,SHA-2比SHA-1安全的多。
加密哈希演算法的一個重要功能是產生獨特的散列,當兩個不同的值或文件可以產生相同的散列,則會產生所謂的碰撞。只有在不發生碰撞時,才能保證數字簽名的安全性。碰撞對於哈希演算法來說是極其危險的,因為碰撞允許兩個文件產生相同的簽名。當計算機檢查簽名時,即使該文件未真正簽署,也會被計算機識別為有效的。
MD5的摘要的長度盡128bit,SHA-1摘要長度160bit。多出32bit意味著什麼呢?不同明文的碰撞幾率降低了2^32 = 324294967296倍。
由於SHA-1摘要比MD5摘要長,因而SHA-1生成摘要的性能比MD5略低。
我們先來回顧一下MD5演算法的核心過程,沒看過的小夥伴們可以點擊這個鏈接: 什麼是MD5演算法
簡而言之,MD5把128bit的信息摘要分成A,B,C,D四段(Words),每段32bit,在循環過程中交替運算A,B,C,D,最終組成128bit的摘要結果。
再看一下SHA-1演算法,核心過程大同小異,主要的不同點是把160bit的信息摘要分成了A,B,C,D,E五段。
再看一下SHA-2系列演算法,核心過程更復雜一些,把信息摘要分成了A,B,C,D,E,F,G,H八段。
其中SHA-256的每一段摘要長度是32bit,SHA-512的每一段摘要長度是64bit。SHA-224和SHA-384則是在前兩者生成結果的基礎上做出裁剪。
以一個60M的文件為測試樣本,經過1000次的測試平均值,三種演算法的表現為:
安全性方面,顯然SHA256(又稱SHA2)的安全性最高,但是耗時要比其他兩種多很多。MD5相對較容易碰撞,因此,SHA1應該是這三種中性能最好的一款加密演算法。
⑺ 哈希加密演算法
MD5即Message-Digest Algorithm 5(信息摘要演算法5),是計算機廣泛使用的散列演算法之一。經MD2、MD3和MD4發展而來,誕生於20世紀90年代初。用於確保信息傳輸完整一致。雖然已被破解,但仍然具有較好的安全性,加之可以免費使用,所以仍廣泛運用於數字簽名、文件完整性驗證以及口令加密等領域。
演算法原理:
散列演算法得到的結果位數是有限的,比如MD5演算法計算出的結果字長為128位,意味著只要我們窮舉2^128次,就肯定能得到一組碰撞,下面讓我們來看看一個真實的碰撞案例。我們之所以說MD5過時,是因為它在某些時候已經很難表現出散列演算法的某些優勢——比如在應對文件的微小修改時,散列演算法得到的指紋結果應當有顯著的不同,而下面的程序說明了MD5並不能實現這一點。
而諸如此類的碰撞案例還有很多,上面只是原始文件相對較小的一個例子。事實上現在我們用智能手機只要數秒就能找到MD5的一個碰撞案例,因此,MD5在數年前就已經不被推薦作為應用中的散列演算法方案,取代它的是SHA家族演算法,也就是安全散列演算法(Secure Hash Algorithm,縮寫為SHA)。
SHA實際包括有一系列演算法,分別是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。而我們所說的SHA2實際是對後面4中的統稱。各種SHA演算法的數據比較如下表,其中的長度單位均為位:
MD5和SHA1,它們都有4個邏輯函數,而在SHA2的一系列演算法中都採用了6個邏輯函數。
以SHA-1為例,演算法包括有如下的處理過程:
和MD5處理輸入方式相同
經過添加位數處理的明文,其長度正好為512位的整數倍,然後按512位的長度進行分組,可以得到一定數量的明文分組,我們用Y 0 ,Y 1 ,……Y N-1 表示這些明文分組。對於每一個明文分組,都要重復反復的處理,這些與MD5都是相同的。
而對於每個512位的明文分組,SHA1將其再分成16份更小的明文分組,稱為子明文分組,每個子明文分組為32位,我們且使用M[t](t= 0, 1,……15)來表示這16個子明文分組。然後需要將這16個子明文分組擴充到80個子明文分組,我們將其記為W[t](t= 0, 1,……79),擴充的具體方法是:當0≤t≤15時,Wt = Mt;當16≤t≤79時,Wt = ( W t-3 ⊕ W t-8 ⊕ W t-14 ⊕ W t-16 ) <<< 1,從而得到80個子明文分組。
所謂初始化緩存就是為鏈接變數賦初值。前面我們實現MD5演算法時,說過由於摘要是128位,以32位為計算單位,所以需要4個鏈接變數。同樣SHA-1採用160位的信息摘要,也以32位為計算長度,就需要5個鏈接變數。我們記為A、B、C、D、E。其初始賦值分別為:A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476、E = 0xC3D2E1F0。
如果我們對比前面說過的MD5演算法就會發現,前4個鏈接變數的初始值是一樣的,因為它們本來就是同源的。
經過前面的准備,接下來就是計算信息摘要了。SHA1有4輪運算,每一輪包括20個步驟,一共80步,最終產生160位的信息摘要,這160位的摘要存放在5個32位的鏈接變數中。
在SHA1的4論運算中,雖然進行的就具體操作函數不同,但邏輯過程卻是一致的。首先,定義5個變數,假設為H0、H1、H2、H3、H4,對其分別進行如下操作:
(A)、將A左移5為與 函數的結果求和,再與對應的子明文分組、E以及計算常數求和後的結果賦予H0。
(B)、將A的值賦予H1。
(C)、將B左移30位,並賦予H2。
(D)、將C的值賦予H3。
(E)、將D的值賦予H4。
(F)、最後將H0、H1、H2、H3、H4的值分別賦予A、B、C、D
這一過程表示如下:
而在4輪80步的計算中使用到的函數和固定常數如下表所示:
經過4輪80步計算後得到的結果,再與各鏈接變數的初始值求和,就得到了我們最終的信息摘要。而對於有多個明文分組的,則將前面所得到的結果作為初始值進行下一明文分組的計算,最終計算全部的明文分組就得到了最終的結果。
⑻ SHA1、SHA2安全hash演算法
sha(secure hash algorithm)安全sha演算法,對小於2^64位的消息進行演算法處理輸出消息摘要。並且消息摘要無法復原。常見的sha演算法有sha1、sha2
sha1輸出的是160位的消息在摘要 sha2輸出的是256位的消息摘要。sha2的碰撞的概率比sha1要低,因為sha2有2^256種組合sha1有2^160種組合。
sha的實現原理與 md5實現原理 在信息填充(補位),擴展長度的處理是相同的,在數據處理,輸出長度是不同的。
數據完整性校驗例如ssl的身份認證等
⑼ 摘要演算法
SHA-1演算法可以從明文生成160bit的信息摘要,示例如下:
給定明文: abcd
SHA-1摘要:
1.摘要長度不同 。
MD5的摘要的長度為128bit,SHA-1摘要長度160bit。多出32bit意味著什麼呢?不同明文的碰撞幾率降低了2^32 = 324294967296倍。
2.性能略有差別
SHA-1生成摘要的性能比MD5略低。
SHA-2是一系列SHA演算法變體的總稱,其中包含如下子版本:
SHA-256:可以生成長度256bit的信息摘要。
SHA-224:SHA-256的「閹割版」,可以生成長度224bit的信息摘要。
SHA-512:可以生成長度512bit的信息摘要。
SHA-384:SHA-512的「閹割版」,可以生成長度384bit的信息摘要。
是信息摘要的一種實現,它可以從任意長度的明文字元串生成128位哈希值
1.收集相關業務參數,在這里是金額和目標賬戶。當然,實際應用中的參數肯定比這多得多,這里只是做了簡化。
2.按照規則,把參數名和參數值拼接成一個字元串,同時把給定的 密鑰 也拼接起來。之所以需要密鑰,是因為攻擊者也可能獲知拼接規則。
3.利用MD5演算法,從原文生成哈希值。MD5生成的哈希值是128位的二進制數,也就是32位的十六進制數。
考慮把多種摘要演算法結合使用比如
明文: abcd
MD5摘要:
e2fc714c4727ee93 95f324cd2e7f331f
SHA-256摘要:
合成摘要:
e2fc714c4727ee93
取MD5摘要的前16位,取SHA-256的後32位
第一步:處理原文
首先,計算出原文長度(bit)對512求余的結果,如果不等於448,就需要填充原文使得原文對512求余的結果等於448。填充的方法是第一位填充1,其餘位填充0。填充完後,信息的長度就是512*N+448。
之後,用剩餘的位置(512-448=64位)記錄原文的真正長度,把長度的二進制值補在最後。這樣處理後的信息長度就是512*(N+1)。
第二步:設置初始值
MD5的哈希結果長度為128位,按每32位分成一組共4組。這4組結果是由4個初始值A、B、C、D經過不斷演變得到。
第三步:循環加工
這一步是最復雜的一步,我們看看下面這張圖,此圖代表了單次A,B,C,D值演變的流程。
圖中,A,B,C,D就是哈希值的四個分組。每一次循環都會讓舊的ABCD產生新的ABCD。一共進行多少次循環呢?由處理後的原文長度決定。
假設處理後的原文長度是M
主循環次數 = M / 512
每個主循環中包含 512 / 32 * 4 = 64 次 子循環。
上面這張圖所表達的就是 單次子循環 的流程。
1.圖中的綠色F,代表非線性函數
2.紅色的田字代表相加
3.黃色的<<<S(左移S位)
4.Mi是第一步處理後的原文。在第一步中,處理後原文的長度是512的整數倍。把原文的每512位再分成16等份,命名為M0 M15,每一等份長度32。在64次子循環中,每16次循環,都會交替用到M1 M16之一。
5.ki 一個常量,在64次子循環中,每一次用到的常量都是不同的
第四步:拼接結果
這一步就很簡單了,把循環加工最終產生的A,B,C,D四個值拼接在一起,轉換成字元串即可。
SHA演算法與MD5區別
SHA-1演算法,核心過程大同小異,主要的不同點是把160bit的信息摘要分成了A,B,C,D,E五段。
SHA-2系列演算法,核心過程更復雜一些,把信息摘要分成了A,B,C,D,E,F,G,H八段。
其中SHA-256的每一段摘要長度是32bit,SHA-512的每一段摘要長度是64bit。SHA-224和SHA-384則是在前兩者生成結果的基礎上做出裁剪。
⑽ SHA1 演算法
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准 (Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要。 SHA1有如下特性:不可以從消息摘要中復原信息;兩個不同的消息不會產生同樣的消息摘要,(但會有1x10 ^ 48分之一的機率出現相同的消息摘要,一般使用時忽略)。
舉個栗子:123456
結果:
對照網站: http://tool.oschina.net/encrypt?type=2