簽名具備的特性:java
數字簽名:帶有密鑰(公鑰、私鑰)的消息摘要算法(使用私鑰進行簽名,使用公鑰進行驗證) 程序員
數字簽名算法:RSA、DSA、ECDSA算法
數字簽名特性:數組
經典算法安全
MD、SHA兩類微信
數字簽名算法-RSA的執行過程spa
代碼:code
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; /** * <p>微信公衆號:程序員之路</p> * <p>博客:http://www.cnblogs.com/chengxuyuanzhilu</p> * @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; } }