RSA数学原理
离散对数
欧拉函数
互质关系
如果两个正整数,除了1意外,没有其他公因数,就称这两个数为互质关系
7和8就是互质关系,6和8不是互质关系
欧拉函数特点
- 当n是质数时,Φn = n - 1
- 如果n可以分解成两个互质数的相互的乘积,如下图,
Φn = Φp1 × Φp2 = (p1 - 1) × (p2 - 1)
欧拉定理
如果两个正整数m和n互质,那么m的Φn次方减1,可以被n整除
费马小定理
如果两个正整数m和n互质,并且n是质数那么Φn的结果就是n-1
公式转换
迪菲赫尔曼密钥交换
经过上面一堆的数学算法可以看RSA的加密效率并不高,要经过一堆的数学算法来计算,大数据不适合用RSA来加密,比如说对称加密,需要用到KEY,但直接传递KEY和数据很容易被破解,但如果用RSA加密这个KEY,再用KEY来对数据进行对称加密,再把KEY和数据传给客户端,如果中间被获取到了,要想解密,就必须要先破解得到KEY,才能来解密数据
RSA终端命令
Mac的终端就是用的OpenSSL(开源加密库),可以用终端来调试RSA
openssl genrsa -out private.pem 1024 生成私钥
openssl rsa -in private.pem -pibout -out public.pem 生成公钥
openssl rsa -in private.pem -text -out private.text 把私钥转成明文查看
openssl rsautl -encrypt -in message.text -inkey public.pem -pubin -out enc.text 用公钥加密
openssl rsautl -decrypt -in enc.text -inkey private.pem -out dec.text 用私钥解谜
RSA代码演示
openssl req -new key private.pem -out rsacert.csr
通过私钥向证书颁发机构请求csr文件
openssl x509 -req -days 3650 in rescert.csr -signkey private.pem -out rsacert.crt
通过csr文件向证书颁发机构进行签名
openssl x509 -outform der -in rsacert.crt -out rsacert.der
把crt证书转成iOS能够用的der证书
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
生成p12文件
因为加密后的文件全是些二进制的,不能验证,所以会把二进制进行转码,专程Base64编码的
Base64编码
是由AZ、az、/、=,这几个构成的,base64只适用于表达加密过后的二进制文件,经过base64编码之后会比原文件大三分之一
base64 message.text -o abc.text 编码
base64 abc.text -o 123.text -D 解码
- (NSString *)base64EndCode:(NSString *)str {
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}编码
- (NSString *)base64DecCode:(NSString *)str {
NSData *data = [[NSData alloc]initWithBase64EncodedString:str options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}解码
RSA加密
先通过rsa加密解密然后在通过base64编码打印出来
Hash
特点
- 算法是公开的,得到的结果是一样的
- 不同数据的运算,如MD5得到的结果默认是128位
- 无法逆运算
- 用来做信息摘要,信息指纹,用来做数据识别 数据是无限的但Hash的结果是有限的是16的32次方,当两个或多个不同的数据拥有同样的Hash时,这时候称之为散列碰撞
用途
密码加密
加盐&HMAC加密
对称加密
- DES 数据加密标准
- 3DES 使用3个密钥,对相同的数据进行3次加密,
- AES 高级密码标准 对称加密是加密解密是用同一个key ,非对称加密,私钥加密公钥解密
对称加密有两种模式
- ECB 电子密码本模式 每一块数据,独立加密 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用
openssl enc -des-ecb -K 7068 -nosalt -in ph.text -out msg.bin
- CBC 密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误) CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密