密码学是指研究信息加密,破解密码的技术科学。密码学的起源能够追溯到2000年之前。而当今的密码学是以数学为基础的。html
密码学的历史大体能够追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方窃取情报,用密码传送情报。凯撒的作法很简单,就是对二十几个罗马字母创建一张对应表。这样,若是不知道密码本,即便解惑一段信息也看不懂。从凯撒大帝时代到上世纪七十年代这段很长的时间里,密码学的发展很是缓慢,由于设计者基本上靠经验。没有运用数学原理。算法
上世纪70年代产生的一种加密算法,其加密方式比较特殊,须要两个密钥:公开密钥简称公钥(publickey)和私有密钥简称私钥(privatekey)。公钥加密,私钥解密;私钥加密,公钥解密。这个算法就是伟大的RSA浏览器
若是两个数除了1以外没有其它公约数,咱们就称两个数是互质关系。好比3和17,又好比15和32,不是质数也能够造成互质关系。安全
思考如下问题🤔服务器
给定任意正整数n,请问在小于等于n的正整数中,有多少个构成互质关系?(好比1到8之中,有多少个数与8构成互质关系)markdown
计算这个值得方法叫作欧拉函数,用φ(n) 表示,在1到8之中,与8造成互质关系的是一、三、五、7共4个,因此app
φ(8) = 4
复制代码
若是两个正整数m和n互质,那么m的φ(n)次方减去1,能够被n整除函数
欧拉定理的特殊状况:若是两个正整数m和n互质,并且n为质数,那么φ(n)结果就是n-1oop
若是两个正整数e和x互质,那么必定能够找到整数d,使得 ed-1 被x整除。那么d就是e对于x的“模反元素”加密
// 认为k是ed/x的商
e*d mod x ≡ 1
e*d ≡ k*x + 1
复制代码
好比,3和11互质,那么3的模反元素就是4,由于 (3 × 4)-1 能够被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {...,-18,-7,4,15,26,...},即若是b是a的模反元素,则 b+kn 都是a的模反元素
以上理论理解起来很费劲,咱们经过一个例子来走一遍流程,而后再回头去看上面的公式们或许理解起来会容易一些
咱们能够选择61和53,实际应用中,这两个质数越大,就越难破解。
61 * 53 = 3233
复制代码
φ(n) = (p-1)(q-1)
复制代码
φ(3233) = (61-1)(53-1) = 3120
复制代码
1 < e < φ(n)
且 e和φ(n)互质
咱们能够在1到3120中随机选择17,实际应用中一般选择比较大的数
所谓模反元素就是值一个整数d,可使得ed被φ(n)除的余数为1
ed mod φ(n) ≡ 1
复制代码
17d mod 3120 ≡ 1
复制代码
d=2753知足条件
因此公钥就是(3233,17),私钥就是(3233,2753)
公钥加密公式为
m的e次方 mod n ≡ c
复制代码
私钥解密公式为
c的d次方 mod n ≡ m
复制代码
假如我想将65发送给服务器,那么加密流程为
65的17次方 mod 3233 = 2790
复制代码
将2790发送给服务器,至关于c,而后服务器利用私钥解密
2790的2753次方 mod 3233 = 65
复制代码
神不知鬼不觉的就将值65传递给了服务器
对于浏览器来讲公钥是公开的,服务器私钥加密没有意义,谁均可以拿到公钥来解密,RSA只解决了客户端利用公钥加密以后安全传递给服务器的问题,这就足够客户端和服务器制定新的加密规则,后续使用他们新制定的规则继续通信,也就是对称加密算法
对于app来讲公钥也能够是不公开的,那么app使用公钥加密传递给服务器、服务器使用私钥加密将数据传递给客户端都是相对安全的
回顾以上流程咱们共生成了6个数字 p、q、n、φ(n)、e、d
,其中公钥用到了e、n
,私钥用到了d、n
,其他四个是不公开的,其中关键的是d
,一旦d
泄露那么黑客就能够完成解密,那么在已知公钥n、d
的状况下有没有可能推导出d
呢?
ed mod φ(n) ≡ 1
φ(n) = (p-1)(q-1)
n=pq
只有将n
因式分解,才能计算出p
和q
,可是因式分解是一件很是困难的事儿,目前除了暴力破解尚未发现别的有效方法,因此RSA算法目前来讲是相对安全的,秘钥长度越长因式分解难度就越大,也就越安全
genrsa
生成并输入一个RSA私钥rsautl
使用RSA秘钥进行加密、解密、签名和验证等运算rsa
处理RSA秘钥的格式转换等问题rsaTest
终端进入目录openssl genrsa -out private.pem 1024
复制代码
openssl rsa -in private.pem -pubout -out public.pem
复制代码
openssl rsa -in private.pem -text -out private.txt
复制代码
private.txt
信息cat private.txt
复制代码
message.txt
vi message.txt
复制代码
cat message.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.txt
复制代码
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec1.txt
复制代码