密码学
密码学
是指研究信息加密,破解密码的技术科学。密码学
的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
密码学发展史
- 在1976年以前,所有的加密方法都是同一种模式:
加密
、解密
使用同一种算法。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥
),它保护就显得尤其重要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm ) - 1976年,两位美国计算机学家(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“
迪菲赫尔曼密钥交换
”算法。开创了密码学研究的新方向 - 1976年,两位美国计算机学家 迪菲(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“
迪菲赫尔曼密钥交换
”算法。开创了密码学研究的新方向
RSA原理
上世纪70年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥:公开密钥简称公钥
(publickey)和私有密钥简称私钥
(privatekey)。公钥加密,私钥解密;私钥加密,公钥解密。这个加密算法就是的RSA
。
又是为了需要,我们想要一种加密算法让加密容易,反算非常难,怎么设计呢?首先我们讨论一个数学问题离散对数问题
。例如3^x mod 17 = 12
。当被模数为质数时(此时是17),取模数(此时是3)比被模数小时,x取比被模数小的整数时,它的结果会位于1到被模数减一(此时是16)之前的整数。那么此时我们称3为17的原根
。当17的位置为一个足够大质数时,会增加反算的难度。
欧拉函数
φ 如果两个正整数,除了1以外,没有其他公因数,我们就称这两个数是互质关系
(coprime)。任意正整数n,计算在小于或等于n的正整数之中,与n构成互质关系的整数个数叫做欧拉函数Φ(n)
。欧拉函数有以下几个特点。
1、当n是质数
的时候,φ(n)=n-1。
2、如果n可以分解成两个互质的整数之积,如n=AB则:φ(AB)=φ(A)* φ(B) 小结:如果N是两个质数P1 和 P2的乘积则φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)欧拉定理
如果两个正整数m和n互质
,那么m的φ(n)次方减去1,可以被n整除。
欧拉定理的特殊情况:如果两个正整数m和n互质
,而且n为质数!那么φ(n)结果就是n-1,这就是吗费马小定理
.
- 公式推导
通过上面的推导可以得出以下结论:
如果两个正整数e和x互质,那么一定可以找到整数d,使得 ed-1 被x整除。那么d就是e对于x的
模反元素
。 通过上图可以看到只要客户端和服务器使用相同的算法加解密,客户端和服务器之间传递6和12,都可以通过计算得到10。即使黑客拿到了中间的传递数据以及拿到我加密算法,只要被模的值(此时是17)足够大,是很难被反推出来。 由以上加密过程即为RSA的加密原理,n和e为公钥,n和d为私钥,m为明文,c为密文。在实际加密过程中n会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)。由于需要求出φ(n),所以根据欧函数特点,最简单的方式n 由两个质数相乘得到: 质数:p1、p2 ,Φ(n) = (p1 -1) * (p2 - 1)。最终由φ(n)得到e 和 d 。总共生成6个数字:p1、p2、n、φ(n)、e、d。 - RSA原理 除了公钥用到了n和e 其余的4个数字是不公开的。目前破解RSA得到d的方式如下: 1、要想求出私钥 d 。由于e*d = φ(n)*k + 1。要知道e和φ(n);
利用Mac终端使用RSA
在Mac系统有一个内置开源的加密库(OpenSSL),所以可以通过终端直接操作RSA。在OpenSSL中RSA的常用指令有以下这些:
genrsa
:生成并输出一个RSA私钥
rsautl
:使用RSA秘钥进行加密、解密、签名和验证等运算
rsa
:处理RSA秘钥的格式转换等问题
- 生成长度为1024bit的RSA私钥
openssl genrsa -out private.pem 1024
- 从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
- 将私钥转换成明文
openssl rsa -in private.pem -text -out private.text
- 查看文本信息
cat private.txt
- 通过公钥加密数据,私钥解密数据
1、生成明文文件
vi info.txt
(info文件名) 2、查看文件内容cat info.txt
3、通过公钥进行加密openssl rsautl -encrypt -in info.txt -inkey public.pem -pubin -out enc.txt
4、通过私钥解密openssl rsautl -decrypt -in encrypt.txt -inkey private.pem -out dec.txt
5、通过私钥加密openssl rsautl -sign -in info.txt -inkey private.pem -out enc.txt
6、通过公钥解密openssl rsautl -verify -in enc.txt -inkey publc.pem -pubin -out dec.txt