iOS密码学-RSA加密原理探索

439 阅读5分钟

密码学

  密码学是指研究信息加密,破解密码的技术科学。密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。 从凯撒大帝时代到上世纪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