資源描述:
《java加密技術(shù) 非對稱加密算法rsa》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Java加密技術(shù)接下來我們介紹典型的非對稱加密算法——RSARSA這種算法1978年就出現(xiàn)了,它是第一個既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:RonRivest,AdiShamir和LeonardAdleman。這種加密算法的特點主要是密鑰的變化,上文我們看到DES只有一個密鑰。相當(dāng)于只有一把鑰匙,如果這把鑰匙丟了,數(shù)據(jù)也就不安全了。RSA同時有兩把鑰匙,公鑰與私鑰。同時支持?jǐn)?shù)字簽名。數(shù)字簽名的意義在于,對傳輸過來的數(shù)據(jù)進行校驗。確保數(shù)據(jù)在傳輸工程中不被修改。流程分析:甲方構(gòu)建密
2、鑰對兒,將公鑰公布給乙方,將私鑰保留。甲方使用私鑰加密數(shù)據(jù),然后用私鑰對加密后的數(shù)據(jù)簽名,發(fā)送給乙方簽名以及加密后的數(shù)據(jù);乙方使用公鑰、簽名來驗證待解密數(shù)據(jù)是否有效,如果有效使用公鑰對數(shù)據(jù)解密。乙方使用公鑰加密數(shù)據(jù),向甲方發(fā)送經(jīng)過加密后的數(shù)據(jù);甲方獲得加密數(shù)據(jù),通過私鑰解密。按如上步驟給出序列圖,如下:按如上步驟給出序列圖,如下:1.2.1.Java代碼importjava.security.Key;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.
3、security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.Signature;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.s
4、pec.X509EncodedKeySpec;importjava.util.HashMap;importjava.util.Map;importjavax.crypto.Cipher;/***RSA安全編碼組件**@author梁棟*@version1.0*@since1.0*/publicabstractclassRSACoderextendsCoder{publicstaticfinalStringKEY_ALGORITHM="RSA";publicstaticfinalStringSIGNATURE_ALGORITHM="MD5w
5、ithRSA";privatestaticfinalStringPUBLIC_KEY="RSAPublicKey";privatestaticfinalStringPRIVATE_KEY="RSAPrivateKey";/***用私鑰對信息生成數(shù)字簽名**@paramdata*加密數(shù)據(jù)*@paramprivateKey*私鑰**@return*@throwsException*/publicstaticStringsign(byte[]data,StringprivateKey)throwsException{//解密由base64編碼的
6、私鑰byte[]keyBytes=decryptBASE64(privateKey);//構(gòu)造PKCS8EncodedKeySpec對象PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(keyBytes);//KEY_ALGORITHM指定的加密算法KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);//取私鑰匙對象PrivateKeypriKey=keyFactory.generatePrivate(pkcs8K
7、eySpec);//用私鑰對信息生成數(shù)字簽名Signaturesignature=Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);returnencryptBASE64(signature.sign());}/***校驗數(shù)字簽名**@paramdata*加密數(shù)據(jù)*@parampublicKey*公鑰*@paramsign*數(shù)字簽名**@return校驗成功返回true失敗返回false*@throwsE
8、xception**/publicstaticbooleanverify(byte[]data,StringpublicKey,Stringsign)throwsException{//解密由