2008年4月28日 星期一

JAVA 上加密演算法的實作範例

==轉貼自IBM網站==

最近有需要用到加密演算法的程式.看了好多資料.發現這篇說明得滿詳細的.

對稱式加密系統是一種傳統的加密演算法,是指訊息的傳送方和接收方共同使用同一把金鑰進行加解密。通常,使用的加密演算法比較簡便效率高,金鑰簡 短,加解密速度快,破解極其困難。但是加密的安全性依靠金鑰保管的安全性,在公開的電腦網路上安全地傳送和保管金鑰是一個困難的問題,並且如果在多使用者 的情況下金鑰的保管安全性也是一個問題。
第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.1\lib 下的所有內容複製到 %java_home%\lib\ext下,如果沒有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())

相關API

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)

沒有留言: