非對稱加密算法之RSA

一.概述
  (1)非對稱加密是通過兩個密鑰(公鑰-私鑰)來實現對數據的加密和解密的。
  (2)RSA可以通過兩種方式加解密:公鑰加密私鑰解密 和 私鑰加密公鑰解密。
  (3)缺點:效率比較低,由於RSA 的分組長度太大,爲保證安全性,使運算代價很高,較對稱加密算法慢幾個數量級

二.加解密過程簡析
  1.發送者使用私鑰加密數據,接收者使用公鑰解密數據。
  2.發送者使用公鑰加密數據,接收者使用私鑰解密數據。

三.CODE SHOW
public class TestRSA {
		//公鑰加密、私鑰解密
		//私鑰加密、公鑰解密
		private static String src="RSA加密算法";  
		private static String RSATYPE ="RSA";
	    public static void main(String[] args){  
	    	System.out.println("----------RSA-私鑰加密、公鑰解密----------");
	        jdkRSA1(); 
	        System.out.println("----------RSA-公鑰加密、私鑰解密----------");
	        jdkRSA2();
	    }  
	  
	    //私鑰加密、公鑰解密
	    public static void jdkRSA1(){  
	        try {  
	            //初始化密鑰  
	            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(RSATYPE);  
	            keyPairGenerator.initialize(512);  
	            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()));
	  
	            //私鑰加密
	            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); 
	            KeyFactory keyFactory = KeyFactory.getInstance(RSATYPE);  
	            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
	            Cipher cipher = Cipher.getInstance(RSATYPE);
	            cipher.init(Cipher.ENCRYPT_MODE, privateKey); //加密模式
	            byte[] result = cipher.doFinal(src.getBytes());
	            System.out.println("加密數據:"+Base64.encodeBase64String(result));
	            
	            //公鑰解密
	            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
	            keyFactory = KeyFactory.getInstance(RSATYPE);  
	            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
	            cipher = Cipher.getInstance(RSATYPE);
	            cipher.init(Cipher.DECRYPT_MODE, publicKey); //解密模式
	            byte[] decryptResult = cipher.doFinal(result);
	            System.out.println("解密結果:"+ new String(decryptResult));
	  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
	    }  
	    
	    //公鑰加密、私鑰解密
	    public static void jdkRSA2(){  
	        try {  
	            //初始化密鑰  
	            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(RSATYPE);  
	            keyPairGenerator.initialize(512);  
	            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()));
	  
	            //公鑰加密
	            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
	            KeyFactory keyFactory = KeyFactory.getInstance(RSATYPE);  
	            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
	            Cipher cipher = Cipher.getInstance(RSATYPE);
	            cipher.init(Cipher.ENCRYPT_MODE, publicKey); //加密模式
	            byte[] result = cipher.doFinal(src.getBytes());
	            System.out.println("加密數據:"+Base64.encodeBase64String(result));
	            
	            //私鑰解密
	            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); 
	            keyFactory = KeyFactory.getInstance(RSATYPE);  
	            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
	            cipher = Cipher.getInstance(RSATYPE);
	            cipher.init(Cipher.DECRYPT_MODE, privateKey); //解密模式
	            byte[] decryptResult = cipher.doFinal(result);
	            System.out.println("解密結果:"+ new String(decryptResult));
	  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
	    }  
}

四.輸出結果


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