这篇文章将从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];
}
复制代码