第1章 基礎知識
1.1. 單鑰密碼體制
單鑰密碼體制是一種傳統的加密算法,是指信息的發送方和接收方共同使用同一把密鑰進行加解密。
通常,使用的加密算法 比較簡便高效,密鑰簡短,加解密速度快,破譯極其困難。但是加密的安全性依靠密鑰保管的安全性,在公開的計算機網絡上安全地傳送和保管密鑰是一個嚴重的問題,並且假如在多用戶的情況下密鑰的保管安全性也是一個問題。
單鑰密碼體制的代表是美國的DES
1.2. 消息摘要
一個消息摘要就是一個數據塊的數字指紋。即對一個任意長度的一個數據塊進行計算,產生一個唯一指印(對於SHA1是產生一個20字節的二進制數組)。
消息摘要有兩個基本屬性:
兩個不同的報文難以生成相同的摘要
難以對指定的摘要生成一個報文,而由該報文反推算出該指定的摘要
代表:美國國家標准技術研究所的SHA1和麻省理工學院Ronald Rivest提出的MD5
1.3. Diffie-Hellman密鑰一致協議
密鑰一致協議是由公開密鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。
先決條件,答應兩名用戶在公開媒體上交換信息以生成"一致"的,可以共享的密鑰
代表:指數密鑰一致協議(EXPonential Key Agreement Protocol)
1.4. 非對稱算法與公鑰體系
1976年,Dittie和Hellman為解決密鑰治理問題,在他們的奠基性的工作"密碼學的新方向"一文中,提出一種密鑰交換協議,答應在不安全的媒體上通過通訊雙方交換信息,安全地傳送秘密密鑰。在此新思想的基礎上,很快出現了非對稱密鑰密碼體制,即公鑰密碼體制。在公鑰體制中,加密密鑰不同於解密密鑰,加密密鑰公之於眾,誰都可以使用;解密密鑰只有解密人自己知道。它們分別稱為公開密鑰(Public key)和秘密密鑰(Private key)。
迄今為止的所有公鑰密碼體系中,RSA系統是最聞名、最多使用的一種。RSA公開密鑰密碼系統是由R.Rivest、A.Shamir和L.Adleman俊教授於1977年提出的。RSA的取名就是來自於這三位發明者的姓的第一個字母
1.5. 數字簽名
所謂數字簽名就是信息發送者用其私鑰對從所傳報文中提取出的特征數據(或稱數字指紋)進行RSA算法操作,以保證發信人無法抵賴曾發過該信息(即不可抵賴性),同時也確保信息報文在經簽名後末被篡改(即完整性)。當信息接收者收到報文後,就可以用發送者的公鑰對數字簽名進行驗證。
在數字簽名中有重要作用的數字指紋是通過一類非凡的散列函數(HASH函數)生成的,對這些HASH函數的非凡要求是:
接受的輸入報文數據沒有長度限制;
對任何輸入報文數據生成固定長度的摘要(數字指紋)輸出
從報文能方便地算出摘要;
難以對指定的摘要生成一個報文,而由該報文反推算出該指定的摘要;
兩個不同的報文難以生成相同的摘要
代表:DSA
第2章 在Java中的實現
2.1. 相關
Diffie-Hellman密鑰一致協議和DES程序需要JCE工具庫的支持,可以到 http://java.sun.com/security/index.Html 下載JCE,並進行安裝。簡易安裝把 jce1.2.1lib 下的所有內容復制到 %java_home%libext下,假如沒有ext目錄自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到CLASSPATH內,更具體說明請看相應用戶手冊
2.2. 消息摘要MD5和SHA的使用
使用方法:
首先用生成一個MessageDigest類,確定計算方法
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
添加要進行計算摘要的信息
alga.update(myinfo.getBytes());
計算出摘要
byte[] digesta=alga.digest();
發送給其他人你的信息和摘要
其他人用相同的方法初始化,添加信息,最後進行比較摘要是否相同
algb.isEqual(digesta,algb.digest())
相關AIP
java.security.MessageDigest 類
static getInstance(String algorithm)
返回一個MessageDigest對象,它實現指定的算法
參數:算法名,如 SHA-1 或MD5
void update (byte input)
void update (byte[] input)
void update(byte[] input, int offset, int len)
添加要進行計算摘要的信息
byte[] digest()
完成計算,返回計算得到的摘要(對於MD5是16位,SHA是20位)
void reset()
復位
static boolean isEqual(byte[] digesta, byte[] digestb)
比效兩個摘要是否相同
代碼:
import java.security.*;
public class myDigest {
public static void main(String[] args) {
myDigest my=new myDigest();
my.testDigest();
}
public void testDigest()
{
try {
String myinfo="我的測試信息";
//java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
alga.update(myinfo.getBytes());
byte[] digesta=alga.digest();
System.out.println("本信息摘要是:"+byte2hex(digesta));
//通過某中方式傳給其他人你的信息(myinfo)和摘要(digesta) 對方可以判定是否更改或傳輸正常
java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
algb.update(myinfo.getBytes());
if (algb.isEqual(digesta,algb.digest())) {
System.out.println("信息檢查正常");
}
else
{
System.out.println("摘要不相同");
}
}
catch (java.security.NoSUChAlgorithmException ex) {
System.out.println("非法摘要算法");
}
}
public String byte2hex(byte[] b) //二行制轉字符串
{
String hs="";
String stmp="";
for (int n=0;n<b.length;n++)
{
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
}
2.3. 數字簽名DSA
對於一個用戶來講首先要生成他的密鑰對,並且分別保存
生成一個KeyPairGenerator實例
java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA");
假如設定隨機產生器就用如相代碼初始化
SecureRandom secrand=new SecureRandom();