1. 程式人生 > >非對稱加密演算法RSA 學習

非對稱加密演算法RSA 學習

非對稱加密演算法RSA 學習

RSA加密演算法是一種非對稱加密演算法。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。

1973年,在英國政府通訊總部工作的數學家克利福德·柯克斯(Clifford Cocks)在一個內部檔案中提出了一個相同的演算法,但他的發現被列入機密,一直到1997年才被髮表。

對極大整數做因數分解的難度決定了RSA演算法的可靠性。 換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA加密的資訊的可靠性就肯定會極度下降。 但找到這樣的演算法的可能性是非常小的。今天只有短的RSA鑰匙才可能被強力方式解破。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被解破的。

一、舉一個通俗易懂的例子

看一個數學小魔術:

讓A寫下一個任意3位數,並將這個數和91相乘;然後將積的最後三位數告訴B,這樣B就可以計算出A寫下的是什麼數字了。

  • 比如A寫下的是123,並且A計算出123 * 91等於11193,並把結果的末三位193告訴B ;
  • B只需要把193再乘以11,193 * 11 = 2123 末三位就是A寫下的數字了;

道理很簡單,91乘以11等於1001,而任何一個三位數乘以1001後,末三位顯然都不變(例如123乘以1001就等於123123)。

知道原理後,可以構造一個定義域和值域更大的加密解密系統。
例如:

  • 任意一個數乘以400000001後,末8位都不變,而400000001 = 19801 * 20201。於是A來乘以19801,B來乘以20201,又一個加密解密不對稱的系統就構造好了;
  • 甚至可以構造得更大一些 4000000000000000000000000000001 = 1199481995446957 * 3334772856269093,這樣我們就成功構造了一個30位的加密系統;

如果僅僅按照上面的思路,如果對方知道原理,非常容易窮舉出400000001這個目標值;RSA演算法使用的是指數和取模運算,本質上就是上面這套思想。

此段落轉載自:
如何用通俗易懂的話來解釋非對稱加密?

二、一句話:

對極大整數做因數分解的難度決定了RSA演算法的可靠性。

三、RSA加密演算法

3.1、維基百科——RSA加密演算法

先看一下維基百科的演算法描述:

公鑰與私鑰的產生

  • 1、隨意選擇兩個大的質數 p和 q,p不等於 q,計算 N=pq
  • 2、根據尤拉函式,求得 r
r = φ(N) = φ(p)φ(q) = (p-1)(q-1)
  • 3、選擇一個小於r並與r互質的整數e,求得e關於r的模反元素,命名為d ( ed ≡ 1(mod r) 模反元素存在,當且僅當e與r互質 );
  • 4、銷燬p和q,此時 (N , e)是公鑰,(N, d)為私鑰;

加密訊息

假設Bob想給Alice傳送一個訊息 n,他知道Alice產生的 Ne ;用下面這個公式他可以將 n加密為 c

c ≡ n^e (mod N)

計算 c並不複雜。Bob算出 c後就可以將它傳遞給Alice。

解密訊息

Alice得到Bob的訊息 c後就可以利用她的金鑰d來解碼。可以用以下這個公式來將 c轉換為 n

n ≡ c^d (mod N)

此段落轉載自:
維基百科——RSA加密演算法

3.2、依照演算法公式舉個例子

依照演算法公式來舉個例子

1、隨意選擇兩個大的質數 p和 q,p不等於 q,計算 N=pq

質數 定義:

除了1和該數自身外,無法被其他自然數整除的數。

舉例:

p = 3;
q = 5;
N = 3*5 = 15;

2、根據尤拉函式,求得 r

r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。

尤拉函式 定義:

尤拉函式 φ(n)是小於或等於n的正整數中與n互質的數的數目。

例如:φ(8) = 4,因為1,3,5,7均和8互質。

舉例:

r = φ(N) = φ(p)φ(q) = (p-1)(q-1) ;

r = φ(15) = φ(3)φ(5) = (3-1)(5-1) ;
r = 8

3、選擇一個小於r並與r互質的整數e,求得e關於r的模反元素,命名為d ( ed ≡ 1(mod r) 模反元素存在,當且僅當e與r互質 );

互質 定義:

如果兩個或兩個以上的整數的最大公約數是 1,則稱它們為互質

例如:1,3,5,7均和8互質

模反元素 定義:

如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。

例如:比如3和5互質,3關於5的模反元素就可能是2,因為 (3*2)%5=1 。

舉例:

// 選擇一個小於r並與r互質的整數e (1,3,5,7均和8互質):
e = 7;
// 求得e關於r的模反元素,命名為d (    ed ≡ 1(mod r)     ) 

ed ≡ 1(mod r) ;

7*d ≡ 1(mod 8) ;
7*d%8 = 1; 
// 這裡取d = 15
d = 15;

4、銷燬p和q,此時 (N , e)是公鑰,(N, d)為私鑰

// 公鑰  (N , e)
( 15,7 )
// 私鑰 (N, d)
( 15,15 )

5、加密

假設Bob想給Alice傳送一個訊息 n,他知道Alice產生的 Ne ;用下面這個公式他可以將 n加密為 c

舉例:

// 假設 
n = 2;
// 計算c
c ≡ n^e (mod N) ;

(c^-1 * n^e)%N = 1 ; 
(c^-1 * 2^7)%15 = 1 ;
// 
c = 8;

6、解密

Alice得到Bob的訊息 c後就可以利用她的金鑰d來解碼。可以用以下這個公式來將 c轉換為 n

舉例:

// 計算n
n ≡ c^d (mod N)

n ≡ 8^15 (mod 15) ;
(n^-1 * 8^15)%15 = 1 ;
//
n = 2;

參考

如何用通俗易懂的話來解釋非對稱加密?
維基百科——RSA加密演算法
RSA演算法詳解

========== THE END ==========

相關推薦

對稱加密演算法RSA 學習

非對稱加密演算法RSA 學習 RSA加密演算法是一種非對稱加密演算法。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。

對稱加密演算法RSA工具

非對稱加密演算法RSA工具 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.InvalidKeyException; import java.security.K

對稱加密演算法RSA公鑰私鑰的模數和指數提取方法

生成非對稱加密演算法RSA公鑰、私鑰的方法: 1. 通過OpenSSL庫生成,可參考  https://github.com/fengbingchun/OpenSSL_Test/blob/master/demo/OpenSSL_Test/funset.cpp  中的Gen

Java對稱加密演算法RSA

流程分析:  甲方構建金鑰對兒,將公鑰公佈給乙方,將私鑰保留。 甲方使用私鑰加密資料,然後用私鑰對加密後的資料簽名,傳送給乙方簽名以及加密後的資料;乙方使用公鑰、簽名來驗證待解密資料是否有效,如果有效使用公鑰對資料解密。 乙方使用公鑰加密資料,向甲方傳送經過加密後的資料

資料傳輸加密——對稱加密演算法RSA+對稱演算法AES(適用於java,android和Web)

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 資料傳輸加密   在開發應用過程中,客戶端與服務端經常需要進行資料傳輸,涉及到重要隱私資訊時,開發者自然會想到對其進行加密,即使傳輸過程中被“有心人”擷取,也不會將資訊洩露。對於加密

【IoT】加密與安全:對稱加密演算法 RSA 1024 公鑰、祕鑰、明文和密文長度

RSA 1024 是指公鑰及私鑰分別是 1024bit,也就是 1024/8 = 128Bytes。 RSA 演算法金鑰長度的選擇是安全性和程式效能平衡的結果,金鑰長度越長,安全性越好,加密解密所需時間越長。 1、非對稱加密演算法中 1024bit 金鑰的強度相當於對稱加

對稱加密演算法-RSA演算法

  加密演算法分為對稱加密演算法和非對稱加密演算法,其中非對稱加密演算法作為計算機通訊安全的基石,在保證資料安全方面起著重要的作用。而相對於對稱加密演算法的易理解性,非對稱加密演算法存在一定的難度。下面通過對RSA演算法的剖析,讓我們更好的理解非對稱加密演算法的原理。 一、對稱加密演算法和非對稱加密演算法 1

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

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

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

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

對稱加密RSA演算法

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

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

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

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

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

php RSA對稱加密演算法

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

JAVA實現RSA加密,對稱加密演算法

RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair;

python ----RSA對稱加密演算法使用

最近在搞專案的介面持續性自動化測試,好久沒有更新部落格了。 專案中接觸到很多加密相關的資料,很多專案都會用到非對稱加密演算法來保證前端和伺服器互動的資料安全。 下面介紹下python下怎麼使用RSA加密演算法: import rsa (publickey,priva

Java 加密解密 對稱加密演算法 對稱加密演算法 MD5 BASE64 AES RSA

【前言】 本文簡單的介紹了加密技術相關概念,最後總結了java中現有的加密技術以及使用方法和例子 【最簡單的加密】1.簡單的概念 明文:加密前的資訊 密文:機密後的資訊 演算法:加密或解密的演算法 金鑰:演算法使用的鑰匙(讀作miyao,正確應該是miyue,但是大家都讀m

[加密]--PHP 使用對稱加密演算法RSA

解釋 非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。 公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密; 如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。 因為加密和

對稱加密演算法(2):RSA

一.RSA:RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美國公佈,當時他們三人都在麻省理工學院工作實習。RSA就是他們

c語言實現rsa nopadding對稱加密演算法(openssl api方式),匹配java後端 bouncycastle

公私鑰: —–BEGIN PUBLIC KEY—– MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC32V2IAfotG8bZhPF8/Bx8y65g EDycAMyTWmvpPCfagEKORO/WvdkTYim7yhG/+

RSA ~ 對稱加密演算法

RSA:      非對稱加密,加密與解密使用的金鑰不是同一金鑰,對中一個對外公開,稱為公鑰,另一個只有所有者知道,稱為私鑰。      用公鑰加密的資訊只有私鑰才能解開,反之,用私鑰加密的資訊只有公鑰才能解開(簽名驗籤)。      代表:RSA演算法。速度慢,