需求场景
客户端(ios)为了比较安全的通过发起http请求的方式从服务端(java)获取一个重要的数据(这里以字符串举例)采用rsa加解密的方式
实现思路
- 客户端生成公钥和私钥
- 公钥转换成通用格式后通过接口传给服务端
- 服务端使用公钥加密字符串 响应给客户端这个加密后的数据
- 客户端使用私钥解密字符串
步骤详解(ios端)
-
生成公钥和私钥
-
mac 桌面新建文件夹 我这里命名为“rsa公私钥”,用来保存生成的公钥和私钥文件,然后打开终端进入你新建的文件夹,打开openssl
- 生成私钥
genrsa -out rsa_private_key.pem 1024
- 将私钥转成PKCS8的格式
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
在这时 拷贝下来我们的私钥, 这个私钥将用于解密,需要注意的是具体使用时需要去掉开头和结尾, 并且去掉其中的换行符。这个后面再说。
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMpX40MJpXm0FcBx
ovj3cfamqK7/aDGiYV+tSF6eITyu+5ACyba5LY1tch/o2A+cDZuJws/r8bRwebGN
VaQ/A/BQ/jcO55VKezCYQGtvuzcmnJhgdNBJrJxFb3vWfIqWtKFW5cKaPH0bYc72
YddTkojGKZ212acj3f66KNXMactRAgMBAAECgYEAjryW5Zhtcb/2xC2lcIlljEAe
qGwlfTX2CL89WPmlqqApd3pv/wT8PFMjeZ0QpVpJQxpYIcJoXAgn4Hc6HcYSKPe7
Y5McuYjVYKVe0TO6rByBUC0bk4G/7iL3wvK5Vqa+jd5b+XB8GthNJTNQPLHh3G1W
p6iuNVT2JDkpkcD85C0CQQDzIEkKnsLHqzmrWokZ2WJ8K68GV9wt18d4JyifYKae
VfJMCe7E+86kXb54YVVRR8Eqp6gYcXM2LBDoD/B/yHLzAkEA1Q7EnFnlZssmXw3+
c5A4pIqXG6nfJ0IXLIEfa9LRF7uMW0eFJ6sgFEiuZPnbfL+0uUmSbrX28a3p0MIi
0omxqwJAJGhTR8nadTgI3MYj/cD15I5OGW8Sw7KqZi3HAYbhrJhGPmjGXq0ulqKL
IU/CDPfnz1Fn9LEYhaY3qeipJRmJTQJAYUPnsDU+DCqMLvL1ig56PWvjxkZL0OFU
MQYVsSTCPiJp1jYVbOGruHbh3slOUWo3eCtFRXOe9ABgcORf/1vLFwJAXhMOgKq2
Ak84UilMkLin+35nU/oN/qsebdcjyEf0XxvNPap8xF/Cy0DAh8Ju+mjDgwbGDtJC
7uzTt27ZvFBzXA==
-----END PRIVATE KEY-----
- 生成公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
做完这一步 看一下我们的文件夹 多了两个文件
至此 第一步完成了。
-
公钥转换成通用格式后通过接口传给服务端
1.获取公钥
接着刚才的命令窗口 键入control + c,使用vim 打开刚刚生成的rsa_public_key.pem文件
保存后 命令行键入 :wq ,然后回车
- 转换成xml rsa key的通用格式 给java后端使用
打开转换工具地址:https://superdry.apphb.com/tools/online-rsa-key-converter
拷贝进去我们上一步保存的公钥 转换得到的xml rsa key公钥如下
我们得到通用格式的公钥,这将是你传给后台的公钥。
<RSAKeyValue><Modulus>ylfjQwmlebQVwHGi+Pdx9qaorv9oMaJhX61IXp4hPK77kALJtrktjW1yH+jYD5wNm4nCz+vxtHB5sY1VpD8D8FD+Nw7nlUp7MJhAa2+7NyacmGB00EmsnEVve9Z8ipa0oVblwpo8fRthzvZh11OSiMYpnbXZpyPd/roo1cxpy1E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
-
服务端使用公钥加密字符串 响应给客户端这个加密后的数据
我从服务端得到的加密后的数据如下
ZxeRgfIqacvfMUqeMeIKi2VEJk9J8VVvXz1/fiBWa+YqViBaOQdMV9eDLyZ9Z1EUEg+zDW1XHG0iNcz6A5APrykWFDJME2OpHFZxPVsnelHbKxyRwNk4klW0/XQSf/PMRAX7xJ+NsNfZycVwHZcHizsgdO4jKsz1apaIG21Iims=
- 客户端使用私钥解密字符串
移步github下载封装好的工具:https://github.com/ideawu/Objective-C-RSA
导入RSA.h 和RSA.m文件
下面使用我们第一步的私钥进行解密 注意:去掉开头结尾 以及中间的换行符,上代码
// 服务端返还的加密的数据
NSString *value_scrpt = @"ZxeRgfIqacvfMUqeMeIKi2VEJk9J8VVvXz1/fiBWa+YqViBaOQdMV9eDLyZ9Z1EUEg+zDW1XHG0iNcz6A5APrykWFDJME2OpHFZxPVsnelHbKxyRwNk4klW0/XQSf/PMRAX7xJ+NsNfZycVwHZcHizsgdO4jKsz1apaIG21Iims=";
// 私钥掐头去尾 去换行符
NSString *private_key = @"MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL2S8LGI1ZbnUIs56zFJZPjq/LV3+wREKQaV+LUKHCv8EH+ihiU93xohT8qaiB5bL4lUQFWN3aNjq8+dwytLWIjkUOJcSlcZiUDUf/DJ3RvIJ4nndQg6t8vD72JNNullalYxCTaWFm82nxctxt9RXBOdgqsm7TV8oMcI1u2xTuLdAgMBAAECgYEAlmnjPgnC5sPMHVusJ+QDEJlqPxXefekS4B3YQtStu5x4/rxWUXBA93uc0rU/8U4Kbp0BmqBATiaEKOwU8eILcNyVtr3YmxdjC9xvnck/ynYLfWZ6vIAFZBSQXG5dLrQHTI6+2+Ii0udggGt5/daGTimzG5voEk6nq7LmpT1mwyUCQQDeJMsTkxRGTUFUFDB2lgVX+mJWLH3KH7rwfZjD0RSvLp/ijix5ikzkphDDAKpee/Y/X88JueBbjPtDip/dvRSbAkEA2ndmK5GofRkOnQgy35cUrS8/6Gcz0Blh1kNmsg9mPWEUv18vnwXR5O/xXFyyYPY3ZD6XLMEfrf+QnvMlCakR5wJARbeWZFZMjqPAVPrhGtaKZsoWAqWD9ONwb/l68Dm2HCSt2RR1sM9OwpO7vvd+gJi297zB5XOIjjL4yIHBGn408QJBAJK62OtwZDrJRpBfvlOAFIoRDxpXnmwpcBXJpUL4ptGYz6eNFd33ubbLFU/UjpYjKKbyhvSvLUjfOlIXuouXe4cCQQDJJKZ4QJV5WPRFLxHi4iX0D+UwAJQSVBjo0+FVxvJPuDjBmeoSytxtB9hbf+J/1dT35fBRiU5gRBfQlnEGzfOB";
// 解密
NSString *value = [RSA decryptString:value_scrpt privateKey:private_key];
打印解密结果
(lldb) po value
H379MfdLWBrZTG41Bt9XPJSuLu8t45UL22QPnSH/NcY=
解密成功!