1. 程式人生 > >rsa加密演算法的加解密所踩過的坑

rsa加密演算法的加解密所踩過的坑

package cn.com.yusys.yusp.uaa.security;

/**
 * @專案名稱: yusp-commons
 * @類名稱: RSAUtil
 * @類描述: 
 * @功能描述: 
 * @建立人: [email protected]
 * @建立時間: 2018-02-05 13:13
 * @修改備註: 
 * @修改記錄: 修改時間    修改人員    修改原因
 * -------------------------------------------------------------
 * @version 1.0.0
 * @Copyright (c) 201
 */
import java.io.ObjectInputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;
import org.springframework.util.Base64Utils;

import cn.com.yusys.yusp.commons.util.Base64Tools;

public class BCRSAUtil {

	private static RSAPublicKey pubKey = null;
	private static RSAPrivateKey priKey = null;
	private static String filePath = "C:\\private.key";
	private static String filePath2 = "C:\\public.key";

	static {
		try {
			Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

			priKey = (RSAPrivateKey) readKey("private.key");
			pubKey = (RSAPublicKey) readKey("public.key");

		} catch (Exception err) {
			err.printStackTrace();
		}
	}

	private static Key readKey(String keyName) throws Exception {
		
		ObjectInputStream keyIn = new ObjectInputStream(BCRSAUtil.class.getClassLoader().getResourceAsStream(keyName));
		Key key = (Key) keyIn.readObject();
		keyIn.close();
		return key;
	}

	public static String decrypt(String rawStr) throws Exception {
		byte rst[] = decrypt(priKey,Base64.decodeBase64(rawStr));
		return new String(rst);
	}

	public static byte[] decrypt(Key key, byte[] raw) throws Exception {
		Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
		cipher.init(Cipher.DECRYPT_MODE, key);
		return cipher.doFinal(raw);
	}
	
	/**
	  * 使用RSA公鑰加密資料
	  * 
	  * @param pubKeyInByte
	  *            打包的byte[]形式公鑰
	  * @param data
	  *            要加密的資料
	  * @return 加密資料
	  */
	public static byte[] encryptByRSA(byte[] pubKeyInByte, byte[] data) {
	  try {
	   KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
	   X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(pubKeyInByte);
	   PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
	   Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
	   cipher.init(Cipher.ENCRYPT_MODE, pubKey);
	   return cipher.doFinal(data);
	  } catch (Exception e) {
	   return null;
	  }
	}
	
	/**
	 * @方法名稱:encryptByPublicKey
	 * @方法描述:公鑰加密
	 * @引數與返回說明:加密結果
	 * @演算法描述:
	 */
	public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
		byte[] keyBytes = Base64Utils.decodeFromString(publicKey);
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		Key publicK = keyFactory.generatePublic(x509KeySpec);
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicK);

		return cipher.doFinal(data);
	}
	public static void main(String[] args) {

		String orgString = "159753";

		String encryptString = "";
		String decryptString = "";

		RSAPublicKey pubKey = null;
		RSAPrivateKey priKey = null;
		try {
			// 3- 服務端私鑰
			priKey = (RSAPrivateKey) readKey("private.key");
			// 4- 服務端公鑰
			pubKey = (RSAPublicKey) readKey("public.key");

			System.out.println("priKey:\n" + priKey + "\n");
			System.out.println("pubKey:\n" + pubKey + "\n");
		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println("\n=============================== Step-1:服務端公鑰加密-服務端私鑰解密\n");

		// 服務端公鑰加密-服務端私鑰解密
		try {
			byte[] data = orgString.getBytes();

			// 加密資料
			byte[] encodedData = BCRSAUtil.encryptByPublicKey(data,Base64Tools.encodeToString(pubKey.getEncoded(), false));
			encryptString = new String(encodedData);
			String base64decryptString = Base64Tools.encodeToString(encodedData, false);
			String base64decrypt = new String(Base64Tools.decode(base64decryptString));

			

			System.out.println("orginalString:" + orgString+"\n");
			System.out.println("encrypString:" + encryptString+"\n");
			System.out.println("base64decryptString:" + base64decryptString+"\n");
			System.out.println("base64decrypt:" + base64decrypt+"\n");
			decryptString = BCRSAUtil.decrypt(base64decryptString);
			System.out.println("decryptString:" + decryptString);
		} catch (Exception e) {
			System.err.println(e.getMessage());
			System.err.println("Step-5  解密失敗!");
		}
	}

}

相關推薦

rsa加密演算法解密

package cn.com.yusys.yusp.uaa.security; /** * @專案名稱: yusp-commons * @類名稱: RSAUtil * @類描述: * @功能描述: * @建立人: [email protected] * @建立時間: 2018-02

Openssl aes對稱加密演算法 解密例程 1

前面我們用openssl的aes256對稱加密演算法對16個位元組的記憶體塊進行了的加解密運算測試,現在更進一步,對指定大小的記憶體塊進行加解密運算。 首先明確一下aes是分組加密演算法,且每次加密的記憶體塊是16個位元組,所以,我們需要加密的記憶體塊必須是16個位元組的整數倍,若不是,則需要進行補齊。

RSA加密演算法解密步驟的證明

    pq = N  p,q為兩個質數     記[N,e], [N,d]分別為演算法中的公鑰和私鑰,根據演算法性質知ed = 1 mod (p-1)(q-1)  這裡的等號為模等,下同    則ed=1 mod (p-1)   ed=1 mod (q-1)     記n

從檔案加密解密RSA加密演算法

1.檔案的加密解密        其實檔案的加密解密我們可以理解成在複製檔案時對檔案中的每一個位元組做一些操作,比如最簡單的就是加上一個常數或一個隨機數,還有取模等,只要把它變成不是原本的模樣就OK了。       以下給出生成隨機數的方式加密:MyKey是一個生成128

RSA加密演算法-前臺JS加密-後臺java解密

1、前臺使用jsencrypt的RSA加密: https://github.com/travist/jsencrypt/tree/v2.3.0 2、後臺使用java解密-包括生成公鑰和金鑰 package com.hand.hdmp.core.util; import java.

RSA演算法解密(JAVA)

/** * RSA加密演算法的演示驗證 * RSA是一種分組加密演算法 * 注意:金鑰對採用的長度決定了加密塊的長度,我這裡取的是2048,即256byte * 由於加密塊的長度固定為256,因此明文的長度至多為256 - 11 = 245byte * 我這裡明文

RSA非對稱解密演算法的使用

加密金鑰和解密金鑰相同時則稱為對稱加密。由於加密金鑰和解密金鑰相同,它們也被稱為Shared Key。如AES等。 加密金鑰(公鑰)和解密金鑰(私鑰)不相同時則稱為非對稱加密,別稱公鑰密碼。如RSA等。 非對稱加密例子: 假設張三擁有的公鑰Pu和私鑰Pr,其公鑰是公開的,誰

RSA演算法解密---crypto++庫和OpenSSL庫

1. OpenSSL庫 a、 方式一: #include<string.h>#include <openssl/rsa.h>#pragma comment(lib,"libeay32.lib")#pragma comment(lib,"ssleay3

iOS-RSA非對稱解密

實驗目標 程式語言不限 至少實現RSA生成公私鑰,並儲存為金鑰檔案,最好是ECC演算法 明文“學號+姓名+專業+學院” 使用其中一種金鑰加密,輸出密文 解密密文,輸出明文 調研PKI公鑰體系,在報告中說明,如何用公私鑰實現PKI體系 簡述E

RSA加密演算法簡單分析

         預備知識       1)RSA是第一個比較完善的公開金鑰演算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest,

RSA加密演算法生成公鑰和私鑰

Java RSA加密演算法生成公鑰和私鑰 import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.interf

RSA加密演算法驗證(C#實現)

RSA演算法簡單原理介紹(節選於網路) 假設Alice想要通過一個不可靠的媒體接收Bob的一條私人訊息。她可以用以下的方式來產生一個公鑰和一個私鑰: 隨意選擇兩個大的質數p和q,p不等於q,計算N=pq。 根據尤拉函式,求得r = (p-1)(q-1) 選擇一個小於 r

Python實現RSA加密演算法

基本思路在這裡說一下: 設p、q為質數 n = p*q fn = (p-1)*(q-1) 要滿足: 1 < e < fn , 且 e 與 fn 互質 滿足: e*d%fn = 1 (d>1) e 為公鑰 , d 為私鑰 把e 和 n 發給 客戶端 m 為明文 c =

利用pandas的to_sql將資料插入MySQL資料庫和

前言 最近做一個Django web的專案要把爬取的一些資料存入MySQL中,資料儲存為csv格式,想到pandas中有to_sql這個方法,就採用它了 準備:連線MySQL資料庫所需的第三方包pymysql、sqlalchemy(pip安裝即可) 實現 from sql

快速理解RSA加密演算法

RSA公開金鑰密碼體制 所謂的公開金鑰密碼體制就是使用不同的加密金鑰與解密金鑰,是一種“由已知加密金鑰推匯出解密金鑰在計算上是不可行的”密碼體制。 在公開金鑰密碼體制中,加密金鑰(即公開金鑰)PK是公開資訊,而解密金鑰(即祕密金鑰)SK是需要保密的。加密演算法E和解密演算法D也都是公開的。雖然解密金鑰SK是由

使用docker第一次安裝rabbitmq

一、Docker CE安裝    1. 系統版本要求      在安裝Docker前需要確保作業系統核心版本為 3.10以上,因此需要CentOS7 ,CentOS7核心版本為3.10。   2.檢查是否安裝過舊的版本 

那些年深度學習-第一

博主在學習簡單的深度學習的時候用的是mac電腦,正是因為用的是這個電腦,所以說在跑程式碼的時候遇到過很多坑,因此決定將那些年踩過的坑全部記錄下來。 由於看的論文主要是關於C3D卷積神經網路的,因此我準備將github上面的C3D的程式碼下載下來跑一下 經過整理之後,資料夾裡面的檔案如圖  

rsa加密後無法解密的問題

今天和Java對接後臺介面,發現Java加完密之後的我這邊(PHP)無法解密,原因是:rsa加密長度最長是117,超過這個長度就需要分段加密,下面直接奉上rsa加解密類庫 <?php /** * rsa加密類 * Class Rsa */ class Rsa { const

在ubuntu 14.04上LIFT: Learned Invariant Feature Points 環境配置流過的淚(3)

1.重灌nvidia 顯示卡驅動 2.重灌cuda8.0和cudnn 3。重新測試 看來執行不能用sudo 最後也沒管 2. theano nvcc compiler not found on $PATH 重新配置檔案 解決方案:重灌了一遍cuda 和c

前端開發

本文摘要來自摩拜前端團隊 yingye ,如有不對地方請指正本文主要分享構建和開發中遇到的坑:比