關於RSA 非對稱加密算法(簽名,校驗)的使用

package com.xwf;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class SignTest {

    public static final String KEY_ALGORTHM="RSA";
    
    public static final String SIGNATURE_ALGORITHM="SHA1withRSA";
    
    public static void main(String[] args) {
        try {
            
            Map<String,Object> key = initKey();
            String source = "123456";
            String privateKey = getPrivateKey(key);
            String publicKey = getPublicKey(key);
            
            // 簽名
            String sign = sign(source.getBytes(), privateKey);
            System.out.println("sign:" + sign);
            
            // 校驗
            boolean result = verify(source.getBytes(), publicKey, sign);
            System.out.println("verify result:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    
    /**
     * 初始化密鑰
     * @return
     * @throws Exception
     */
    public static Map<String,Object> initKey()throws Exception{
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM);
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
         
        //公鑰
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        //私鑰
        RSAPrivateKey privateKey =  (RSAPrivateKey) keyPair.getPrivate();
         
        Map<String,Object> keyMap = new HashMap<String, Object>(2);
        keyMap.put("PUBLIC_KEY", publicKey);
        keyMap.put("PRIVATE_KEY", privateKey);
         
        return keyMap;
    }
    
    /**
     * 取得公鑰,並轉化爲String類型
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPublicKey(Map<String, Object> keyMap)throws Exception{
        Key key = (Key) keyMap.get("PUBLIC_KEY");  
        return encryptBASE64(key.getEncoded());     
    }
 
    /**
     * 取得私鑰,並轉化爲String類型
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception{
        Key key = (Key) keyMap.get("PRIVATE_KEY");  
        return encryptBASE64(key.getEncoded());     
    }
    
    
    /**
     *  用私鑰對信息生成數字簽名
     * @param data  //加密數據
     * @param privateKeyString    //私鑰
     * @return
     * @throws Exception
     */
    public static String sign(byte[] data,String privateKeyString)throws Exception{
        //解密私鑰
        byte[] keyBytes = decryptBASE64(privateKeyString);
        //構造PKCS8EncodedKeySpec對象
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
        //指定加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
        //取私鑰匙對象
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        //用私鑰對信息生成數字簽名
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initSign(privateKey);
        signature.update(data);
         
        return encryptBASE64(signature.sign());
    }
    
    /**
     * BASE64解密
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception{
        return (new BASE64Decoder()).decodeBuffer(key);
    }
     
    /**
     * BASE64加密
     * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key)throws Exception{
        return (new BASE64Encoder()).encodeBuffer(key);
    }
    
    /**
     * 校驗數字簽名
     * @param data  加密數據
     * @param publicKeyString 公鑰
     * @param sign  數字簽名
     * @return
     * @throws Exception
     */
    public static boolean verify(byte[] data,String publicKeyString,String sign)throws Exception{
        //解密公鑰
        byte[] keyBytes = decryptBASE64(publicKeyString);
        //構造X509EncodedKeySpec對象
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
        //指定加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
        //取公鑰匙對象
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
         
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(publicKey);
        signature.update(data);
        //驗證簽名是否正常
        return signature.verify(decryptBASE64(sign));
         
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章