?? rsatool.java
字號:
package jct;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.SecureRandom;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.security.Security;import javax.crypto.Cipher;/** * <p>封裝同RSA非對稱加密算法有關的方法,可用于數(shù)字簽名,RSA加密解密</p> * @Copyright:WDSsoft * @ad:WDSsoft “企業(yè)多級數(shù)字簽名系統(tǒng)”- 最佳的企業(yè)電子文檔多級數(shù)字簽名方案 * @URL:www.wdssoft.com * @作者 吳東升 mdss@wdssoft.com bluesunday@sohu.com */public class RSATool { public RSATool() { } /** * 用一個已打包成byte[]形式的私鑰加密數(shù)據(jù),即數(shù)字簽名 * @param keyInByte 打包成byte[]的私鑰 * @param source 要簽名的數(shù)據(jù),一般應是數(shù)字摘要 * @return 簽名 byte[] */ public static byte[] sign(byte[] keyInByte,byte[] source){ try{ PKCS8EncodedKeySpec priv_spec=new PKCS8EncodedKeySpec(keyInByte); KeyFactory mykeyFactory=KeyFactory.getInstance("RSA"); PrivateKey privKey= mykeyFactory.generatePrivate(priv_spec); Signature sig=Signature.getInstance("SHA1withRSA"); sig.initSign(privKey); sig.update(source); return sig.sign(); }catch(Exception e){ return null; } } /** * 驗證數(shù)字簽名 * @param keyInByte 打包成byte[]形式的公鑰 * @param source 原文的數(shù)字摘要 * @param sign 簽名(對原文的數(shù)字摘要的簽名) * @return 是否證實 boolean */ public static boolean verify(byte[] keyInByte,byte[] source,byte[] sign){ try{ KeyFactory mykeyFactory=KeyFactory.getInstance("RSA"); Signature sig=Signature.getInstance("SHA1withRSA"); X509EncodedKeySpec pub_spec=new X509EncodedKeySpec(keyInByte); PublicKey pubKey=mykeyFactory.generatePublic(pub_spec); sig.initVerify(pubKey); sig.update(source); return sig.verify(sign); }catch(Exception e){ return false; } } /** * 建立新的密鑰對,返回打包的byte[]形式私鑰和公鑰 * @return 包含打包成byte[]形式的私鑰和公鑰的object[],其中,object[0]為私鑰byte[],object[1]為工要byte[] */ public static Object[] giveRSAKeyPairInByte(){ KeyPair newKeyPair=creatmyKey(); if(newKeyPair==null)return null; Object[] re=new Object[2]; if(newKeyPair!=null){ PrivateKey priv=newKeyPair.getPrivate(); byte[] b_priv = priv.getEncoded(); PublicKey pub=newKeyPair.getPublic(); byte[] b_pub=pub.getEncoded(); re[0]=b_priv; re[1]=b_pub; return re; } return null; } /** * 新建密鑰對 * @return KeyPair對象 */ public static KeyPair creatmyKey(){ KeyPair myPair; long mySeed; mySeed=System.currentTimeMillis(); try{ KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); SecureRandom random=SecureRandom.getInstance("SHA1PRNG","SUN"); random.setSeed(mySeed); keyGen.initialize(1024,random); myPair=keyGen.generateKeyPair(); }catch(Exception e1){ return null; } return myPair; }/** * 使用RSA公鑰加密數(shù)據(jù) * @param pubKeyInByte 打包的byte[]形式公鑰 * @param data 要加密的數(shù)據(jù) * @return 加密數(shù)據(jù) */ public static byte[] encryptByRSA(byte[] pubKeyInByte,byte[] data){ try{ KeyFactory mykeyFactory=KeyFactory.getInstance("RSA"); X509EncodedKeySpec pub_spec=new X509EncodedKeySpec(pubKeyInByte); PublicKey pubKey=mykeyFactory.generatePublic(pub_spec); Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE,pubKey); return cipher.doFinal(data); }catch(Exception e){ return null; } } /** * 用RSA私鑰解密 * @param privKeyInByte 私鑰打包成byte[]形式 * @param data 要解密的數(shù)據(jù) * @return 解密數(shù)據(jù) */ public static byte[] decryptByRSA(byte[] privKeyInByte,byte[] data){ try{ PKCS8EncodedKeySpec priv_spec=new PKCS8EncodedKeySpec(privKeyInByte); KeyFactory mykeyFactory=KeyFactory.getInstance("RSA"); PrivateKey privKey= mykeyFactory.generatePrivate(priv_spec); Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE,privKey); return cipher.doFinal(data); }catch(Exception e){ return null; } }/** *測試 */ public static void main(String[] args) { try{ Object[] v=giveRSAKeyPairInByte(); byte[] source=Digest.MdigestSHA("haha"); byte[] sign=sign((byte[])v[0],source); boolean yes=verify((byte[])v[1],source,sign); if(yes) System.out.print("verify\n"); }catch(Exception e){e.printStackTrace();} }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -