1. 程式人生 > >RSA演算法的分段加密

RSA演算法的分段加密

一.rsa演算法介紹:百度百科

二.首先通過rsa演算法生成一對公私鑰

 private static void generateKeyPair() throws Exception{
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        /** RSA演算法要求有一個可信任的隨機數源 */
        SecureRandom sr = new SecureRandom();
        /** 為RSA演算法建立一個KeyPairGenerator物件 */
        
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        /** 利用上面的隨機資料來源初始化這個KeyPairGenerator物件 */
        kpg.initialize(4096, sr);
        /** 生成密匙對 */
        KeyPair kp = kpg.generateKeyPair();
        /** 得到公鑰 */
        Key publicKey = kp.getPublic();
        /** 得到私鑰 */
        Key privateKey = kp.getPrivate();
    
        /** 用物件流將生成的金鑰寫入檔案 */
        ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(ResourceBundleUtil.getSystem(WYPublicKey)/*"yxb_ok_publickey.keystore"*/));
        ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(ResourceBundleUtil.getSystem(WYPrivateKey)/*"text_privatekey.keystore"*/));
        oos1.writeObject(publicKey);
        oos2.writeObject(privateKey);
        /** 清空快取,關閉檔案輸出流 */
        oos1.close();
        oos2.close();
    }

三.對字串進行分段加密操作

    1.進行加密操作

public static String encrypt(String source,String publickey) throws Exception{   //source為需要加密的對應  publickey-rsa公鑰
    	  
    	  /** 將檔案中的公鑰物件讀出 */
    	ObjectInputStream ois = new ObjectInputStream(RsaUtil.class.getResourceAsStream("/"+publickey));
    	Key key = (Key) ois.readObject();
        ois.close();
        /** 得到Cipher物件來實現對源資料的RSA加密 */
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, key);
       byte[] b = source.getBytes("utf-8");
      
        byte[] b1 = null;
        /** 執行加密操作 */
        for (int i = 0; i < b.length; i += 501) {  
       	byte[] doFinal  = cipher.doFinal(ArrayUtils.subarray(b, i,i + 501));      
        	b1 = ArrayUtils.addAll(b1, doFinal);  
        }
    	BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(b1);      
        
    }

2.對加密後引數進行對應的解密:

public static String decrypt(String cryptograph,String privatekey) throws Exception{ //cryptograph-通過rsa公鑰加密得到的引數  privatekey-與公鑰對應的私鑰
    	 /** 將檔案中的私鑰物件讀出 */
    	// cryptograph= new String(cryptograph.getBytes(),"gbk");
    	ObjectInputStream ois = new ObjectInputStream(RsaUtil.class.getResourceAsStream("/"+privatekey));
        Key key = (Key) ois.readObject();
        /** 得到Cipher物件對已用公鑰加密的資料進行RSA解密 */
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, key);
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] b1 = decoder.decodeBuffer(cryptograph);
        /** 執行解密操作 */
        byte[] b = null;
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < b1.length; i += 512) {
       	byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(b1, i, i + 512));    
       	sb.append(new String(doFinal,"utf-8"));
       }
        return sb.toString();

    }

3.測試方法

 public static void main(String[] args) throws Exception {
    	
    	String a = "abc";
    	String b = encrypt(a,"yxb_ok_publickey.keystore");
    	String c = decrypt(b,"yxb_ok_privatekey.keystore");
    	System.out.println("加密前的引數:"+a);
    	System.out.println("加密後的引數為:"+b);
    	System.out.println("解密後的引數:"+c);

}  

4.執行結果為:


5.專案匯入的包為:

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.crypto.Cipher;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.xml.security.utils.Base64;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
總結:分段加密可以避免應為需要加密的原字串過長而出現錯誤。

相關推薦

JS到PHP使用RSA演算法進行加密通訊

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

夜深人靜寫演算法(十三)- RSA演算法加密與解密

目錄   一、概述       1、加密與解密    &

使用PHP實現RSA演算法加密和解密

本文提供使用RSA演算法加密解密資料的PHP程式類(簽名和驗籤的實現方式可以檢視使用PHP實現RSA演算法的簽名和驗籤 這篇文章),封裝了格式化公鑰和私鑰檔案的方法,這樣無論使用什麼格式的公鑰或者私鑰都可以正常執行,公鑰加密後使用私鑰解密或者私鑰加密後用公鑰解密

RSA演算法 JS加密 JAVA解密

有這樣一個需求,前端登入的使用者名稱密碼,密碼必需加密,但不可使用MD5,因為後臺要檢測密碼的複雜度,那麼在保證安全的前提下將密碼傳到後臺呢,答案就是使用RSA非對稱加密演算法解決 。 java程式碼 import org.apache.commons.

Java中利用RSA演算法進行加密解密

首先需要兩個工具類 package cnsts.common.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; i

RSA演算法分段加密

一.rsa演算法介紹:百度百科二.首先通過rsa演算法生成一對公私鑰 private static void generateKeyPair() throws Exception{ Security.addProvider(new com.sun.crypto

Python rsa公私鑰生成 rsa公鑰加密(分段加密)私鑰加簽實戰

you port pen man length comment 數據加密 自己 keygen 一般現在的SAAS服務提供現在的sdk或api對接服務都涉及到一個身份驗證和數據加密的問題。一般現在普遍的做法就是配置使用非對稱加密的方式來解決這個問題,你持有SAAS公司的公鑰,

php openssl_sign() 語法+RSA公私鑰加密解密,非對稱加密演算法詳解

其實有時候覺得寫部落格好煩,就個函式就開篇部落格。很小的意見事情而已,知道的人看來多取一舉,或者說沒什麼必要,浪費時間,不知道的人就會很鬱悶。技術就是這樣的,懂的人覺得真的很簡單啊,不知道的人真的好難。。。 一般在跟第三方介面對接資料的時候,為了保證很多都使用的RSA簽名,沒性趣瞭解的同學只需要

RSA非對稱加密演算法(表單提交時,前端js加密,後端java解密)

RSA非對稱加密演算法(表單提交時,前端js加密,後端java解密 非對稱加密演算法 需要的工具 前端jsp頁面 js程式碼 加密解密的工具類 產生公鑰的類 處理登陸請求的類 加密成功的密碼 非對稱加密演算

加密演算法總結 加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用

PHP RSA演算法 HMAC-SHA1加密演算法

HMAC-SHA1加密演算法 function getSignature($str, $key) { $signature = ""; if (function_exists('hash_hmac')) { $signature = base64_encode(h

python3 RSA演算法生成祕鑰對、檔案加密解密

RSA檔案加密解密生成祕鑰對檔案加密檔案解密 生成祕鑰對 @staticmethod def create_rsa_keys(code='nooneknows'): # 生成 2048 位的 RSA 金鑰 key

非對稱加密RSA演算法

1977年,MIT的三位老師Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法以他們三個人的名字命名為RSA。RSA演算法是使用最為廣泛的非對稱加密演算法。 RSA加密利用了單向函式正向求解很簡單,反向求解很複雜的特

非對稱加密過程詳解(基於RSA非對稱加密演算法實現)

1、非對稱加密過程:         假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:   說明:         國內目前使用雙證書體系,即

JAVA密碼加密演算法.RSA演算法(非對稱加密演算法)和密碼加鹽MD5

密碼加鹽MD5 Message Digest Algorithm MD5(中文名為訊息摘要演算法第五版)為電腦保安領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。 是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有MD5實現。將資料(如漢字)運

密碼學03--go語言與非對稱加密RSA演算法的實現

目錄 1.對稱加密的弊端 2.非對稱加密 2.1 非對稱加密使用場景 2.2 區分公私鑰 2.3 非對稱加密通訊流程 2.4 非對稱加密與對稱加密 3.非對稱加密RSA演算法 3.1 RSA演算法 3.2 RSA原理 3.3 RSA生成金鑰對流程

php RSA非對稱加密演算法

class Rsa { private static $PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----MIICXgIBAAKBgQCoZZ8iUBprOIc0kGckr5ax6/Fd9IKKMc/XHayKEAvqpS0oz0b1ojEkpk

RSA演算法加密

摘錄至吳軍教授的數學之美第二版 以單詞Caesar加密和解密為例。首先,把它變成一組數,比如它的ASCII程式碼X=067097101115097114(每三位代表一個字母)做明碼。現在來設計一個密碼系統,對這個明碼加密。 1.找兩個很大的素數P Q,越大越好,比如10

java 加密RSA演算法加密與解密的例項詳解

前言:  RSA是第一個比較完善的公開金鑰演算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個演算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定R

Java安全學習筆記(十一)-RSA演算法加密和解密

RSA演算法是使用整數進行加密和解密運算的, 加密:在RSA公鑰中包含了兩個資訊:公鑰對應的整數e和用於取模的整數n。對於明文數字m,計算密文的公式是: m^e mod n. 解密:跟加密類似,私鑰對應的指數e和用於取模的整數m.其中模m和加密時的加密的模