這篇文章將從RSA理論
、RSA終端操做
、RSA代碼操做
三個方面去了解和使用RSA加密。一到四節是理論部分,以爲看的無趣的小夥伴們能夠直接跳到第五節objective-c
早期:使用密碼本
(羅馬字母與數字對應的一張表)算法
1976年之前:對稱加密算法
,加密解密使用同一種規則(密鑰),這種規則的保護就顯得極爲重要,一旦泄露或破解,全部的信息都能被解密出來安全
1976年:「迪費赫爾曼密鑰交換」算法
是由美國兩個計算機學家迪費(W.Diffie)、赫爾曼(M.Hellman)共同提出的構思,能夠在不直接傳遞密鑰的狀況下進行密鑰交換服務器
1977年:RSA加密
問世。RSA是由美國麻省理工學院的數學家羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一塊兒提出並用他們的名字命名的函數
原根: (p爲質數),其中i≠j且i, j介於1至(p-1)之間,則g爲p的原根 如:由於3^1 mod 17 = 3,3^2 mod 17 = 9...3^16 mod 17 = 1,3的1~16次方mod17的值都不相同,因此3爲17的原根編碼
歐拉函數:在小於正整數n的數中,與n互質的數的個數加密
特色:spa
條件: m與n互質code
公式: orm
條件: m與n互質,且n爲質數
公式:
條件: e與x互質
公式:
接下來咱們利用已知的數學公式來推演公式:
① 在歐拉定理公式中,等式兩邊同k次方,根據同餘定理的冪運算性質就能夠獲得
② 而後在等式兩邊同乘m,便可得出
③ 在模反元素公式中,去掉mod運算符。既然ed-1能夠被x整除,那麼ed必然是x的k倍數+1
④ 在x=φ(n)的狀況下,
總結: 歐拉函數和模反元素能夠推出RSA加密的前身,並且根據屢次計算,發現所知足的必要條件與歐拉函數並不一致
條件:
公式:
數學家們花了許多時間和精力都沒有想到繼續拆分這個公式的方法,知道迪費、赫爾曼兩個大佬的出現才解決了這個難題,同時迪費赫爾曼密鑰交換也開創了密碼學的新方向
信息6
發送給客戶端信息12
發給服務器注意:
信息6
和信息12
,並不能截取到真實信息其實迪費赫爾曼當時的目的只是爲了在密鑰交換的時候更加安全,而以後RSA三兄弟站了出來
迪費赫爾曼已經成功將拆分紅和,只是沒有提出這一理念
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -pubout -out public.pem
cat public.pem
openssl rsa -in private.pem -text -out private.txt
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bin
openssl rsautl -verify -in enc.bin -inkey public.pem -pubin -out dec.txt
xxd enc.bin
openssl req -new -key private.pem -out rsacert.csr
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
openssl x509 -outform der -in rsacert.crt -out rsacert.der
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
┭┮﹏┭┮終於不用在生成p12文件時百度代碼了
base64能夠將任意的二進制數據進行編碼,編碼成爲由65個字符組成的文本文件,是二進制數據的一種表現 base64編碼是由(A-Z,a-z,0-9,+ / =)組成的,最少爲24個字符位,從左至右6個爲一組,不足6個則補零,用等號來填補最後的空白 如A的二進制是01000001
,補到24位是010000 010000 000000 000000
,轉換成base64碼就是QQ==
base64 xxx.jpeg -o xxx.text
base64 xxx.text -o xxx.jpeg -D
// 對一個字符編碼
- (NSString *)base64Endcode:(NSString *)str {
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}
複製代碼
// 對一個編碼解密
- (NSString *)base64Decode:(NSString *)str {
NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:0];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
複製代碼