RSA加密演算法-Java實現
package test;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.spec.X509EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import sun.misc.*;
/**
* <p>Title: RSA非對稱型加密的公鑰和私鑰</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class RSAUtil {
private KeyPairGenerator kpg = null;
private KeyPair kp = null;
private PublicKey public_key = null;
private PrivateKey private_key = null;
/**
* 建構函式
* @param in 指定密匙長度(取值範圍:512~2048)
* @throws NoSuchAlgorithmException 異常
*/
public RSAUtils(int in, String address) throws NoSuchAlgorithmException,
FileNotFoundException, IOException
{
kpg = KeyPairGenerator.getInstance("RSA"); //建立‘密匙對’生成器
kpg.initialize(in); //指定密匙長度(取值範圍:512~2048)
kp = kpg.genKeyPair(); //生成‘密匙對’,其中包含著一個公匙和一個私匙的資訊
public_key = kp.getPublic(); //獲得公匙
private_key = kp.getPrivate(); //獲得私匙
sun.misc.BASE64Encoder b64 = new sun.misc.BASE64Encoder();
String pkStr = b64.encode(public_key.getEncoded());
String prStr = b64.encode(private_key.getEncoded());
System.out.print("pkStr length:" +pkStr.length() +pkStr);
FileWriter fw=new FileWriter(address + "/private_key.dat");
fw.write(prStr);
fw.close();
FileWriter fw2 = new FileWriter(address + "/public_key.dat");
fw2.write(pkStr);
fw2.close();
}
/**
*加密的方法
*/
private static String encrypt(String source) throws Exception{
/** 將檔案中的公鑰物件讀出 */
FileReader fr = new FileReader("c://public_key.dat");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader物件,並例項化為br
String getPbKey = "";
while(true){
String aLine = br.readLine();
if(aLine==null)break;
getPbKey += aLine;
}
System.out.println( "myBuilderStr : length: " + getPbKey.length() +"
"+getPbKey );
BASE64Decoder b64d = new BASE64Decoder();
byte [] keyByte = b64d.decodeBuffer(getPbKey);
X509EncodedKeySpec x509ek = new X509EncodedKeySpec(keyByte);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509ek);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
byte[] sbt = source.getBytes();
byte [] epByte = cipher.doFinal(sbt);
BASE64Encoder encoder = new BASE64Encoder();
String epStr = encoder.encode(epByte);
return epStr;
}
/**
*解密的方法
*/
public static String decrypt(String cryptograph) throws Exception{
FileReader fr = new FileReader("c://private_key.dat");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader物件,並例項化為
br
String getPvKey = "";
while(true){
String aLine = br.readLine();
if(aLine==null)break;
getPvKey += aLine;
}
BASE64Decoder b64d = new BASE64Decoder();
byte [] keyByte = b64d.decodeBuffer(getPvKey);
PKCS8EncodedKeySpec s8ek = new PKCS8EncodedKeySpec(keyByte);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(s8ek);
/** 得到Cipher物件對已用公鑰加密的資料進行RSA解密 */
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
BASE64Decoder decoder = new BASE64Decoder();
byte[] b1 = decoder.decodeBuffer(cryptograph);
/** 執行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}
public static void main(String[] args) {
try {
new KeyRSA(1024, "D:/"); //私匙和公匙儲存到D盤下的檔案中.
System.out.println("");
String getEptStr = encrypt("fengyupeng");
System.out.println("getEptStr:"+getEptStr);
String drpStr = decrypt(getEptStr);
System.out.println("drpStr:"+drpStr);
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
}