iOS 非对称加密(RSA)

RSA简介

摘自百度百科-RSA:

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

重点:为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

1、生成私钥/公钥

打开终端,输入以下命令:

// 生成强度是 512 的 RSA 私钥
$ openssl genrsa -out private.pem 512

//从私钥中提取公钥
$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
// 或
$ openssl rsa -in private.pem -out public.pem -pubout

// 以明文输出私钥内容
$ openssl rsa -in private.pem -text -out private.txt

// 以明文输出公钥内容
$ openssl rsa -in public.pem -out public.txt -pubin -pubout -text 

2、生成签名证书

上一步OpenSSL默认生成的都是PEM格式的证书,iOS中不能使用PEM格式的证书,需要转成二进制的 DER 格式的证书。

// 1、生成csr证书请求文件(使用上一步中生成的私钥private.pem)
openssl req -new -key private.pem -out rsacert.csr
// 2、生成证书并签名(rsacert.crt证书),需要秘钥文件private.pem
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
// 3、转换证书格式(rsacert.crt)——> 二进制证书(rsacert.der证书)
openssl x509 -outform der -in rsacert.crt -out rsacert.der
// 4、导出p12格式证书(需要用到私钥private.pem)
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt

生成csr证书请求文件:
生成csr证书请求文件

导出p12文件:
导出p12文件

3、使用证书

使用封装的工具类进行测试:

- (void)viewDidLoad {
    [super viewDidLoad];
    //1.加载公钥
    [[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];
    //2. 加载私钥 - P12文件  password : 生成P12 的时候设置的密码
    [[RSACryptor sharedRSACryptor] loadPrivateKey:[[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];

}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 加密
    NSData * reault = [[RSACryptor sharedRSACryptor] encryptData:[@"Hello World!!!" dataUsingEncoding:NSUTF8StringEncoding]];
    //base64 编码
    NSString * base64 = [reault base64EncodedStringWithOptions:0];
    NSLog(@"加密的信息: %@",base64);

    //解密
    NSData * jiemi = [[RSACryptor sharedRSACryptor] decryptData:reault];
    NSLog(@"%@",[[NSString alloc]initWithData:jiemi encoding:NSUTF8StringEncoding]);
}

最后附上一篇笔记(很珍贵):
加密知识的笔记

封装代码已收藏

猜你喜欢

转载自blog.csdn.net/kangpengpeng1/article/details/80526314