程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java數字簽名算法--RSA

Java數字簽名算法--RSA

編輯:JAVA綜合教程

Java數字簽名算法--RSA


簽名具有的特性:

  1. 安全性
  2. 抗否認性

數字簽名:帶有密鑰(公鑰、私鑰)的消息摘要算法(使用私鑰進行簽名,使用公鑰進行驗證) 

數字簽名算法:RSA、DSA、ECDSA

數字簽名特性:

  1. 驗證數據完整性
  2. 認證數據來源
  3. 抗否認性
  4.  

經典算法

MD、SHA兩類

 \

數字簽名算法-RSA的執行過程

\

代碼:

package com.chengxuyuanzhilu.rsa;

import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/** 
* 

微信公眾號:程序員之路

*
* @ClassName: CXYZL_RSA * @Description: 數組簽名算法——RSA * @author 付成剛 * @date 2016年2月17日 上午7:23:02 */ public class CXYZL_RSA { //要簽名和驗證的簽名內容 private static String src = "chengxuyuanzhilu rsa"; public static void main(String[] args) { jdkRSA(); } public static void jdkRSA(){ CXYZL_RSA cxyzl_RSA = new CXYZL_RSA(); try { //1.初始化密鑰,產生公鑰私鑰對 Object[] keyPairArr = cxyzl_RSA.initSecretkey(); RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPairArr[0]; RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPairArr[1]; //2.執行簽名 byte[] result = cxyzl_RSA.executeSignature(rsaPrivateKey); //3.驗證簽名 boolean bool = cxyzl_RSA.verifySignature(rsaPublicKey,result); System.out.println("RSA-MD5withRSA數字簽名算法運算結果:"+bool); } catch (Exception e) { e.printStackTrace(); } } /** * @Title: initSecretkey * @Description: 初始化密鑰,生成公鑰私鑰對 * @return Object[] 0 公鑰,1 私鑰 * @author 微信公眾號:程序員之路 * @throws NoSuchAlgorithmException * @date 2016年2月17日 上午7:31:06 */ private Object[] initSecretkey() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); Object[] keyPairArr = new Object[2]; keyPairArr[0] = rsaPublicKey; keyPairArr[1] = rsaPrivateKey; return keyPairArr; } /** * @Title: executeSignature * @Description: 執行簽名 * @return byte[] 簽名後的內容 * @author 微信公眾號:程序員之路 * @throws InvalidKeyException * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws SignatureException * @date 2016年2月17日 上午7:44:49 */ private byte[] executeSignature(RSAPrivateKey rsaPrivateKey) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, SignatureException{ PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update(src.getBytes()); byte[] result = signature.sign(); return result; } /** * @Title: verifySignature * @Description: 驗證簽名 * @param rsaPublicKey 公鑰 * @param result 私鑰執行簽名的結果 * @return boolean 驗證結果 * @author 微信公眾號:程序員之路 * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws InvalidKeyException * @throws SignatureException * @date 2016年2月17日 上午7:53:37 */ private boolean verifySignature(RSAPublicKey rsaPublicKey,byte[] result) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException{ X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initVerify(publicKey); signature.update(src.getBytes()); boolean bool = signature.verify(result); return bool; } }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved