1. 程式人生 > >RSA加密演算法心得

RSA加密演算法心得

RSA加密金鑰是非對稱的,一般是成對出現分為公鑰和私鑰,所以也叫非對稱加密,可以公鑰加密,私鑰解密,也可以私鑰加密,公鑰解密。

一般用於資料加密。

初始化金鑰,可生成一對RSA金鑰:

KeyPairGenerator keyPairGenerator= KeyPairGenerator.getInstance("RSA");  ---設定加密演算法
keyPairGenerator.initialize(2048);  ---設定金鑰的位數
KeyPair keyPair=keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey=(RSAPublicKey)keyPair.getPublic
(); ----公鑰 RSAPrivateKey rsaPrivateKey=(RSAPrivateKey)keyPair.getPrivate(); ----私鑰 System.out.println("publickey:"+Base64.encodeBase64String(rsaPublicKey.getEncoded())); ---輸出的是字串型公鑰 System.out.println("privatekey:"+Base64.encodeBase64String(rsaPrivateKey.getEncoded())); ---輸出的是字串型私鑰

需要注意的是,需要使用Base64 類來對金鑰進行相應的轉換,需要匯入jar包 commons-codec-1.8.jar

有兩個常用的方法:
encodeBase64String(byte陣列);用於將byte陣列型別的金鑰轉換成字串型金鑰
decodeBase64(字串); 用於將字串型金鑰轉換成byte陣列型金鑰

使用公鑰加密:

//獲取公鑰
X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(pubKey);  ---使用公鑰時用的一個關鍵類,
//金鑰工廠初始化
 KeyFactory keyFactory=KeyFactory.getInstance("RSA"
); //生成公鑰 PublicKey publicKey=keyFactory .generatePublic(x509EncodedKeySpec); //資料加密 Cipher cipher=Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); ----設定是模式,即加密還是解密,此處是加密 ENCRYPT_MODE byte[] result=cipher.doFinal(data); return result;

返回的result就是加密後的byte型密文,注意轉成字串是需要用Base64的方法

使用私鑰解密:

//獲取私鑰
PKCS8EncodedKeySpec pkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(privKey);  --使用私鑰時用的一個關鍵類
//金鑰工廠初始化
KeyFactory keyFactory=KeyFactory.getInstance("RSA"); //生成私鑰
PrivateKey privateKey=keyFactory
.generatePrivate(pkcs8EncodedKeySpec); //資料解密
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);   -------設定是模式,即加密還是解密,此處是解密DECRYPT_MODE
byte[] clearText=cipher.doFinal(cipherText);
return clearText; 

返回的就是byte型別的解密後的明文,注意轉成字串是不需要用Base64的方法,直接new 一個String物件就行newString(clearText)

原始碼:

package org.me.demo1;

import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import org.apache.commons.codec.binary.Base64;

/**
 * 
 * @author zhouluping
 *  RSA公鑰加密和私鑰解密
 *  需要導一個jar包 commons-codec-1.8.jar,  Base64類  用於將密文轉換成byte陣列 
 */
public class RsaDemo2 {

    //公鑰加密
    public static byte[] rsaEncrypt(byte[] data,byte[] pubKey){

        try {
            //獲取公鑰
            X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(pubKey);
            //金鑰工廠初始化
            KeyFactory keyFactory=KeyFactory.getInstance("RSA");
            //生成公鑰
            PublicKey publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
            //資料加密
            Cipher cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] result=cipher.doFinal(data);

            return result;

        } catch (NoSuchAlgorithmException e) {
            System.out.println("NoSuchAlgorithmException!");
        } catch (InvalidKeySpecException e) {
            System.out.println("InvalidKeySpecException!");
        } catch (NoSuchPaddingException e) {
            System.out.println("NoSuchPaddingException!");
        } catch (InvalidKeyException e) {
            System.out.println("InvalidKeyException!");
        } catch (IllegalBlockSizeException e) {
            System.out.println("IllegalBlockSizeException!");
        } catch (BadPaddingException e) {
            System.out.println("IllegalBlockSizeException!");
        }

        return null;
    }

    //私鑰解密
    public static byte[] rsaDecrypt(byte[] cipherText,byte[] privKey){

        try {
            //獲取私鑰
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(privKey);
            //金鑰工廠初始化
            KeyFactory keyFactory=KeyFactory.getInstance("RSA");
            //生成私鑰
            PrivateKey privateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            //資料解密
            Cipher cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] clearText=cipher.doFinal(cipherText);
            return clearText;

        } catch (NoSuchAlgorithmException e) {
            System.out.println("NoSuchAlgorithmException!");
        } catch (InvalidKeySpecException e) {
            System.out.println("InvalidKeySpecException!");
        } catch (NoSuchPaddingException e) {
            System.out.println("NoSuchPaddingException!");
        } catch (InvalidKeyException e) {
            System.out.println("InvalidKeyException!");
        } catch (IllegalBlockSizeException e) {
            System.out.println("IllegalBlockSizeException!");
        } catch (BadPaddingException e) {
            System.out.println("IllegalBlockSizeException!");
        }

        return null;
    }

    public static void main(String[] args) {
//      String pubKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqUWHDpQcks/TcWTR5kFM2TXBUS9Gsm/qJ6ZTN9lGQlXIEQEaVwze8YpcgcVnQjbd5V+ogejZlO2EbYygwdzHDYDK5foNy9xk3Tpf9RF1h6X0ilsGSmbt7IIJoTK76C35ep/r7EiVR+LVNxF47OKVevIk6bvFca2Tg2Qfcc1wTZTHF2BD9EcnCt7a4pDYK1q0S+1pnald6yrCZIHtBuxZ5B5x099ArRHackQzf6FrxVuVud3Du98NlbJIVtm7L0l9sVmx4ItdGUA3YTSAzwd67l52ka5gVkLeGdpWTEiLLNJbBVXesqdLEdVub/q9Di23v3ftZC9vXWU/VOmLc5mDnwIDAQAB";
        String pubKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp8CEgkk2+5fgSncArbujdZyBCrN8D5cpSHHAm/ItkA3DuGV3cYqDV83Xx5m173UETOkJvhhSi/uT4d+lxqk4NBh0CYHfP6gElDHp+syQ5dvrm6jxiwnc/3RBOfyusa4kDrknGncn+w9iwruB7Wsng/YnA4G99BjXfI+QCYzgUSJYQxetZg79805kIxu0/hfMqkQWCdwUV6B0bk2Cn5CLWhRk/MT1gTgVclVJHw1Bb83wWmYtHu0PWfUyUi+nM3o8jzXKuwBK8aDqNZ2EXMZ5GTU1TXBYbdyZ17YhOU3kD/hdTYwzXdzr7wSv/f+RZWaOPF5doqfOLP3VKRRH/IPy3wIDAQAB";
        String clearText="today is third day!";
        System.out.println("未加密明文:"+clearText);
        byte[] cipherText=rsaEncrypt(clearText.getBytes(),Base64.decodeBase64(pubKey));
        System.out.println("密文:"+Base64.encodeBase64String(cipherText));

        String priKey="MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCnwISCSTb7l+BKdwCtu6N1nIEKs3wPlylIccCb8i2QDcO4ZXdxioNXzdfHmbXvdQRM6Qm+GFKL+5Ph36XGqTg0GHQJgd8/qASUMen6zJDl2+ubqPGLCdz/dEE5/K6xriQOuScadyf7D2LCu4HtayeD9icDgb30GNd8j5AJjOBRIlhDF61mDv3zTmQjG7T+F8yqRBYJ3BRXoHRuTYKfkItaFGT8xPWBOBVyVUkfDUFvzfBaZi0e7Q9Z9TJSL6czejyPNcq7AErxoOo1nYRcxnkZNTVNcFht3JnXtiE5TeQP+F1NjDNd3OvvBK/9/5FlZo48Xl2ip84s/dUpFEf8g/LfAgMBAAECggEBAKd7ttC9eH/JKs4t8ieC57hNASlF+d829Ki3qa4JJSRmGbrI03Aw8uF/Sqil9teU5S5EnM2GSyQnkYY6XLDz0oFwyKmVWOedQLUVAJ6+DwzvfVR0YHSI7HTABT934JLVYnqwsTHjNa+btObnftkj2tgNsvX1W0mSY9KhIxXl6TAWkOe9o1h3nWt6fLtnAFzxbi43REY0R7Il6onRIzJ1HHo6j/uW3RiridXPsNQ7YyXUj3qBAlwtmzHQDfoo4yKZMe/WpmfNKkG/lsaDipc3oJvJ2rGVfgPEJSTL0R3pFlypSpjS0jU4qOk9eFhJLDMn2qpcDbl8G+DrXqvdYEt7TUECgYEA7AxwXUZPaORIK3JqWpC971i8y73NdQ++0UpDV9lV/AepJl4unKVycfugNhgjKxo5+hL13r6DMte3aO69yqJ4qUTlAe7SpctzrOXJXsLam+Me/x9OWfAQH29+Ro04WYOO9H9o2U1l8PtMhHloFM5dTxSgXwOnYUkOvR4tKO1gK80CgYEAte5LX6/3NcU4VNY831dnJ5gOfrvjf9ywenvKI7/HobKLQWmR9mQ8cTjydVLswAlNREAM0RhUnIDR9ctFLR4+n45DzUeMMYBH/6it7Pgn7clnmMK+Llf69GDT5CY08wkcakSeEOKxhJm9O/2HGXJuUmVYTTllUINgnpJSFlq+5VsCgYEAtrEt6lM3tMQyQ0YroGq0RmIUxU/ii76i/lMO6hgxH35CYYq1YtH+UM/igNuPpJWI188C8uHao2gn8RQOWp4C62eCI0vXRzC/F8tFXo1LKynO3MA7IQrXP61IO4yjV0ymQP+3g7AOvUOSRlm8v5W0zDb3pHIsgvRLbv3DEBEgxOUCgYAsBwMOoRL+XEAJp98LXaeFGXNIkEe6Bbpfqd19UUgKhZ7Vsaq1KgTGkbV7VxocTyP3xFhVscGoLjShexO+m3ckPdWCtDHlONozsKqGknd3QCpl+Zr0tC3zPguJRwXBWw8ZWIm4JGQ5Zss43V34dozkO8pmxeES3vhe56Id7tALyQKBgQDek9tvdRRieNpqsTNhaPIPXa5ZFZ6pmyNpn6WWUx/ZOTApprM6kD4yFPhdzBFaeLl+U/C0Dmb1SKKWAPKJw6BEThv60db5oei7CE6zu2PAkJ83GAvJSFXrbDdK5y14CEXa+Zd3it5duT03A8uKsTe8gpSIIvATd5hN8YnJDkWa/w==";
        byte[] dectyptText=rsaDecrypt(cipherText, Base64.decodeBase64(priKey));
        System.out.println("解密後的明文:"+new String(dectyptText));
    }
}