RSA | 您所在的位置:網(wǎng)站首頁 › 69年屬雞壽命有多少歲了 › RSA |
Wiki - RSA加密演算法 Wiki - 歐拉函數(shù) Wiki - 模反元素 ASN.1 格式標(biāo)準(zhǔn) RSA算法原理(二) 注意: RSA 加密或簽名后的結(jié)果是不可讀的二進(jìn)制,使用時經(jīng)常會轉(zhuǎn)為 BASE64 碼再傳輸。RSA 加密時,對要加密數(shù)據(jù)的大小有限制,最大不大于密鑰長度。例如在使用 1024 bit 的密鑰時(genrsa -out rsa_private_key.pem 1024),最大可以加密 1024/8=128 Bytes 的數(shù)據(jù)。數(shù)據(jù)大于 128 Bytes 時,需要對數(shù)據(jù)進(jìn)行分組加密(如果數(shù)據(jù)超限,加解密時會失敗,openssl 函數(shù)會返回 false),分組加密后的加密串拼接成一個字符串后發(fā)送給客戶端。為了保證每次加密的結(jié)果都不同,RSA 加密時會在待加密數(shù)據(jù)后拼接一個隨機字符串,再進(jìn)行加密。不同的填充方式 Padding 表示這個字符串的不同長度,在對超限數(shù)據(jù)進(jìn)行分組后,會按照這個 Padding 指定的長度填入隨機字符串。例如如果 Padding 填充方式使用默認(rèn)的 OPENSSL_PKCS1_PADDING(需要占用 11 個字節(jié)用于填充),那么明文長度最多只能就是 128-11=117 Bytes。一般默認(rèn)使用 OPENSSL_PKCS1_PADDING。PHP 支持的 Padding 有 OPENSSL_PKCS1_PADDING、OPENSSL_SSLV23_PADDING、OPENSSL_PKCS1_OAEP_PADDING 和 OPENSSL_NO_PADDING。接收方解密時也需要分組。將加密后的原始二進(jìn)制數(shù)據(jù)(對于經(jīng)過 BASE64 的數(shù)據(jù),需要解碼),每 128 Bytes 分為一組,然后再進(jìn)行解密。解密后,根據(jù) Padding 的長度丟棄隨機字符串,把得到的原字符串拼接起來,就得到原始報文。 原理RSA 算法的可靠性基礎(chǔ):對極大整數(shù)做因數(shù)分解是很困難的。 RSA 是非對稱算法,加解密使用不同的密鑰。 兩個密鑰都可以用于加密,解密時需要使用另一個密鑰。但是,通常用公鑰加密私鑰解密,因為公鑰是近乎完全公開的,對于私鑰加密的數(shù)據(jù),有太多的人可以解密了。理論上 A 和 B 之間要通過 RSA 實現(xiàn)保密通信,需要 A 和 B 各自生成一組密鑰,同時保管好自己的私鑰;用對方的公鑰加密要發(fā)送的消息,用自己的私鑰解密對方發(fā)送過來的消息。 在簽名的場景下,用私鑰簽名,公鑰驗簽。 RSA 比 DES 等對稱算法慢得多。一般在實際數(shù)據(jù)傳輸時,用 RSA 來加密比較短的對稱密碼,雙方交換密碼后再使用 DES 等對稱算法傳輸數(shù)據(jù)。 互質(zhì)關(guān)系如果兩個正整數(shù),除了 1 以外沒有其他公因子,就稱這兩個數(shù)是互質(zhì)關(guān)系。比如 3 和 5,13 和 31 等。 歐拉函數(shù)Wiki - 歐拉函數(shù) 歐拉函數(shù):求小于 N {\displaystyle N} N 的正整數(shù)中與 N {\displaystyle N} N 互質(zhì)的數(shù)的數(shù)目。 例如,對應(yīng) 8,與 8 互質(zhì)的數(shù)有 1,3,5,7,所以 φ ( N ) {\displaystyle \varphi (N)} φ(N) = 4。 RSA 算法使用了歐拉函數(shù)的一個特例:如果 N {\displaystyle N} N 可以分解成兩個互質(zhì)的整數(shù)之積: N = p q {\displaystyle N=pq} N=pq 則 φ ( N ) = φ ( p ) φ ( q ) = ( p ? 1 ) ( q ? 1 ) {\displaystyle \varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)} φ(N)=φ(p)φ(q)=(p?1)(q?1) 比如, φ ( 35947 ) = φ ( 103 ) φ ( 349 ) = ( 102 ) ( 348 ) = 35496 {\displaystyle \varphi (35947)=\varphi (103)\varphi (349)=(102)(348)=35496} φ(35947)=φ(103)φ(349)=(102)(348)=35496。 模反元素Wiki - 模反元素 如果兩個正整數(shù) a a a 和 n n n 互質(zhì),那么一定可以找到整數(shù) b b b,使得 a b ? 1 ab-1 ab?1 被 n n n 整除: a b ≡ 1 ( m o d n ) ab\equiv 1{\pmod {n}} ab≡1(modn) 這時, b b b 就叫做 a a a 的"模反元素"。 歐拉定理證明當(dāng) a , n {\displaystyle a,n} a,n 為兩個互素的正整數(shù)時,則有 a φ ( n ) ≡ 1 ( m o d n ) {\displaystyle a^{\varphi (n)}\equiv 1{\pmod {n}}} aφ(n)≡1(modn),其中 φ ( n ) {\displaystyle \varphi (n)} φ(n) 為歐拉函數(shù)(小于等于 n {\displaystyle n} n 且與 n {\displaystyle n} n 互素的正整數(shù)個數(shù))。 上述結(jié)果可分解為 a φ ( n ) = a ? a φ ( n ) ? 1 ≡ 1 ( m o d n ) {\displaystyle a^{\varphi (n)}=a\cdot a^{\varphi (n)-1}\equiv 1{\pmod {n}}} aφ(n)=a?aφ(n)?1≡1(modn),其中 a φ ( n ) ? 1 {\displaystyle a^{\varphi (n)-1}} aφ(n)?1 即為 a {\displaystyle a} a 關(guān)于模 n {\displaystyle n} n 之模反元素。 舉例求整數(shù) 3 對同余 11 的模逆元素 x, x ≡ 3 ? 1 ( m o d 11 ) {\displaystyle x\equiv 3^{-1}{\pmod {11}}} x≡3?1(mod11) 上述方程可變換為 3 x ≡ 1 ( m o d 11 ) {\displaystyle 3x\equiv 1{\pmod {11}}} 3x≡1(mod11) 在整數(shù)范圍 Z 11 {\displaystyle \mathbb {Z} _{11}} Z11? 內(nèi),可以找到滿足該同余等式的 x x x 值為4,如下式所示 3 ( 4 ) = 12 ≡ 1 ( m o d 11 ) {\displaystyle 3(4)=12\equiv 1{\pmod {11}}} 3(4)=12≡1(mod11) 并且,在整數(shù)范圍 Z 11 {\displaystyle \mathbb {Z} _{11}} Z11? 內(nèi)不存在其他滿足此同余等式的值。 故,整數(shù)3對同余11的模逆元素為4。 生成公鑰和私鑰 隨意選擇兩個大的質(zhì)數(shù) p {\displaystyle p} p 和 q {\displaystyle q} q, p {\displaystyle p} p 不等于 q {\displaystyle q} q,計算 N = p q {\displaystyle N=pq} N=pq。根據(jù)歐拉函數(shù),求得 r = φ ( N ) = φ ( p ) φ ( q ) = ( p ? 1 ) ( q ? 1 ) {\displaystyle r=\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)} r=φ(N)=φ(p)φ(q)=(p?1)(q?1)選擇一個小于 r {\displaystyle r} r 的整數(shù) e {\displaystyle e} e,使 e {\displaystyle e} e 與 r {\displaystyle r} r 互質(zhì)。并求得 e {\displaystyle e} e 關(guān)于 r {\displaystyle r} r 的模反元素,命名為 d {\displaystyle d} d(求 d {\displaystyle d} d 令 e d ≡ 1 ( m o d r ) e d ≡ 1 ( m o d r ) {\displaystyle ed\equiv 1{\pmod {r}}} {\displaystyle ed\equiv 1{\pmod {r}}} ed≡1(modr)ed≡1(modr))。(模反元素存在,當(dāng)且僅當(dāng) e {\displaystyle e} e 與 r {\displaystyle r} r 互質(zhì))將 p {\displaystyle p} p 和 q {\displaystyle q} q 的記錄銷毀。( N , e ) {\displaystyle (N,e)} (N,e) 是公鑰, ( N , d ) {\displaystyle (N,d)} (N,d) 是私鑰。公鑰發(fā)送給所有的通信對象(對服務(wù)器來說就是所有的客戶端),私鑰則必須保管好,防止泄露。 加密消息假設(shè)客戶端要向服務(wù)器發(fā)送消息 m {\displaystyle m} m,服務(wù)器的公鑰是 N {\displaystyle N} N 和 e {\displaystyle e} e。客戶端將消息 m {\displaystyle m} m 轉(zhuǎn)換為一個小于 N {\displaystyle N} N 的非負(fù)整數(shù) n {\displaystyle n} n,比如可以將每一個字轉(zhuǎn)換為這個字的 Unicode 碼,然后將這些數(shù)字連在一起組成一個數(shù)字。假如信息非常長的話,可以將這個信息分為幾段,然后將每一段轉(zhuǎn)換為 n {\displaystyle n} n。用下面這個公式他可以將 n {\displaystyle n} n 加密為 c {\displaystyle c} c: c ≡ n e ( m o d N ) {\displaystyle c\equiv n^{e}{\pmod {N}}} c≡ne(modN) 計算 c {\displaystyle c} c 并不復(fù)雜。客戶端算出 c {\displaystyle c} c 后就可以將它傳遞給服務(wù)器。 解密消息得到消息 c {\displaystyle c} c 后,可以利用密鑰 d {\displaystyle d} d 來解碼。可以用以下這個公式來將 c {\displaystyle c} c 轉(zhuǎn)換為 n {\displaystyle n} n: c d ≡ n ? ( m o d ? N ) {\displaystyle c^ik22qq2\equiv n\ (\mathrm {mod} \ N)} cd≡n?(mod?N) 得到 n {\displaystyle n} n 后,可以將原來的信息 m {\displaystyle m} m 重新復(fù)原。 解碼的原理是: c d ≡ n e ? d ? ( m o d ? N ) {\displaystyle c^ik22qq2\equiv n^{e\cdot d}\ (\mathrm {mod} \ N)} cd≡ne?d?(mod?N) 已知 e d ≡ 1 ( m o d r ) {\displaystyle ed\equiv 1{\pmod {r}}} ed≡1(modr),即 e d = 1 + h φ ( N ) {\displaystyle ed=1+h\varphi (N)} ed=1+hφ(N)。由歐拉定理得: n e d = n 1 + h φ ( N ) = n ( n φ ( N ) ) h ≡ n ( 1 ) h ( m o d N ) ≡ n ( m o d N ) {\displaystyle n^{ed}=n^{1+h\varphi (N)}=n\left(n^{\varphi (N)}\right)^{h}\equiv n(1)^{h}{\pmod {N}}\equiv n{\pmod {N}}} ned=n1+hφ(N)=n(nφ(N))h≡n(1)h(modN)≡n(modN) 簽名消息RSA 也可以用來為一個消息簽名。 對消息字符串的散列值(Message digest,用 MD5、SHA256 等算法求得的長度較短且固定的字符串)使用 RSA 的私鑰計算簽名(實際上仍然是加密消息)后,得到一個簽名字符串,將其附加在消息字符串的合適位置后,一并發(fā)送。接收方使用對應(yīng)的公鑰可以從簽名字符串中解密出原來的散列值,同時對原始消息再計算一次散列值。二者相比較,假如兩者相符的話,則認(rèn)為發(fā)信人持有正確的私鑰,并且這個消息在傳播路徑上沒有被篡改過。 密鑰長度用戶應(yīng)使用 1024 位密鑰,證書認(rèn)證機構(gòu)應(yīng)用 2048 位或以上。 特點RSA 之所以叫非對稱算法,是因為加密和解密的密鑰不一樣。任何一個密鑰都可以用來加密。 公鑰和私鑰通過私鑰可以輕松計算出公鑰,反之不行。 隨機選擇兩個不相等的質(zhì)數(shù) p {\displaystyle p} p 和 q {\displaystyle q} q, p {\displaystyle p} p 不等于 q {\displaystyle q} q,計算 N = p q {\displaystyle N=pq} N=pq。 這里選擇 103 和 349。 N = p q {\displaystyle N=pq} N=pq = 35947。 N {\displaystyle N} N 的長度就是密鑰長度。35947 對應(yīng)的二進(jìn)制是 ?1000110001101011?,一共有 16 位,所以這個密鑰就是 16 位。實際應(yīng)用中 RSA 密鑰一般是1024位。計算 N {\displaystyle N} N 的歐拉函數(shù) φ ( N ) {\displaystyle \varphi (N)} φ(N)。 r = φ ( 35947 ) = φ ( 103 ) φ ( 349 ) = ( 102 ) ( 348 ) = 35496 {\displaystyle r=\varphi (35947)=\varphi (103)\varphi (349)=(102)(348)=35496} r=φ(35947)=φ(103)φ(349)=(102)(348)=35496。選擇一個小于 r {\displaystyle r} r 的整數(shù) e {\displaystyle e} e,使 e {\displaystyle e} e 與 r {\displaystyle r} r 互質(zhì),這里取 e = 773 {\displaystyle e=773} e=773。求 e {\displaystyle e} e 關(guān)于 r {\displaystyle r} r 的模反元素,命名為 d {\displaystyle d} d(求 d {\displaystyle d} d 令 e d ≡ 1 ( m o d r ) e d ≡ 1 ( m o d r ) {\displaystyle ed\equiv 1{\pmod {r}}} {\displaystyle ed\equiv 1{\pmod {r}}} ed≡1(modr)ed≡1(modr))。最終轉(zhuǎn)為 773d-1=35496k 這個二元一次方程,求得一組解(d,k)=(45,1)。將 ( N , e ) {\displaystyle (N,e)} (N,e) 封裝成公鑰, ( N , d ) {\displaystyle (N,d)} (N,d) 封裝成私鑰。所以公鑰就是 (35496 ,773),私鑰就是(35496 , 45)。 加密和解密用公鑰加密時,私鑰可以解密。反之亦然,私鑰加密后的信息用公鑰可以解密。 簽名和驗簽 作如果是對接其他平臺提供的標(biāo)準(zhǔn)接口,如果這個接口用到了 RSA 加密,則需要這個平臺提供對應(yīng)的公鑰。 Linux 下通過 OpenSSL 生成 RSA 公鑰和私鑰需要提前在 Linux 上安裝 OpenSSL,默認(rèn)生成在當(dāng)前用戶家目錄下: [root@VM_120_242_centos ~]# openssl OpenSSL> genrsa -out app_private_key.pem 1024 # 生成私鑰 Generating RSA private key, 1024 bit long modulus .++++++ ........++++++ e is 65537 (0x10001) OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 生成公鑰 writing RSA key OpenSSL> exit對于 PHP 可以直接使用上面生成的原始私鑰。但是 Java 需要將私鑰轉(zhuǎn)換成 PKCS8 格式,然后將生成的 PKCS8 格式的私鑰去除頭尾、換行和空格,作為私鑰字符串填入代碼中: OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem # 私鑰轉(zhuǎn)成 PKCS8 格式查看生成的文件: [root@VM_120_242_centos ~]# ll 總用量 1064 -rw-r--r-- 1 root root 887 6月 14 11:25 app_private_key.pem -rw-r--r-- 1 root root 272 6月 14 11:25 app_public_key.pem查看公鑰: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt 3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o 2n1vP1D+tD3amHsK7QIDAQAB -----END PUBLIC KEY-----轉(zhuǎn)成 PKCS8 格式的公鑰字符串為: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB查看私鑰: -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/ Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH 2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6 ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL 3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+ qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2 4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c -----END RSA PRIVATE KEY----- |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設(shè)備網(wǎng) 版權(quán)所有 |