Java數字簽名算法--RSA
簽名具有的特性:
- 安全性
- 抗否認性
數字簽名:帶有密鑰(公鑰、私鑰)的消息摘要算法(使用私鑰進行簽名,使用公鑰進行驗證)
數字簽名算法:RSA、DSA、ECDSA
數字簽名特性:
- 驗證數據完整性
- 認證數據來源
- 抗否認性
-
經典算法
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; } }