Java中的加密和DSA數位簽章
Bromon
一、單向加密(MD5和SHA-1)
單向加密通常用於訊息摘要,具體演算法可以閱讀java.security.*的原始碼獲得。經過封裝之後可以使用簡單的靜態方法來實現,Look:
package org.bromon;
public class MD5Encoder
{
public static void main(String args[])
{
String info=args[0];
try
{
//選擇MD5密碼編譯演算法
java.security.MessageDigest alg=
java.security.MessageDigest.getInstance("MD5");
//選擇SHA-1密碼編譯演算法
//java.security.MessageDigest alg=
java.security.MessageDigest.getInstance("SHA-1");
alg.update(info.getBytes());
byte[] digesta=alg.digest();
String result="";
for(int i=0;i<digesta.length;i++)
{
int m=digesta[i];
if(m<0)
{
m+=256;//如果是負數就模數
}
result=result+Integer.toString(m,16).toUpperCase()+"";//轉換為大寫字元
}
System.out.println(result);
}catch(Exception e)
{
System.out.println(e);
}
}
}
編譯:javac –d . MD5Encoder.java
運行:java org.bromon.MD5Encoder someData
DES作為單鑰加密的代表,目前好象仍然處於五角大樓出口限制的列表中!?
二、非對稱式加密DSA數位簽章
通過使用金鑰組來實現。根據非對稱式加密的原理,分發公開金鑰並用其加密,私密金鑰保密,用於解密。而DSA的數位簽章則是利用私密金鑰加密,公開金鑰解密,用以保證不可否認性和完整性。以DSA數位簽章為例:
首先需要產生一對密鑰:
package org.bromon;
import java.io.*;
import java.security.*;
public class DSAGenerateKeyPair
{
public static void main(String args[])
{
try
{
java.security.KeyPairGenerator keygen=
java.security.KeyPairGenerator.getInstance("DSA");
SecureRandom sr=new SecureRandom();
sr.setSeed("123".getBytes());//金鑰種子
keygen.initialize(512,sr);
KeyPair keys=keygen.generateKeyPair();
PublicKey pubkey=keys.getPublic();
PrivateKey prikey=keys.getPrivate();
//將產生的金鑰組序列化到檔案
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("prikey.dat"));
out.writeObject(prikey);
out.close();
out=new ObjectOutputStream(new FileOutputStream("pubkey.dat"));
out.writeObject(pubkey);
out.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
運行之後會在目前的目錄產生兩個.dat檔案。
然後可以使用私密金鑰對資料簽名:
package org.bromon;
import java.io.*;
import java.security.*;
public class DSASigner
{
public static void main(String args[])
{
String s="需要加密的內容";
try
{
//匯入私密金鑰
ObjectInputStream in=new ObjectInputStream(new FileInputStream("prikey.dat"));
PrivateKey prikey=(PrivateKey)in.readObject();
in.close();
//對資料簽名
Signature signature=Signature.getInstance("DSA");
signature.initSign(prikey);
signature.update(s.getBytes());
byte[] signed=signature.sign();
//將簽名後的資料寫入檔案
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("info.dat"));
out.writeObject(s);
out.writeObject(signed);
out.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
運行之後在當前路徑產生一個加密後的檔案,將此檔案和公開金鑰一起分發給接收者。
下面是使用公開金鑰驗證簽名是否正常:
package org.bromon;
import java.security.*;
import java.io.*;
public class DSAChecker
{
public static void main(String args[])
{
try
{
//匯入公開金鑰
ObjectInputStream in=new ObjectInputStream(new FileInputStream("pubkey.dat"));
PublicKey pubkey=(PublicKey)in.readObject();
in.close();
//匯入需要讀取的檔案
in=new ObjectInputStream(new FileInputStream("info.dat"));
String s=(String)in.readObject();
byte[] signed=(byte[])in.readObject();
in.close();
//驗證金鑰組
Signature signCheck=Signature.getInstance("DSA");
signCheck.initVerify(pubkey);
signCheck.update(s.getBytes());
if(signCheck.verify(signed))
{
System.out.println(s);
}else{
System.out.println("無閱讀許可權");
}
}catch(Exception e)
{
System.out.println(e);
}
}
}
運行之後如果密鑰匹配無誤,會顯示加密的內容。如果公開金鑰格式被破壞,會拋出異常。
Java有非常龐大的加密架構,各種加密和簽名種類極多,OReilly - Java Cryptography中有詳細介紹。不過一些包在中國無法得到。