四種加密解密演算法的源代碼:移位密碼、仿射密碼、維吉尼亞密碼以及置換密碼
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
void Shift() /*移位密碼*/
{
char c[100];
int length, i=0, key=0;
clrscr();
printf("********Shift Cipher********\nPlease input primal sentence: ");
gets(c);
length = strlen(c);
printf("Input the key(0~26): ");
scanf("%d", &key);
getchar();
if(key<0)
{
printf("The value of key is error!\nPress any key to return...");
getch();
return;
}
for(i=0; i<length; i++)
{
if(c[i]>96&&c[i]<123)
c[i] = (c[i]+key-97)%26+65;
else if(c[i]>64&&c[i]<91)
c[i] = (c[i]+key-65)%26+65;
}
printf("Result is: %s\n", c);
for(i=0; i<length; i++)
{
if(c[i]>64&&c[i]<91)
c[i] = (c[i]-key-65+26)%26+97;
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}
int gcd(int a, int b) /*輾轉相除法求a,b的最大公因數*/
{
int k = 0;
do
{
k = a%b;
a = b;
b = k;
}while(k!=0);
return a;
}
int Ni(int a, int b) /*求a相對於b的逆*/
{
int i = 0;
while(a*(++i)%b!=1);
return i;
}
void Affine() /*仿射密碼*/
{
char c[100];
int length, i=0, ka=0, kb=0, tmp;
clrscr();
printf("********Affine Cipher********\nPlease input primal sentence: ");
gets(c);
length = strlen(c);
printf("Input the key(2 numbers): ");
scanf("%d%d", &ka, &kb);
getchar();
if(gcd(ka,26)!=1)
{
printf("The value of the key is error!\nPress any key to return...");
return;
}
for(i=0; i<length; i++)
{
if(c[i]>96&&c[i]<123)
c[i] = (ka*(c[i]-97)+kb)%26+65;
else if(c[i]>64&&c[i]<91)
c[i] = (ka*(c[i]-65)+kb)%26+65;
}
printf("Result is: %s\n", c);
for(i=0; i<length; i++)
{
if(c[i]>64&&c[i]<91)
{
tmp = Ni(ka,26)*((c[i]-65)-kb);
if(tmp<0)
c[i] = tmp%26+26+97;
else
c[i] = tmp%26+97;
}
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}
void Vigenere() /*維吉利亞密碼*/
{
char c[100], key[100];
int lenc, lenk, i=0, j=0, tmp;
clrscr();
printf("********Vigenere Cipher********\nPlease input primal sentence: ");
gets(c);
lenc = strlen(c);
strcpy(c, strupr(c));
printf("Input the key: ");
gets(key);
lenk = strlen(key);
strcpy(key, strupr(key));
for(; i<lenc; i++)
{
j = j%lenk;
if(c[i]>64&&c[i]<91)
{
c[i] = (c[i]-65+key[j]-65)%26+65;
j++;
}
}
printf("Result is: %s\n", c);
for(i=0, j=0; i<lenc; i++)
{
j = j%lenk;
if(c[i]>64&&c[i]<91)
{
tmp = c[i]-65-(key[j]-65);
if(tmp>=0)
c[i] = tmp%26+97;
else
c[i] = (tmp+26)%26+97;
j++;
}
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}
void Permutation() /*置換密碼*/
{
char c[100], *q;
int *key, len, m, i, j=0;
clrscr();
printf("********Permutation Cipher********\nPlease input primal sentence: ");
gets(c);
strcpy(c, strupr(c));
len = strlen(c);
for(i=0; i<len; i++)
{
if(c[i]<65||c[i]>90)
{
for(j=i; j<len-1; j++)
c[j] = c[j+1];
len--;
}
}
c[len] = '\0';
printf("Input the length of the key: ");
scanf("%d", &m);
key = (int)malloc(m*sizeof(int));
q = (int)malloc(len*sizeof(int));
printf("Input the key: ");
for(i=0; i<m; i++)
{
scanf("%d", key+i);
key[i]--;
}
getchar();
for(i=0; i<len; i++)
{
j = (i/m)*m;
q[i] = c[*(key+i%m)+j];
}
q[i] = '\0';
printf("Result is: %s\n", q);
for(i=0, j=0; i<len; i++)
{
j = (i/m)*m;
c[*(key+i%m)+j] = q[i]+32;
}
c[len] = '\0';
printf("After translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
free(key);
free(q);
getch();
}
void main()
{
char i = '0';
clrscr();
while(i!='5')
{
clrscr();
printf("********Press 1~5 to choose:********\n");
printf("1. Shift Cipher\n2. Affine Cipher\n3. Vigenere Cipher\n4. Permutation Cipher\n5. Exit\n");
i = getch();
if(i=='1')
Shift();
else if(i=='2')
Affine();
else if(i=='3')
Vigenere();
else if(i=='4')
Permutation();
else if(i=='5')
break;
}
}
B. hmac sha256和sha256的區別
兩者是一樣的。hmac是Hash-based Message Authentication Code的簡寫,就是指哈希消息認證碼,包含有很多種哈希加密演算法,sha256是其中一種。
探究的一般過程是從發現問題、提出問題開始的,發現問題後,根據自己已有的知識和生活經驗對問題的答案作出假設.設計探究的方案,包括選擇材料、設計方法步驟等.按照探究方案進行探究,得到結果,再分析所得的結果與假設是否相符,從而得出結論.並不是所有的問題都一次探究得到正確的結論.有時,由於探究的方法不夠完善,也可能得出錯誤的結論.因此,在得出結論後,還需要對整個探究過程進行反思.探究實驗的一般方法步驟:提出問題、做出假設、制定計劃、實施計劃、得出結論、表達和交流.
科學探究常用的方法有觀察法、實驗法、調查法和資料分析法等.
觀察是科學探究的一種基本方法.科學觀察可以直接用肉眼,也可以藉助放大鏡、顯微鏡等儀器,或利用照相機、錄像機、攝像機等工具,有時還需要測量.科學的觀察要有明確的目的;觀察時要全面、細致、實事求是,並及時記錄下來;要有計劃、要耐心;要積極思考,及時記錄;要交流看法、進行討論.實驗方案的設計要緊緊圍繞提出的問題和假設來進行.在研究一種條件對研究對象的影響時,所進行的除了這種條件不同外,其它條件都相同的實驗,叫做對照實驗.一般步驟:發現並提出問題;收集與問題相關的信息;作出假設;設計實驗方案;實施實驗並記錄;分析實驗現象;得出結論.調查是科學探究的常用方法之一.調查時首先要明確調查目的和調查對象,制訂合理的調查方案.調查過程中有時因為調查的范圍很大,就要選取一部分調查對象作為樣本.調查過程中要如實記錄.對調查的結果要進行整理和分析,有時要用數學方法進行統計.收集和分析資料也是科學探究的常用方法之一.收集資料的途徑有多種.去圖書管查閱書刊報紙,拜訪有關人士,上網收索.其中資料的形式包括文字、圖片、數據以及音像資料等.對獲得的資料要進行整理和分析,從中尋找答案和探究線索
C. spring提供的幾種密碼加密方式
第一種:不使用任何加密方式的配置
[html]view plain
<beanid="AuthenticationProvider"
class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<!--明文加密,不使用任何加密演算法,在不指定該配置的情況下,Acegi默認採用的就是明文加密-->
<!--<propertyname="passwordEncoder"><beanclass="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">
<propertyname="ignorePasswordCase"value="true"></property></bean></property>-->
</bean>
第二種:MD5方式加密
[html]view plain
<beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<propertyname="passwordEncoder">
<beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">
<!--false表示:生成32位的Hex版,這也是encodeHashAsBase64的,Acegi默認配置;true表示:生成24位的Base64版-->
<propertyname="encodeHashAsBase64"value="false"/>
</bean>
</property>
</bean>
第三種:使用MD5加密,並添加全局加密鹽
java代碼
[html]view plain
<beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<propertyname="passwordEncoder">
<beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">
<propertyname="encodeHashAsBase64"value="false"/>
</bean>
</property>
<!--對密碼加密演算法中使用特定的加密鹽及種子-->
<propertyname="saltSource">
<beanclass="org.acegisecurity.providers..salt.SystemWideSaltSource">
<propertyname="systemWideSalt"value="acegisalt"/>
</bean>
</property>
</bean>
第四種:使用MD5加密,並添加動態加密鹽
[html]view plain
<beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<propertyname="passwordEncoder">
<beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">
<propertyname="encodeHashAsBase64"value="false"/>
</bean>
</property>
<!--對密碼加密演算法中使用特定的加密鹽及種子-->
<propertyname="saltSource">
<!--通過動態的加密鹽進行加密,該配置通過用戶名提供加密鹽,通過UserDetails的getUsername()方式-->
<beanclass="org.acegisecurity.providers..salt.ReflectionSaltSource">
<propertyname="userPropertyToUse"value="getUsername"/>
</bean>
</property>
</bean>
第五種:使用哈希演算法加密,加密強度為256
[html]view plain
<beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<propertyname="passwordEncoder">
<beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">
<constructor-argvalue="256"/>
<propertyname="encodeHashAsBase64"value="false"/>
</bean>
</property>
</bean>
第六種:使用哈希演算法加密,加密強度為SHA-256
[html]view plain
<beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">
<propertyname="userDetailsService"ref="userDetailsService"/>
<propertyname="passwordEncoder">
<beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">
<constructor-argvalue="SHA-256"/>
<propertyname="encodeHashAsBase64"value="false"/>
</bean>
</property>
</bean>
上述配置只是在Acegi通過表單提交的用戶認證信息中的密碼做各種加密操作。而我們存儲用戶密碼的時候,可以通過一下程序完成用戶密碼操作:
[java]view plain
packageorg.hz.test;
importjava.security.NoSuchAlgorithmException;
importorg.springframework.security.authentication.encoding.Md5PasswordEncoder;
importorg.springframework.security.authentication.encoding.ShaPasswordEncoder;
publicclassMD5Test{
publicstaticvoidmd5(){
Md5PasswordEncodermd5=newMd5PasswordEncoder();
//false表示:生成32位的Hex版,這也是encodeHashAsBase64的,Acegi默認配置;true表示:生成24位的Base64版
md5.setEncodeHashAsBase64(false);
Stringpwd=md5.encodePassword("1234",null);
System.out.println("MD5:"+pwd+"len="+pwd.length());
}
publicstaticvoidsha_256(){
ShaPasswordEncodersha=newShaPasswordEncoder(256);
sha.setEncodeHashAsBase64(true);
Stringpwd=sha.encodePassword("1234",null);
System.out.println("哈希演算法256:"+pwd+"len="+pwd.length());
}
publicstaticvoidsha_SHA_256(){
ShaPasswordEncodersha=newShaPasswordEncoder();
sha.setEncodeHashAsBase64(false);
Stringpwd=sha.encodePassword("1234",null);
System.out.println("哈希演算法SHA-256:"+pwd+"len="+pwd.length());
}
publicstaticvoidmd5_SystemWideSaltSource(){
Md5PasswordEncodermd5=newMd5PasswordEncoder();
md5.setEncodeHashAsBase64(false);
//使用動態加密鹽的只需要在注冊用戶的時候將第二個參數換成用戶名即可
Stringpwd=md5.encodePassword("1234","acegisalt");
System.out.println("MD5SystemWideSaltSource:"+pwd+"len="+pwd.length());
}
publicstaticvoidmain(String[]args){
md5();//使用簡單的MD5加密方式
sha_256();//使用256的哈希演算法(SHA)加密
sha_SHA_256();//使用SHA-256的哈希演算法(SHA)加密
md5_SystemWideSaltSource();//使用MD5再加全局加密鹽加密的方式加密
}
}
D. SHA-256,AES,SSH,DES哪個更安全
sha_256是哈希演算法,是用來判斷原信息有沒有被篡改的。演算法是單向的,無法從哈希值解密原信息。
AES是用來加密解密的,可以把加密後的信息解密成原信息。
E. hash在線解密
*nix系系統:
ES(Unix)
例子: IvS7aeT4NzQPM
說明:linux或者其他linux內核系統中
長度: 13 個字元
描述:第1、2位為salt,例子中的'Iv'位salt,後面的為hash值
系統:MD5(Unix)
例子:$1$12345678$XM4P3PrKBgKNnTaqG9P0T/
說明:Linux或者其他linux內核系統中
長度:34個字元
描述:開始的$1$位為加密標志,後面8位12345678為加密使用的salt,後面的為hash
加密演算法:2000次循環調用MD5加密
系統:SHA-512(Unix)
例子:$6$12345678$U6Yv5E1lWn6mEESzKen42o6rbEm
說明:Linux或者其他linux內核系統中
長度: 13 個字元
描述:開始的$6$位為加密標志,後面8位為salt,後面的為hash
加密演算法:5000次的SHA-512加密
系統:SHA-256(Unix)
例子:$5$12345678$jBWLgeYZbSvREnuBr5s3gp13vqi
說明:Linux或者其他linux內核系統中
長度: 55 個字元
描述:開始的$5$位為加密標志,後面8位為salt,後面的為hash
加密演算法:5000次的SHA-256加密
系統:MD5(APR)
例子:$apr1$12345678$auQSX8Mvzt.tdBi4y6Xgj.
說明:Linux或者其他linux內核系統中
長度:37個字元
描述:開始的$apr1$位為加密標志,後面8位為salt,後面的為hash
加密演算法:2000次循環調用MD5加密
windows系統:
windows
例子:Admin:
長度:98個字元
加密演算法:MD4(MD4(Unicode($pass)).Unicode(strtolower($username)))
mysql
系統:mysql
例子:606717496665bcba
說明:老版本的MySql中
長度:8位元組(16個字元)
說明:包括兩個位元組,且每個字的值不超過0x7fffffff
系統:MySQL5
例子:*
說明:較新版本的MySQL
長度:20位元組(40位)
加密演算法:SHA-1(SHA-1($pass))
其他系統:
系統:MD5(WordPress)
例子:$P$
說明:WordPress使用的md5
長度:34個字元
描述:$P$表示加密類型,然後跟著一位字元,經常是字元『B』,後面是8位salt,後面是就是hash
加密演算法:8192次md5循環加密
系統:MD5(phpBB3)
說明:phpBB 3.x.x.使用
例子:$H$9123456785DAERgALpsri.D9z3ht120
長度:34個字元
描述:開始的$H$為加密標志,後面跟著一個字元,一般的都是字元『9』,然後是8位salt,然後是hash 值
加密演算法:2048次循環調用MD5加密
系統:RAdmin v2.x
說明:Remote Administrator v2.x版本中
例子:
長度:16位元組(32個字元)
加密演算法:字元用0填充到100位元組後,將填充過後的字元經過md5加密得到(32位值)
md5加密
標准MD5
例子:
使用范圍:phpBB v2.x, Joomla 的 1.0.13版本前,及其他cmd
長度:16個字元
其他的加salt及變形類似:
md5($salt.$pass)
例子::12
md5(md5($pass))
例子:
md5(md5($pass).$salt)
例子::wQ6
md5(md5($salt).md5($pass))
例子: :wH6_S
md5(md5($salt).$pass)
例子: :1234
F. 簽名設備不支持所需的哈希演算法SHA256是什麼意思,要怎麼解決
摘要 你好,1. 證書簽名使用的演算法是發布者自己規定的使用自己的私鑰對證書編碼的哈希值進行加密一般演算法為md5withrsa或者sha256withrsa。
G. hash的加密過程,
可以使用 System.Security.Cryptography 名稱空間中包含的加密資源方便地生成和比較哈希值。 因為所有哈希函數的輸入類型都是 Byte[],所以必須先將源數據轉換為位元組數組後再計算哈希值。 若要為一個字元串值創建哈希值,請按照下列步驟操作: 打開 Visual Studio .NET。 在 Microsoft C# 中新建控制台應用程序。Visual C# .NET 為您創建一個公用類以及一個空的 Main() 方法。 對 System、System.Security.Cryptography 和 System.Text 名稱空間使用 using 指令,這樣,在後面的代碼中就不需要限定這些名稱空間中的聲明了。這些語句必須放在所有其他聲明之前。 using System; using System.Security.Cryptography; using System.Text; 聲明一個字元串變數以存放源數據,並聲明兩個位元組數組(未定義大小)分別存放源位元組和得出的哈希值。 string sSourceData; byte[] tmpSource; byte[] tmpHash; 使用 GetBytes() 方法(它是 System.Text.ASCIIEncoding 類的成員)將源字元串轉換為位元組數組(這是哈希函數要求的輸入類型)。 sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); 通過在 MD5CryptoServiceProvider 類的一個實例上調用 ComputeHash 方法,來計算源數據的 MD5 哈希值。 注意,若要計算另一哈希值,需要另創建一個該類的實例。 //Compute hash based on source data. tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 此時,tmpHash 位元組數組中存放了計算源數據得出的哈希值(128 位值 = 16 個位元組)。 通常,將此類值顯示或存儲為一個十六進制字元串是非常有用的,如以下代碼所示: Console.WriteLine(ByteArrayToString(tmpHash)); static string ByteArrayToString(byte[] arrInput) { int i; StringBuilder sOutput = new StringBuilder(arrInput.Length); for (i=0;i < arrInput.Length -1; i++) { sOutput.Append(arrInput[i].ToString("X2")); } return sOutput.ToString(); } 保存並運行代碼,以查看計算源數值得出的十六進制字元串。 回到頂端比較兩個哈希值 從源數據創建哈希值的目的之一是,提供一種方法查看數據經過一段時間後是否會發生改變,或者在不使用實際值的情況下比較兩個值。 兩種情況都需要比較兩個哈希計算值,如果兩個值都存儲為十六進制字元串,則比較起來非常方便(如上一節中的最後一步所示)。 但是,兩個值很有可能都採用位元組數組的形式。 以下代碼(繼上一節中創建的代碼)演示了如何比較兩個位元組數組。 創建完十六進制字元串後,緊接著基於新的源數據創建一個新的哈希值。 sSourceData = "NotMySourceData"; tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); byte[] tmpNewHash; tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 比較兩個位元組數組的最直接的方法是,使用循環語句逐一比較兩個值中對應的數組元素。 如果任何元素不同,或者兩個數組的長度不同,則兩個值不相等。 bool bEqual = false; if (tmpNewHash.Length == tmpHash.Length) { int i=0; while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i])) { i += 1; } if (i == tmpNewHash.Length) { bEqual = true; } } if (bEqual) Console.WriteLine("The two hash values are the same"); else Console.WriteLine("The two hash values are not the same"); Console.ReadLine(); 保存並運行項目,查看從第一個哈希值創建的十六進制字元串,然後檢查新的哈希值與原值是否相等。
-__________________________________________________________________________
在.net中,由 System.Security.Cryptography 命名空間提供了加密和哈希的幾個類。其中 md5 編碼由 MD5CryptoServiceProvider 實現。
在使用過程中由於 MD5CryptoServiceProvider 提供了多種方法去計算md5的hash值,反而令人搞不清楚,所以這里帖出計算md5的幾種常見方法先引用命名空間: using System.Security.Cryptography;
using System.Text; 然後:MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider();string source="HelloWorld";
byte[] message;
message=Encoding.Default.GetBytes(source);//方法1
// 使用ComputeHash方法,適合用於計算簡單的字元串的md5值時
md5.ComputeHash(message);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法2
// 使用TransformFinalBlock方法,適合用於原始數據不多時
md5.Initialize();
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法3
// 此方法等同於方法2
md5.Initialize();
md5.TransformBlock(message,0,message.Length,
message,0); //note: output bytes must equal input bytes
md5.TransformFinalBlock(message,0,0);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法4
// 將原始消息分兩次編碼,得出的結果跟上面的一樣,適合用於計算大量原始數據時,例如計算一個文件的md5值
md5.Initialize();
message=Encoding.Default.GetBytes("Hello");
md5.TransformBlock(message,0,message.Length,
message,0);message=Encoding.Default.GetBytes("World");
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
H. SHA256 加密後能不能解密
SHA是散列演算法,不是加密演算法,不存在解密的問題。
原因:
對數據解密破解就是找到任意一個源數據,能夠生成相同的目標數據。
SHA256基本上是不可破解的,即找不到(或概率極小)「碰撞」結果。
網站的解密規則:
網站從瀏覽器發送過來的信息當中選出一組加密演算法與HASH演算法,並將自己的身份信息以證書的形式發回給瀏覽器。證書裡麵包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
(8)哈西256在線加密擴展閱讀:
加密解密過程中,瀏覽器對網站的驗證:
1、驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄裡面會顯示一個小鎖頭,否則會給出證書不受信的提示。
2、如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
3、使用約定好的HASH演算法計算握手消息,並使用生成的隨機數對消息進行加密,最後將之前生成的所有信息發送給網站。
I. hash256 shr方法
· 輸入數據長度為l比特,1≤l≤264-1
· 輸出哈希值的長度為256比特
(1) 常量與函數
SHA-256演算法使用以下常數與函數:
① 常量
初始值IV為:
0x6a09e667 bb67ae85 3c6ef372 a54ff53a
510e527f 9b05688c 1f83d9ab 5be0cd19
這些初值是對自然數中前8個質數(2,3,5,7,11,13,17,19)的平方根的小數部分取前32比特而來。
舉個例子來說,√2小數部分約:
0.414213562373095048
而0.414213562373095048 ≈ 6∗16−1 +a∗16−2+0∗16−3 +9∗16−4 +...
於是,質數2的平方根的小數部分取前32比特就對應出0x6a09e667。
和8個初始值類似,這些常量是對自然數中前64個質數(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97…)的立方根的小數部分取前32比特而來。
② 函數
SHA-256用到了以下函數
ROTRi(x)表示循環右移i比特;SHRi(x)表示右移i比特;
(2) 演算法描述
① 填充
· 對數據填充的目的是使填充後的數據長度為512的整數倍。因為迭代壓縮是對512位數據塊進行的,如果數據的長度不是512的整數倍,最後一塊數據將是短塊,這將無法處理。
· 設消息m長度為l比特。首先將比特「1」添加到m的末尾,再添加k個「0」,其中,k是滿足下式的最小非負整數l+1+k = 448mod512。
· 然後再添加一個64位比特串,該比特串是長度l的二進製表示。填充後的消息m的比特長度一定為512的倍數。
· 以信息「abc」為例顯示補位的過程。a, b, c對應的ASCII碼分別是97, 98, 99;於是原始信息的二進制編碼為:01100001 01100010 01100011。
補一個「1」 :0110000101100010 01100011 1
補423個「0」:01100001 01100010 01100011 10000000 00000000 … 00000000
補比特長度24 (64位表示),得到512比特的數據:
J. 哈希碼值是什麼 什麼是哈希碼 轉 詳細03麻煩告訴我
哈希碼值是什麼 什麼是哈希碼 轉 哈希碼值是什麼?什麼事哈希碼?哈希值,私鑰加密和公鑰加密1.哈希值哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。消息身份驗證代碼(MAC)哈希函數通常與數字簽名一起用於對數據進行簽名,而消息檢測代碼(MDC)哈希函數則用於數據完整性。小紅和小明可按下面的方式使用哈希函數以確保數據完整性。如果小紅對小明編寫一條消息並創建該消息的哈希,則小明可以在稍後散列該消息並將他的哈希與原始哈希進行比較。如果兩個哈希值相同,則該消息沒有被更改;但是,如果值不相同,則該消息在小紅編寫它之後已被更改。為了使此系統運行,小紅必須對除小明外的所有人保密原始的哈希值。.NET Framework 提供以下實現數字簽名演算法的類:HMACSHA1 MACTripleDES MD5CryptoServiceProvider SHA1Managed SHA256Managed SHA384Managed SHA512Managed 隨機數生成隨機數生成是許多加密操作不可分割的組成部分。例如,加密密鑰需要盡可能地隨機,以便使生成的密鑰很難再現。加密隨機數生成器必須生成無法以計算方法推算出(低於p.05 的概率)的輸出;即,任何推算下一個輸出位的方法不得比隨機猜測具有更高的成功概率。.NET Framework 中的類使用隨機數生成器生成加密密鑰。 RNGCryptoServiceProvider 是隨機數生成器演算法的實現。2.私鑰加密私鑰加密演算法使用單個私鑰來加密和解密數據。由於具有密鑰的任意一方都可以使用該密鑰解密數據,因此必須保護密鑰不被未經授權的代理得到。私鑰加密又稱為對稱加密,因為同一密鑰既用於加密又用於解密。私鑰加密演算法非常快(與公鑰演算法相比),特別適用於對較大的數據流執行加密轉換。通常,私鑰演算法(稱為塊密碼)用於一次加密一個數據塊。塊密碼(如RC2、DES、TrippleDES 和 Rijndael)通過加密將n 位元組的輸入塊轉換為加密位元組的輸出塊。如果要加密或解密位元組序列,必須逐塊進行。由於n 的大小很小(對於RC2、DES 和 TripleDES,n=8 位元組;n=16[默認值];n=24;對於Rijndael,n=32),因此必須對大於n 位元組的值一次加密一個塊。基類庫中提供的塊密碼類使用稱作密碼塊鏈(CBC)的鏈模式,它使用一個密鑰和一個初始化向量(IV)對數據執行加密轉 換。對於給定的私鑰k,一個未使用初始化向量的簡單塊密碼將把相同的明文輸入塊加密為同樣的密文輸出塊。如果在明文流內有重復的塊,那麼在密文流內也會有重復的塊。如果未經授權的用戶知道有關明文塊的結構的所有信息,就可以使用該信息解密已知的密文塊並有可能獲得您的密鑰。若要克服這個問題,可將上一個塊中的信息混合到加密下一個塊的過程中。這樣,兩個相同的明文塊的輸出就會不同。由於該技術使用上一個塊加密下一個塊,因此使用了一個IV 來加密數據的第一個塊。使用該系統,未經授權的用戶有可能知道的公共消息標頭將無法用於對密鑰進行反向工程。可以危及用此類型密碼加密的數據的一個方法是,對每個可能的密鑰執行窮舉搜索。根據用於執行加密的密鑰大小,即使使用最快的計算機執行這種搜索,也極其耗時,因此難以實施。使用較大的密鑰大小將使解密更加困難。雖然從理論上說加密不會使對手無法檢索加密的數據,但它確實極大增加了這樣做的成本。如果執行徹底搜索來檢索只在幾天內有意義的數據需要花費三個月的時間,那麼窮舉搜索的方法是不實用的。私鑰加密的缺點是它假定雙方已就密鑰和IV 達成協議,並且互相傳達了密鑰和IV 的值。並且,密鑰必須對未經授權的用戶保密。由於存在這些問題,私鑰加密通常與公鑰加密一起使用,來秘密地傳達密鑰和IV 的值。假設小紅和小明是要在不安全的信道上進行通信的雙方,他們可能按以下方式使用私鑰加密。小紅和小明都同意使用一種具有特定密鑰和 IV 的特定演算法(如 Rijndael)。小紅撰寫一條消息並創建要在其上發送該消息的網路流。接下來,她使用該密鑰和IV 加密該文本,並通過Internet 發送該文本。她沒有將密鑰和IV 發送給小明。小明收到該加密文本並使用預先商定的密鑰和IV 對它進行解密。如果該傳輸被截獲,截獲者將無法恢復原始消息,原因是截獲者不知道密鑰或IV。在這個方案中,密鑰必須保密,但IV 不需要保密。在一個實際方案中,將由小紅或小明生成私鑰並使用公鑰(不對稱)加密將該私鑰(對稱)傳遞給對方。有關更多信息,請參見"公鑰加密"。.NET Framework 提供以下實現私鑰加密演算法的類: DESCryptoServiceProvider RC2CryptoServiceProvider RijndaelManaged 3.公鑰加密公鑰加密使用一個必須對未經授權的用戶保密的私鑰和一個可以對任何人公開的公鑰。公鑰和私鑰都在數學上相關聯;用公鑰加密的數據只能用私鑰解密,而用私鑰簽名的數據只能用公鑰驗證。公鑰可以被任何人使用;該密鑰用於加密要發送到私鑰持有者的數據。兩個密鑰對於通信會話都是唯一的。公鑰加密演算法也稱為不對稱演算法,原因是需要用一個密鑰加密數據而需要用另一個密鑰來解密數據。公鑰加密演算法使用 固定的緩沖區大小,而私鑰加密演算法使用長度可變的緩沖區。公鑰演算法無法像私鑰演算法那樣將數據鏈接起來成為流,原因是它只可以加密少量數據。因此,不對稱操作不使用與對稱操作相同的流模型。雙方(小紅和小明)可以按照下列方式使用公鑰加密。首先,小紅生成一個公鑰/私鑰對。如果小明想要給小紅發送一條加密的消息,他將向她索要她的公鑰。小紅通過不安全的網路將她的公鑰發送給小明,小明接著使用該密鑰加密消息。(如果小明在不安全的信道如公共網路上收到小紅的密鑰,則小明必須同小紅驗證他具有她的公鑰的正確副本。)小明將加密的消息發送給小紅,而小紅使用她的私鑰解密該消息。但是,在傳輸小紅的公鑰期間,未經授權的代理可能截獲該密鑰。而且,同一代理可能截獲來自小明的加密消息。但是,該代理無法用公鑰解密該消息。該消息只能用小紅的私鑰解密,而該私鑰沒有被傳輸。小紅不使用她的私鑰加密給小明的答復消息,原因是任何具有該公鑰的人都可以解密該消息。如果小紅想要將消息發送回小明,她將向小明索要他的公鑰並使用該公鑰加密她的消息。然後,小明使用與他相關聯的私鑰來解密該消息。在一個實際方案中,小紅和小明使用公鑰(不對稱)加密來傳輸私(對稱)鑰,而對他們的會話的其餘部分使用私鑰加密。公鑰加密具有更大的密鑰空間(或密鑰的可能值范圍),因此不大容易受到對每個可能密鑰都進行嘗試的窮舉攻擊的影響。由於不必保護公鑰,因此它易於分發。公鑰演算法可用於創建數字簽名以驗證數據發送方的標識。但是,公鑰演算法非常緩慢(與私鑰演算法相比),不適合用來加密大量數據。公鑰演算法僅對傳輸很少量的數據有用。