RSA演算法加解密(JAVA)
/** * RSA加密演算法的演示驗證 * RSA是一種分組加密演算法 * 注意:金鑰對採用的長度決定了加密塊的長度,我這裡取的是2048,即256byte * 由於加密塊的長度固定為256,因此明文的長度至多為256 - 11 = 245byte * 我這裡明文長度取的是128byte,密文長度為256byte,它適合於小檔案加密 */ package encrypto; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** * @author liuhuabai,
[email protected] * */ public class RSADemo { /** * 公鑰 */ private RSAPublicKey publicKey; /** * 私鑰 */ private RSAPrivateKey privateKey; /** * 用於加解密 */ private Cipher cipher; /** * 明文塊的長度 它必須小於密文塊的長度 - 11 */ private int originLength = 128; /** * 密文塊的長度 */ private int encrytLength = 256; /** * 得到初始化的公鑰和私鑰 * @throws NoSuchAlgorithmException * @throws NoSuchPaddingException */ public void initKey() throws NoSuchAlgorithmException, NoSuchPaddingException { //RSA加密演算法:建立金鑰對,長度採用2048 KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA"); kg.initialize(encrytLength * 8); KeyPair keypair = kg.generateKeyPair(); //分別得到公鑰和私鑰 publicKey = (RSAPublicKey) keypair.getPublic(); privateKey = (RSAPrivateKey) keypair.getPrivate(); } /** * 將公鑰儲存至檔案 * @param file 待寫入的檔案 * @return true 寫入成功;false 寫入失敗 */ public boolean savePublicKey(File file) { return this.saveKey(publicKey, file); } /** * 將私鑰保持至檔案 * @param file 待寫入的檔案 * @return true 寫入成功;false 寫入失敗 */ public boolean savePrivateKey(File file) { return this.saveKey(privateKey, file); } //將Key檔案保持到檔案中 private boolean saveKey(Key key,File file) { boolean write; FileOutputStream fos = null; try { fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); //System.out.println(key.getFormat()); //公鑰預設使用的是X.509編碼,私鑰預設採用的是PKCS #8編碼 byte [] encode = key.getEncoded(); //注意,此處採用writeObject方法,讀取時也要採用readObject方法 oos.writeObject(encode); write = true; } catch (IOException e) { write = false; } finally { try { if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } return write; } /** * 從檔案中得到公鑰 * @param file 儲存公鑰的檔案 */ public void getPublicKey(File file) { getKey(file,0); } /** * 從檔案中得到私鑰 * @param file 儲存私鑰的檔案 */ public void getPrivateKey(File file) { getKey(file,1); } private void getKey(File file,int mode) { FileInputStream fis; try { //讀取資料 fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); byte [] keybyte = (byte[]) ois.readObject(); //關閉資源 ois.close(); //預設編碼 KeyFactory keyfactory = KeyFactory.getInstance("RSA"); //得到公鑰或是私鑰 if(mode == 0) { X509EncodedKeySpec x509eks= new X509EncodedKeySpec(keybyte); publicKey = (RSAPublicKey) keyfactory.generatePublic(x509eks); //System.out.println(pk.getAlgorithm()); } else { PKCS8EncodedKeySpec pkcs8eks = new PKCS8EncodedKeySpec(keybyte); privateKey = (RSAPrivateKey) keyfactory.generatePrivate(pkcs8eks); //System.out.println(pk.getAlgorithm()); } } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 資料RSA加密 * @param origin 明文 * @return 密文 */ protected byte [] encrypt(byte [] origin) { //byte [] enc = new byte [encrytLength]; byte [] enc = null; try { cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); enc = cipher.doFinal(origin); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return enc; } /** * 資料RSA解密 * @param enc 密文 * @return 明文 */ protected byte [] decrypt(byte [] enc) { //byte [] origin = new byte [originLength]; byte [] origin = null; try { cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); origin = cipher.doFinal(enc); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return origin; } /** * 加密檔案 * @param origin 明檔案 * @throws IOException */ public void encryptFile(File origin) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; //讀入 fis = new FileInputStream(origin); BufferedInputStream bis = new BufferedInputStream(fis); byte [] originbyte = new byte [originLength]; //寫出 fos = new FileOutputStream(new File(origin+".encrypt")); BufferedOutputStream bos = new BufferedOutputStream(fos); byte [] encryptbyte; //int k; while(bis.read(originbyte) > 0) { encryptbyte = this.encrypt(originbyte); bos.write(encryptbyte); originbyte = new byte[originLength]; } //壓入 bos.flush(); //關閉資源 if(fis != null) fis.close(); if(fos != null) fos.close(); } /** * 解密檔案 * @param encrypt 密檔案 * @throws IOException */ public void decryptFile(File encrypt) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; //讀入 fis = new FileInputStream(encrypt); BufferedInputStream bis = new BufferedInputStream(fis); byte [] encryptbyte = new byte [encrytLength]; //寫出 fos = new FileOutputStream(new File(encrypt+".decrypt")); BufferedOutputStream bos = new BufferedOutputStream(fos); byte [] originbyte; //int k; while(bis.read(encryptbyte) > 0) { originbyte = this.decrypt(encryptbyte); bos.write(originbyte); encryptbyte = new byte [encrytLength]; } //壓入 bos.flush(); //關閉資源 if(fis != null) fis.close(); if(fos != null) fos.close(); } /** * @param args * @throws IOException */ public static void main(String[] args) throws Exception { RSADemo rsa = new RSADemo(); rsa.initKey(); rsa.encryptFile(new File("E:/hello.txt")); rsa.decryptFile(new File("E:/hello.txt.encrypt")); rsa.savePublicKey(new File("E:/public.key")); rsa.savePrivateKey(new File("E:/private.key")); //rsa.getPublicKey(new File("E:/public.key")); //rsa.getPrivateKey(new File("E:/private.key")); //rsa.encryptFile(new File("E:/hello.txt")); //rsa.decryptFile(new File("E:/hello.txt.encrypt")); } }
相關推薦
RSA演算法加解密(JAVA)
/** * RSA加密演算法的演示驗證 * RSA是一種分組加密演算法 * 注意:金鑰對採用的長度決定了加密塊的長度,我這裡取的是2048,即256byte * 由於加密塊的長度固定為256,因此明文的長度至多為256 - 11 = 245byte * 我這裡明文
RSA演算法加解密---crypto++庫和OpenSSL庫
1. OpenSSL庫 a、 方式一: #include<string.h>#include <openssl/rsa.h>#pragma comment(lib,"libeay32.lib")#pragma comment(lib,"ssleay3
RSA演算法 JS加密 JAVA解密
有這樣一個需求,前端登入的使用者名稱密碼,密碼必需加密,但不可使用MD5,因為後臺要檢測密碼的複雜度,那麼在保證安全的前提下將密碼傳到後臺呢,答案就是使用RSA非對稱加密演算法解決 。 java程式碼 import org.apache.commons.
Java利用 AES/ECB/PKCS5Padding 演算法加解密
Java利用 AES/ECB/PKCS5Padding 演算法加解密。 package com.newland.njwpayment.utils; import javax.crypto.Cipher; import javax.crypto.spec.
Escape加解密Java版
java[java] view plain copy /** * 中文加密 * Created by geo on 2017/7/4. */ public class EscapeUtils { /** * Escape編碼 * @p
[Python3] RSA的加解密和簽名/驗籤實現 -- 使用Crypto
前言 關於非對稱加密演算法我就不過多介紹了,本文著重於python3對RSA演算法的實現。 正文 from Crypto.PublicKey import RSA import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 #用於簽名/
RSA的加解密原理
歡迎轉載,但請指明出處:https://www.cnblogs.com/zhizaixingzou/p/10241100.html RSA演算法是三位數學家Rivest、Shamir和Adleman於1977年設計出來的,關於RSA演算法的原理有文章已講得很清晰,請見: http://ww
SM2的非對稱加解密java工具類
由於工作原因需要對原有加密方式RSA已不適用,要支援國密SM2 maven依賴 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov
Openssl aes對稱加密演算法 加解密例程 1
前面我們用openssl的aes256對稱加密演算法對16個位元組的記憶體塊進行了的加解密運算測試,現在更進一步,對指定大小的記憶體塊進行加解密運算。 首先明確一下aes是分組加密演算法,且每次加密的記憶體塊是16個位元組,所以,我們需要加密的記憶體塊必須是16個位元組的整數倍,若不是,則需要進行補齊。
SM2非對稱演算法加解密
在前面文章我們已經可以製作SM2證書了,主要應用了SM2簽名驗證演算法和SM3摘要演算法,在本文中主要介紹SM2公鑰加密演算法。這裡我們使用SM2數字證書來做SM2非對稱加密,然後使用硬體加密裝置做解密,比如加密檔案只能由指定的智慧密碼鑰匙UKey才能解開。 SM2加
VC 使用Cryptography 微軟自帶演算法加解密檔案
// Encrypting_a_File.cpp : Defines the entry point for the console // application. // #include <tchar.h> #include <stdio.h>
【JAVA】常用加解密演算法總結及JAVA實現【BASE64,MD5,SHA,DES,3DES,AES,RSA】
BASE64 這其實是一種編解碼方法,但是隻要我們能夠將原文變成肉眼不可識別的內容,其實就是一種加密的方法。 BASE64 的編碼都是按字串長度,以每 3 個 8 bit 的字元為一組,然後針對每組,首先獲取每個字元的 ASCII 編碼,然後將 ASCII 編碼轉換成 8
[JAVA加解密]RSA演算法、ElGamal演算法
一、RSA演算法: 1、簡介:RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一
java rsa加解密算法的實現
binary 0x03 object sat ear exc triple turn create RSAUtils:RSA加解密的實現 package com.rsa.test; import java.io.ByteArrayOutputStream; import
與非java語言使用RSA加解密遇到的問題:algid parse error, not a sequence
write ltr 結果 cep exp result 命令 pat ror 遇到的問題 在一個與Ruby語言對接的項目中,決定使用RSA算法來作為數據傳輸的加密與簽名算法。但是,在使用Ruby生成後給我的私鑰時,卻發生了異常:IOException: algid pars
java rsa加解密
簡單實用java實現rsa加解密,java內部使用pkcs8格式私鑰,openssl預設為pkcs1私鑰,注意格式 maven專案 //pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="
使用python實現RSA加解密演算法(包含讀取檔案操作),檔案內容為16進位制字串,同時實現對學號姓名的加密——(SCU應用密碼學實驗)
#-*- coding:UTF-8 -*- ''' time: 2018-5-30 content:RSA python 3.6 mac os ''' from random import randint import random im
RSA演算法原理——(3)RSA加解密過程及公式論證
個人分類: 演算法 上期(RSA簡介及基礎數論知識)為大家介紹了:互質、尤拉函式、尤拉定理、模反元素 這四個數論的知識點,而這四個知識點是理解RSA加密演算法的基石,忘了的同學可以快速的回顧一遍。 三、RSA加解密過程及公式論證 今天的內容主要分為三
JAVA密碼加密演算法.RSA演算法(非對稱加密演算法)和密碼加鹽MD5
密碼加鹽MD5 Message Digest Algorithm MD5(中文名為訊息摘要演算法第五版)為電腦保安領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。 是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有MD5實現。將資料(如漢字)運
記一個加密演算法 java 3DES (DESede/ECB/PKCS5Padding) 加解密
對接一個介面,需要用到DESede/ECB/PKCS5Padding 進行加密, 剛開始以為很牛逼... 上程式碼 private static Cipher DES_CIPHER; s