本篇文章将涉及以下几个操作:

1、iOS端使用RSA公钥加密,iOS端使用RSA私钥解密。

2、iOS端使用RSA私钥加签,iOS端使用RSA公钥验签。

3、iOS端使用RSA公钥加密,Java端使用RSA私钥解密。

4、iOS端使用RSA私钥加签,Java端使用RSA公钥验签。

首先,RSA公钥私钥对,我是由Java端生成的。拿到测试的密钥之后,我在iOS端使用时,添加私钥失败,报错是-50。我后来查了一下资料,得知,Java的文件密钥格式是PKCS8,而iOS需要使用PKCS1格式。这就需要进行一次转换,操作步骤如下:

1、打开一个文本编辑器(我使用的是Sublime),将Java端给到的私钥拷贝进来,并在首行添加"-----BEGIN PRIVATE KEY-----",在末行添加"-----END PRIVATE KEY-----",完成后的效果是这样的:

-----BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIYKYkvsosqWTaweZPkY6UjD1wWoSHB+FNoaquoNGfWN8JEOH2ml76ZpuIK+y3qMfkxsJUxUZqpwvKu3MJMBYSyPsYsa9ifROektzGvbDgN//+QYsekafw6v3R+fhIr4+S7k9f3hfZa0DyiylqCZzP/5jRYygdCXm1GzbptZRdrVAgMBAAECgYARlts/S1Yxb3fR1ks5xOMYAVr+Cw82c9UYqdczz3RQnMeswUWt/3BrTgRAY/kfo8APF0HtukWeqByaC/f70nqFxbN4DnLiGsHQRKbFt2dPFV+333M7UIDYgb7Y5fmHmArFZ4ezY+WC24sSsu4+A836d0mfGjSIa03TUH8XI6X5IQJBAMfjcGC2l+TKQLQWODeJEAH2q8SoPsN6BzYUNlPMMJcVoyeqxzy/X/YcLqgdrZD+WrX8g6Y3+RkaRJ/CScDW+RMCQQCrqu0vkEZooNzpbX+o2NJAZL9gzgxXnDe9rH53OjYjbQdD7cacYZ1ZRxehL8/3itPIUy4tZpQbA5e5WL4bBQF3AkAyu914DqA658LIcqNOJTG07eDnBzT29HAEH9kyJ69liY5hsQzktEYs9zY4YV/+XzCy5Cad97L31hz4151UnruVAkBr0zSfh3NyDHg1dj2VBHsrTxyV5VYDQXARhuL4aGvQ3I6PsC3r07RNe0XwTGPIDD7xuK1sft3QCfWmyYK+3eoJAkEAnRxTqRFDbHLejtgLvgjIL52IAURRrliRbN9iyy4t1YqyfOHC7EF/Np11DoVGiBQZrbnPtI7OnNalfIf/l1cTKg==

-----END PRIVATE KEY-----

2、将这个文本存为pkcs8.pem,放在桌面。

3、打开终端,执行如下命令:

openssl rsa -in pkcs8.pem -out pkcs1.pem

完成后效果如下:

pkcs8转换

使用cat命令可以看到转换后的内容,我们需要把这个内容拷贝出来,这是我们需要的私钥。

接下来就是iOS端的加密与解密代码:

- (void)testEncryptAndDecrypt

{

NSString *string = [NSString stringWithFormat:@"name=wql&age=12&userId=10000&nickname=Kayle"];

//加密时密钥不需要转换

NSString *publicKey = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ24IhJQ54nOYQjl49j9lmwUaJJs9RMoyOwfcEmyXrzKE50XyT3IUxYmfB65Zo4PTHb5OndJQnoJfabvHZVeNKj+9Tmi2BXMnQh3BEN2a6HRXBnkySUbLMf9stHrcoOvDsJrZ0PLA1oIZHEoLyKZD/NFqwA0Xng+Rjtf/o14FvIQIDAQAB";

NSString *privateKey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAInbgiElDnic5hCOXj2P2WbBRokmz1EyjI7B9wSbJevMoTnRfJPchTFiZ8Hrlmjg9Mdvk6d0lCegl9pu8dlV40qP71OaLYFcydCHcEQ3ZrodFcGeTJJRssx/2y0etyg68OwmtnQ8sDWghkcSgvIpkP80WrADReeD5GO1/+jXgW8hAgMBAAECgYBCkMCT+o2zRad9ZREyTqxeBoNlpFzEy1C9egEpszSrWEKdZX7u8rNJtkd9hqE5AS6QwlqcqBkFzXClo56aH/PAjIF/2dAhAhrdvNABrxB2h/PdUkTL5XCck1TNy04jzUgxULW/7BScQ0K68A7LNu7282ZzhIG0tYF0aCBObsLE8QJBANuC/iQIoT4aOrhMDwcHeRajgQrB7TekAw1BmOoXOGqzVOHl08b6Gv/NaYXM9QUwK84thpobjApl9+RTZ83jSm0CQQCgxdX9JVibTSRxKjj3XtxiqHnA6n+9zmiZAcgsV2Uo7bMnqsUPJ0CkgAZ4JA5DIDrni1wDM1O9NCRPH7SiKAcFAkBhaVkUbov3fjZOsNn+WY+fv0E1n+eASJVeHZ0ZTOKpXxmtAYuggj7XA7XvPYwCGGVoIoXX/59+wc9nEKhBErtlAkBbJk7gKuBFjELw9eM+PEXumV4OBeVOk0uyE9SNby8nOTytbKA0qyh3Gy6PxsFfRVKgG96a4erEBl/fjDY5CUCRAkEAkZh2Gl1QEnEO2SR/hNnKI60KpGWzt0JNva2EvUZV8eChK8LUqLktggM3M6BOV0jSxpP6YKM+X3eZeFpgvUO4iA==";

NSLog(@"加密前:%@",string);

//加密

NSString *encryptString = [RSAEncryptor encryptString:string publicKey:publicKey];

NSLog(@"加密后:%@",encryptString);

//本地解密

NSString *decryptString = [RSAEncryptor decryptString:encryptString privateKey:privateKey];

NSLog(@"解密后:%@",decryptString);

NSMutableDictionary *param = [NSMutableDictionary dictionary];

[param setObject:encryptString forKey:@"data"];

//后端解密

[self requestWithParam:param withUrlString:@"[http://localhost:8080/api/v1.0/testAPI4](http://localhost:8080/api/v1.0/testAPI4)"];

}

iOS端的签名与验签:

- (void)testSignAndVerify{

NSString *origin = @"1234567890";

//签名时 私钥需要是pkcs1格式,转换一下才可以使用

NSString *privateKey = @"MIICXAIBAAKBgQCGCmJL7KLKlk2sHmT5GOlIw9cFqEhwfhTaGqrqDRn1jfCRDh9ppe+mabiCvst6jH5MbCVMVGaqcLyrtzCTAWEsj7GLGvYn0TnpLcxr2w4Df//kGLHpGn8Or90fn4SK+Pku5PX94X2WtA8ospagmcz/+Y0WMoHQl5tRs26bWUXa1QIDAQABAoGAEZbbP0tWMW930dZLOcTjGAFa/gsPNnPVGKnXM890UJzHrMFFrf9wa04EQGP5H6PADxdB7bpFnqgcmgv3+9J6hcWzeA5y4hrB0ESmxbdnTxVft99zO1CA2IG+2OX5h5gKxWeHs2PlgtuLErLuPgPN+ndJnxo0iGtN01B/FyOl+SECQQDH43BgtpfkykC0Fjg3iRAB9qvEqD7Degc2FDZTzDCXFaMnqsc8v1/2HC6oHa2Q/lq1/IOmN/kZGkSfwknA1vkTAkEAq6rtL5BGaKDc6W1/qNjSQGS/YM4MV5w3vax+dzo2I20HQ+3GnGGdWUcXoS/P94rTyFMuLWaUGwOXuVi+GwUBdwJAMrvdeA6gOufCyHKjTiUxtO3g5wc09vRwBB/ZMievZYmOYbEM5LRGLPc2OGFf/l8wsuQmnfey99Yc+NedVJ67lQJAa9M0n4dzcgx4NXY9lQR7K08cleVWA0FwEYbi+Ghr0NyOj7At69O0TXtF8ExjyAw+8bitbH7d0An1psmCvt3qCQJBAJ0cU6kRQ2xy3o7YC74IyC+diAFEUa5YkWzfYssuLdWKsnzhwuxBfzaddQ6FRogUGa25z7SOzpzWpXyH/5dXEyo=";

//对数据进行加密

NSString *sign = [RSAEncryptor sign:origin withPriKey:privateKey];

NSLog(@"签名:%@",sign);

//后台验签

[self requestWithParam:@{@"sign":sign==nil?@"":sign} withUrlString:@"[http://localhost:8080/api/v1.0/testAPI3](http://localhost:8080/api/v1.0/testAPI3)"];

//本地验签

NSString *publicKey = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGCmJL7KLKlk2sHmT5GOlIw9cFqEhwfhTaGqrqDRn1jfCRDh9ppe+mabiCvst6jH5MbCVMVGaqcLyrtzCTAWEsj7GLGvYn0TnpLcxr2w4Df//kGLHpGn8Or90fn4SK+Pku5PX94X2WtA8ospagmcz/+Y0WMoHQl5tRs26bWUXa1QIDAQAB";

BOOL success = [RSAEncryptor verify:origin signature:sign withPublivKey:publicKey];

NSLog(@"是否验证成功:%@",success?@"YES":@"NO");

}

核心代码在RSAEncryptor文件中。

然后是Java端验签:

@RequestMapping(value = "api/v1.0/testAPI3", method = RequestMethod.GET)

public Object queryThree(@RequestParam(value = "sign",required = true)String signStr){

String string = "1234567890";

boolean success = RSAUtil.verifyIdentify(string,signStr);

System.out.println("验证成功?======="+(success?"YES":"NO"));

return success;

}

Java端解密:

@RequestMapping(value = "api/v1.0/testAPI4", method = RequestMethod.GET)

public Object queryFour(@RequestParam(value = "data",required = true)String dataString){

String decryptData = RSAUtil.decrypt(dataString);

System.out.println("解密结果:"+decryptData);

return decryptData;

}

核心代码在RSAUtil中。

接下来是iOS端本地效果:

iOS本地效果

Java端的验签与解密效果:

Java端效果

可以看到我们的签名与验签是通过了,解密的数据Java端也是成功拿到了。

代码在这里(含Java的核心代码)

加油~

ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)相关推荐

  1. Java 解析CA证书 对数据进行签名和验签

    Java 解析CA证书 对数据进行签名和验签 话不多说直接上代码(pfx证书) pom依赖 <dependency><groupId>org.apache.commons< ...

  2. C++ 使用OpenSSL 基于SHA1摘要的RSA签名及验签 与Java平台互通

    文章目录 准备 C++ Java RSASignature.java RSAEncrypt.java Base64.java 准备 配置OpenSSL环境 配置VS2015环境 生成公私秘钥 然后你们 ...

  3. 加密、解密、公钥、私钥、签名、验签

    加签.验签 「加签」:用Hash函数把原始报文生成报文摘要,然后用私钥对这个摘要进行加密,就得到这个报文对应的数字签名.通常来说呢,请求方会把「数字签名和报文原文」一并发送给接收方. 「验签」:接收方 ...

  4. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  5. 微信小程序-RSA签名、验签、加密、解密

    title: [小程序]RSA签名 type: categories date: 2017-05-27 17:01:15 categories: 小程序 tags: [RSA, 签名] 一个适用于微信 ...

  6. asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密

    最近有空在把自己的asp站点后端函数全部整理了下,在弄RSA的时候遇到了坑了,然后找到下面这位兄弟刚好发布的文章: https://blog.csdn.net/todaygods/article/de ...

  7. RSA加密、解密、签名、验签(验证签名)RSA算法原理

    转载链接:https://www.jianshu.com/p/8dc4a5f64e06 https://www.cnblogs.com/pcheng/p/9629621.html RSA原理:http ...

  8. Java开发中的加密、解密、签名、验签,密钥,证书,这篇就够了,赶紧收藏起来

    OpenSSL和keytool 先说一下两个重要的工具 OpenSSL:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl.应用程序命令工具以及密码算法库libcrypt ...

  9. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

最新文章

  1. 2020春季学期作业提交统计处理
  2. linux环境变量堆栈,情景linux--如何摆脱深路径的频繁切换烦恼?
  3. FFmpeg代码实现视频剪切
  4. UIDevice通知,键盘通知
  5. slz-JDK1.8的环境变量配置
  6. Python3 中的 asyncio async await 概念(实例)(ValueError: too many file descriptors in select())
  7. 一步一步写算法(之排序二叉树线索化)
  8. js隐藏和显示div
  9. day11_界面闪烁处理
  10. android英文用的是什么字体
  11. 机器学习算法工程师面试经历
  12. c语言绕过dnf检测,过掉DNF游戏保护,仅供学习研究。不得用于非法途径
  13. 51nod 1163 最高的奖励(超级经典贪心)
  14. Codeforces edu round 61 D-Stressful Training 二分
  15. html5怎么实现雨滴效果,HTML5实现晶莹剔透的雨滴特效
  16. 后辈悼王江民先生文(文言文)
  17. mysql删除数据怎么回退_mysql 删除整个数据库
  18. csp认证201903-1--小中大(c++)
  19. 2022年计算机考研数学一真题(网友版)
  20. 小程序接入流量主、banner广告、激励广告

热门文章

  1. 陶伟死因 从微博看明星
  2. led台灯哪个牌子质量好?2022最新的台灯牌子排名
  3. 市面上的护眼灯真的护眼吗?护眼灯作用大不大
  4. springboot2+junit5+MockMvc(Mockito)实现对Controller的测试,配置都有,很详细了。
  5. DC系列:1 (DC-1靶机,初级渗透详细教程)
  6. MySQL The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zo
  7. BJFU 1010 博弈 解题报告
  8. Qt利用avilib实现录屏功能,生成avi文件
  9. 第六章 相机及其应用 6.3欧拉角、旋转矩形、四元数、应用于Eigen的示例
  10. 图像处理计算机考试,计算机图形图像处理试题(A)(含答案).doc