1. 程式人生 > >rsa加解密 用java淺談有demo

rsa加解密 用java淺談有demo

快要閒的被開除了 所以我決定做些其他事加速我程式生涯的結束
翻到rsa演算法 發現物理是神的學科 數學是成神之前的學科
為尋其原理(為自己寫個簡單demo)搜了一下
有這個網址這個網址說的比較好(對於我這種一點都沒了解過的)
=========
rsa的內涵在於公私鑰的加解密
http中是明文傳輸,https中ssl就有用到類似的公私鑰外加證書認證做到保密。
==========
rea加解密過程
注:≡是同餘數的意思 比如 1≡3 mod 2 成立,1和3% 2都是1下面有de≡1 mod f(n)
(1)選擇一對不同的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e,且1<e<f(n)。
(5)計算d,使得de≡1 mod f(n)。這個公式也可以表達為d ≡e-1 mod f(n)
這裡要解釋一下,≡是數論中表示同餘的符號。公式中,≡符號的左邊必須和符號右邊同餘,也就是兩邊模運算結果相同。顯而易見,不管f(n)取什麼值,符號右邊1 mod f(n)的結果都等於1;符號的左邊d與e的乘積做模運算後的結果也必須等於1。這就需要計算出d的值,讓這個同餘等式能夠成立。
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,然後再進行交換。設密文為C,則加密過程為:

(8)解密過程為:。 
(1)選擇一對不同的、足夠大的素數p,q。
int p = 997 ,q = 1009 ;
 這個剛好是1000000多點 驗證碼或銀行密碼的6位數能放進去。。。
(2)計算n=pq。
int n = p*q;//p*q
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
int fn = (p-1)*(q-1); //(p-1)*(q-1);
(4)找一個與f(n)互質的數e,且1<e<f(n)。
int e =  Util.getCoprimeList(fn);//93733 ;//Util.getCoprimeList(fn);
 原諒我搞android的習慣性工具函式類放一個Util.java裡

 //返回一個小點的互質數
    public static int getCoprimeList(int num){
        int coprime = 3;
        for( ;coprime <= num ;coprime++){
            if(check2(num,coprime))
                return coprime;
        }
        return 1;
    }
    //判斷是否互質
    public boolean check(int m, int n)
    {
        return check2(m > n ? m : n, m <= n ? m : n);
    }
    public static boolean check2(int max, int min)
    {
        int mo = max % min;
        Log.e("ssh",max + "  "+ min);
        if (mo == 0) {
            return min == 1 ? true : false;
        }
        else {
            return check2(min, mo);
        }
    }
 本來設定互質數從隨機中間數開始找 結果運算就爆炸了 管他的小點就小點(5)計算d,使得de≡1 mod f(n)。這個公式也可以表達為d ≡e-1 mod f(n)

本來看到這個一下懵逼了,搜了同餘是什麼 同餘怎麼求解 上面給的第二個連結教我瞭解決方法  成神前的數學
 網頁中給的demo裡f(n)=(p-1)(q-1)= 18442 × 49890= 920071380  e = 19,求d 
d滿足:e * d ≡ 1 (mod f(n)) 
即(19 * d) mod 920071380 = 1 
歐幾里德演算法(輾轉相除法)求d

迴圈,直至d 的係數為 1, 即e位置=1時結束

[a式]19×d - 920071380×k =1      (k 為正整數)
[b式]19×d - 9×k =1f(n)位置 mod e位置 的餘數9代替f(n)位置
[c式]1×d - 9×k=1e位置 mod f(n)位置 的餘數1代替e位置
e位置=1,結束,然後 
令k=0,帶入[c式],得d=1; 
d=1,帶入[b式],得k=2; 
k=2,帶入[a式],得d=96849619 
到這裡求出d值了
於是就有了我自己的破演算法
int d = Util.getD(e,fn);
//求d
    public static int getD(int e , int fn){
        int k = 1, d = 1;
        ArrayList<Integer> eList = new ArrayList();
        ArrayList<Integer> fnList = new ArrayList();
        eList.add(e);
        fnList.add(fn);
        boolean trueOrFalse = true;
        while (e != 1 && fn != 1){
            if(trueOrFalse){
                fn = fn % e;
                trueOrFalse = false;
            }
            else{
                e = e % fn;
                trueOrFalse = true;
            }
            eList.add(e);
            fnList.add(fn);
        }

        for (int i = eList.size()-1 ; i >= 0 ; i--){
            if(i%2 == 0){
                d = (fnList.get(i)*k+1)/eList.get(i);
            }
            else{
                k = (eList.get(i)*d-1)/fnList.get(i);
            }
        }
        return d;
    }
(6)公鑰KU=(e,n),私鑰KR=(d,n)。

 然後就能得到我們自己的 我demo得到的 e=5 n=1005973 d=602381
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,然後再進行交換。設密文為C,則加密過程為:

話說這步真的很麻煩被加密的m必須小於n   太長就要分割 (要傳漢字基本可以一個字一個字加密了)  而且e次方絕對會超過java 的int,long上限 原先我互質數e設為從中間隨機去查詢幾萬都出來了 妥妥的超過double。就按時間複雜度最差的寫了遞迴函式(因為我省事不用想啊)

int mima = 333333;
int c = (int) Util.getC(mima,e,n);
// 加密過程為:C≡M^e(mod n)。
    public static double getC(double M, int e ,int n){
        //10 3 33
        int i = 1;
        double mod = M;
        while ( i< e ){
            mod = (mod*M)%n;
            i++;
        }
        return mod;

    }
(8)解密過程為:。 
int M = (int) Util.getC(c,d,n);//(int) (Math.pow(c,d)%n);
 我的控制檯列印結果 (沒人發現我用的androidstudio吧)

需要不同公鑰私鑰只要改變互質數e 或素數p,q(這個改了e也改了)

有大佬有更好的演算法見解歡迎留言

相關推薦

rsa解密 javademo

快要閒的被開除了 所以我決定做些其他事加速我程式生涯的結束翻到rsa演算法 發現物理是神的學科 數學是成神之前的學科為尋其原理(為自己寫個簡單demo)搜了一下有這個網址和這個網址說的比較好(對於我這種

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="

RSA解密 私鑰加密公鑰解密公解 && C++ 調openssl庫 的代碼實例

密鑰 code www. res result 方法 urn .cn read 前提:秘鑰長度=1024 ==============================================     對一片(117字節)明文加密 私加 ==============

javaRSA解密的實現

原文:https://blog.csdn.net/draven1122/article/details/55212195關於加密資料長度和解密資料長度大家可以看一下我前一篇文章內的介紹:publicstaticvoid main(String[] args) throws E

Java數組(一)

spa bound pan .... exceptio 運行 輸出 結構 語法 數組: 編程語言中最常見的一種數據結構,數組就是內存中一段連續的存儲空間。可以用於存儲多個數據,每個數組元素存放一個數據,通常可通過數組元素的索引來訪問數組元素。 1.java數組:   具有相

Java數組之內存分析(二)

說明 變量賦值 com logs .info clas code new blog 引用類型的數組的初始化 1數組元素是引用時的內存分析 package com.java.array; class Person{ public int age;//年齡

Java數組之內存分析(一)

靜態 引用變量 ati static ges 組元 strong 淺談 nbsp 數組的內存 1.內存中的數組 數組是一種引用內存,數組引用變量只是一個引用,數組元素和數組變量在內存裏是分開存放的。 實際的數組對象被存放在堆內存(heap)中,數組的引用變量被存儲在棧內存中

python3 rsa 解密 支持長字符串

keys max none common clas pan length 加密 new # rsa 加密 def rsa_encrypt_bytes(bytes_str, n, e): if not isinstance(bytes_str, bytes):

Vue項目中的RSA解密

用戶輸入 dft eba NPU str 文件 動態生成 console ted 前後端使用rsa加密: 一般是客戶端初始化時訪問登錄服務時,服務端面動態生成一對RSA對,公鑰傳給客戶端,客戶端拿到後,用戶輸入密碼後,點登錄時用公鑰加密返回給服務端,服務端用私鑰解就行了

java get與post的區別

1.、get 是從伺服器上獲取資料,post 是向伺服器傳送資料。 get 請求返回 request - URI 所指出的任意資訊。 Post 請求用來發送電子郵件、新聞或傳送能由互動使用者填寫的表格。這是唯一需要在請求中傳送body的請求。使用Post請求時需要在報文首部 Content -

使用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

PHP RSA解密示例

1.生成金鑰和公鑰  開始前需要準備openssl環境  linux 需要安裝openssl工具包,傳送門http://www.openssl.org/source/  window 下需要安裝openssl的程式,傳送門http://slproweb.com/prod

RSA解密工具類

參考: https://github.com/sjyuan-cc/cc.sjyuan.commons/blob/master/src/main/java/cc/sjyuan/commons/util/encryptor/RSAUtils.java package com.tinfinite.co

關於rsa解密的內容超長的問題

轉自:https://blog.csdn.net/taoxin52/article/details/53782470 一. 現象:      有一段老程式碼用來加密的,但是在使用key A的時候,丟擲了異常:javax.crypto.Illega

PHP RSA解密工具

/** * RSA加解密工具 * User: 樂楊俊 * Date: 2016/9/17 * Time: 下午4:06 */ namespace leyangjun\Lib; class CryptRsa { /** * 私鑰加密 */

RSA演算法原理——(3)RSA解密過程及公式論證

個人分類: 演算法 上期(RSA簡介及基礎數論知識)為大家介紹了:互質、尤拉函式、尤拉定理、模反元素 這四個數論的知識點,而這四個知識點是理解RSA加密演算法的基石,忘了的同學可以快速的回顧一遍。 三、RSA加解密過程及公式論證 今天的內容主要分為三

Java遞迴的理解

      遞迴方法其實就是一個直接或者間接呼叫自己的方法,是一個簡單、實用的方法,在遇到某些不好解決的問題時,可以用遞迴方法來解決,比如:求一段連續自然數之間的和、階乘等等。下面我簡單講講遞迴方法到底是怎麼個情況。       先來一段程式碼: public clas

RSA解密——前端js加密,後臺解密

一、前端js     1、前端js           先引入 jsencrypt.js <script src="${pageContext.request.contextPath}/static/scripts/jquery/dist/jsencrypt.