博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UI 公钥加密
阅读量:4573 次
发布时间:2019-06-08

本文共 4558 字,大约阅读时间需要 15 分钟。

RSA是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名.

本文将讨论如何在中使用RSA传输加密数据.

RSA基本原理

RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key).

  • 公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端.
  • 私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题.

iOS中的Security.framework提供了对RSA算法的支持.这种方式需要对密匙对进行处理, 根据public key生成证书, 通过private key生成p12格式的密匙.

除了Secruty.framework, 也可以, 这可以提供更灵活的使用方式.

本文使用Security.framework的方式处理RSA.

1 #!/usr/bin/env bash 2 echo "Generating RSA key pair ..." 3 echo "1024 RSA key: private_key.pem" 4 openssl genrsa -out private_key.pem 1024 5  6 echo "create certification require file: rsaCertReq.csr" 7 openssl req -new -key private_key.pem -out rsaCertReq.csr 8  9 echo "create certification using x509: rsaCert.crt"10 openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt11 12 echo "create public_key.der For IOS"13 openssl x509 -outform der -in rsaCert.crt -out public_key.der14 15 echo "create private_key.p12 For IOS. Please remember your password. The password will be used in iOS."16 openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt17 18 echo "create rsa_public_key.pem For Java"19 openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout20 echo "create pkcs8_private_key.pem For Java"21 openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt22 23 echo "finished."

Tips:

  • 在创建证书的时候, terminal会提示输入证书信息. 根据wizard输入对应信息就OK. 
  • 在创建p12密匙时, 会提示输入密码, 此时的密码必须记住, 之后会用到.
  • 如果上面指令有问题,请参考最新的openssl官方文档, 以官方的为准. 之前在网上搜索指令, 被坑了一圈之后, 还是会到啃官方文档上. 每条指令文档在最后都会有几个sample,参考sample即可.

iOS如何加载使用证书

代码依赖, 如果使用cocoapods, 可以讲下面依赖添加到Podfile:

加密数据 、解密数据

  先引入RSA文件

1 #import "ViewController.h" 2 #import "RSA.h" 3  4 @interface ViewController () 5  6 @end 7  8 @implementation ViewController 9 10 - (void)viewDidLoad {11     [super viewDidLoad];12     // Do any additional setup after loading the view, typically from a nib.13     14     // 获取公钥的数据15     // 公钥的iOS客户端使用,我们打到公钥以后,只需要根据公钥处理数据就可以了16     NSString *publicKey = @"-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuNX8J0NZ1jvIyfzhgga/2+4/dUqqN15ijWVmWWxpfzdph1aG3UlH3SfPplgfeSuPBZUokD6WW70LSQKgbd74jcz5GoBXN40WxGTXfP5sTbcQqM5UBtbza9wWhCjw+jPQOwh17rvpOdUj0QppHoDRdeeHwXrjCntzvB7IBs0si7wIDAQAB-----END PUBLIC KEY-----";17     // 获取私钥,用于解密数据的,千万不能泄露,否则数据不安全18     NSString *privateKey = @"-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK41fwnQ1nWO8jJ/OGCBr/b7j91Sqo3XmKNZWZZbGl/N2mHVobdSUfdJ8+mWB95K48FlSiQPpZbvQtJAqBt3viNzPkagFc3jRbEZNd8/mxNtxCozlQG1vNr3BaEKPD6M9A7CHXuu+k51SPRCmkegNF154fBeuMKe3O8HsgGzSyLvAgMBAAECgYBfk9IjHITM8qRGuC3CJOTZ6KLBlr0kHQkNddQE/e62aUZLLt4Oqgd2WQiNO1cNyqCyVlQa/MqoyJQsrnSMvWF/Qcj8Mk0XuMVDO0fhGGRG6x4EuimOzTSP2NGQdWnK9FgyTXPS6+PK4qUoXgOfZaqzAZFlBrWcw3/Zfyav6pf24QJBANi5mULelXb5SqJ3Gt2B929uqNwv2QyGc8BUZ9z/voxtgIhamYqsQ1fsqbfnqS7dTAM7K/pbjkSqDKfkR/hhtxsCQQDNx3m1NRk5mS4oEDcRNQ1qmv7ntjQ0Mh+xQcZiVYfY3CyAZzS70tnUBrCIKcQckihqdZ8502WrpSLNKaJ7YBy9AkEAnKbTFBWlfcDF5NcosRG/U2luXvGq9rW8tzmLdZ/aENEZxfWO5ECN0OD88DRgAsLsra04pZdGJ3Wu/jAwoWWoHwJAGNYopGxiPQd2ALPkUZlbozBN792X82zRUm2j6h50pQH+BQlv3fOXAvZDvEt+NgyWADNuImaXcN4fky+hQs7Y6QJAHYJBSAxmWekp3+v5rpkOIj3Uf55wL9O8ECax9E/HZqeEhczjg+h9dhJ6FwsfuiycOO32hQoWwxvKOgapTLwpGA==-----END PRIVATE KEY-----";19     20     // 创建字符串21     NSString *testStr = @"小暖心";22     // 创建存储公钥的字符串23     NSString *encPublicKey;24     // 创建存储私钥的字符串25     NSString *encPrivateKey;26     // 使用RSA进行加密处理27     // 参数1:需要加密的内容28     // 参数2:公钥字符串29     encPublicKey = [RSA encryptString:testStr publicKey:publicKey];30     NSLog(@"public = %@", encPublicKey);31     // 解密处理32     // 第一个参数:由java后台提供33     // 第二个参数:私钥字符串34     NSString *result = @"p/hm1SvJm9SuuPy66rrf37+EhynkpVnCxbSCZfKznrAKVfpciX/TZM9GfLrAs+bXlND+GeOeZDz2zm+nZDtxpGV1pyQY03hOWn1MQ2+wBKKQdveEdYJ4TVXwGtC3PMaA3dwdRY+WqInQj9WX4JfuQfkYCqbmI0w86uydjFpenwE=";   // 进过加密之后需要把加密的内容传送给后台,此时后台会给你返回一个相对应的字符串35     encPrivateKey = [RSA decryptString:result privateKey:privateKey];36     NSLog(@"private = %@", encPrivateKey);37     38 }

 

在服务器端解码数据(Java)

在中解码需要使用下述指令生成的pkcs8 private key:

gen shell 写道
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt

具体解码步骤:

  1. 加载pkcs8 private key:
    1. 读取private key文件
    2. 去掉private key头尾的"-----BEGIN PRIVATE KEY-----"和"-----BEGIN PRIVATE KEY-----"
    3. 删除private key中的换行
    4. 对处理后的数据进行Base64解码
    5. 使用解码后的数据生成private key.
  2. 解密数据:
    1. 对数据进行Base64解码
    2. 使用RSA decrypt数据.

总结

这种加密传输方式会被用在网银类App中.虽然网银会采用全站https方案, 但是在安全登录这块会使用另一个证书对登录信息加密, 这样可以双层确保数据安全.

基于RSA加密解密算法, 还可以将其运用在数字签名场景.以后有空在聊如何使用RSA算法实现对文件的数字签名.

转载于:https://www.cnblogs.com/crazygeek/p/5486582.html

你可能感兴趣的文章
基于bs4库的HTML内容查找方法
查看>>
Ubuntu安装TTF字体
查看>>
使用YII缓存注意事项
查看>>
Office转HTML
查看>>
Ping 命令的使用方法总结
查看>>
python基础--01安装
查看>>
Spring boot配置mybatis多数据源
查看>>
获取系统的相关文件夹
查看>>
PAT-乙级-1008. 数组元素循环右移问题 (20)
查看>>
OpenCV 传统分割测试
查看>>
Springboot拦截器线上代码失效
查看>>
WCF初探-2:手动实现WCF程序
查看>>
好程序员技术分享html5和JavaScript的区别
查看>>
好程序员web前端分享CSS3文本属性
查看>>
ThinkPHP3.0启动过程
查看>>
Java入门 之 类和对象(一) - 类
查看>>
16级第二周寒假作业E题
查看>>
Java实现Windows锁屏
查看>>
在线会话管理
查看>>
文本处理之可视化wordcloud
查看>>