ios下使用RSA算法加密与java后台解密配合demo

首先了解一下几个相关概念,以方便后面遇到的问题的解决:

原网址:http://blog.csdn.net/jinglijun/article/details/7770315
RSA算法:1977年由Ron Rivest、Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字。算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥。该算法能够抵抗目前已知的所有密码攻击。RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密。我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器。

PEM:既然使用RSA需要一对密钥,那么我们当然是要先使用工具来生成这样一对密钥了。在linux、unix下,最简单方便的就是使用openssl命令行了。而DER、PEM就是生成的密钥可选择的两种文件格式。DER是Distinguished Encoding Rules的简称,是一种信息传输语法规则,在ITU X.690中定义的。在ios端,我们的公钥就是需要这样一种格式的,我们可以从Certificate, Key, and Trust Services Reference这篇文档的SecCertificateCreateWithData函数的data参数的说明中看到。而PEM格式是一种对DER进行封装的格式,他只是把der的内容进行了base64编码并加上了头尾说明。openssl命令行默认输出的都是PEM格式的文件,要能够在ios下使用,我们需要指定使用DER或者先生成PEM然后转换称DER。还有那些keystore,pkcs,p7b,p12后面介绍

IOS客户端的加解密首先我们需要导入Security.framework,

在ios中,我们主要关注四个函数

      • SecKeyEncrypt:使用公钥对数据进行加密
      • SecKeyDecrypt:使用私钥对数据进行解密
      • SecKeyRawVerify:使用公钥对数字签名和数据进行验证,以确认该数据的来源合法性。什么是数字签名,可以参考百度百科这篇文章?
      • SecKeyRawSign:使用私钥对数据进行摘要并生成数字签名

      RSA算法有2个作用一个是加密一个是加签。从这几个函数中,我们可以看到,我们第一种是使用公钥能在客户端:加密数据,以及服务器端用私钥解密。

      第二个就是用私钥在客户端加签,然后用公钥在服务器端用公钥验签。第一种完全是为了加密,第二种是为了放抵赖,就是为了防止别人模拟我们的客户端来攻击我们的服务器,导致瘫痪。

      下面直接看代码吧:

  • -(SecKeyRef)getPublicKey{
  • NSString *certPath = [[NSBundle mainBundle] pathForResource:@"keystore" ofType:@"p7b"];
  • SecCertificateRef myCertificate = nil;
  • NSData *certificateData = [[NSData alloc] initWithContentsOfFile:certPath];
  • myCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData);
  • SecPolicyRef myPolicy = SecPolicyCreateBasicX509();
  • SecTrustRef myTrust;
  • OSStatus status = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust);
  • SecTrustResultType trustResult;
  • if (status == noErr) {
  • status = SecTrustEvaluate(myTrust, &trustResult);
  • }
  • return SecTrustCopyPublicKey(myTrust);
  • }
  • -(NSString *)RSAEncrypotoTheData:(NSString *)plainText
  • {
  • SecKeyRef publicKey=nil;
  • publicKey=[self getPublicKey];
  • size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
  • uint8_t *cipherBuffer = NULL;
  • cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
  • memset((void *)cipherBuffer, 0*0, cipherBufferSize);
  • NSData *plainTextBytes = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  • int blockSize = cipherBufferSize-11;  // 这个地方比较重要是加密问组长度
  • int numBlock = (int)ceil([plainTextBytes length] / (double)blockSize);
  • NSMutableData *encryptedData = [[NSMutableData alloc] init];
  • for (int i=0; i<numBlock; i++) {
  • int bufferSize = MIN(blockSize,[plainTextBytes length]-i*blockSize);
  • NSData *buffer = [plainTextBytes subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];
  • OSStatus status = SecKeyEncrypt(publicKey,
  • kSecPaddingPKCS1,
  • (const uint8_t *)[buffer bytes],
  • [buffer length],
  • cipherBuffer,
  • &cipherBufferSize);
  • if (status == noErr)
  • {
  • NSData *encryptedBytes = [[[NSData alloc]
  • initWithBytes:(const void *)cipherBuffer
  • length:cipherBufferSize] autorelease];
  • [encryptedData appendData:encryptedBytes];
  • }
  • else
  • {
  • return nil;
  • }
  • }
  • if (cipherBuffer)
    • {
    • free(cipherBuffer);
    • }
    • NSString *encrypotoResult=[NSString stringWithFormat:@"%@",[encryptedData base64EncodedString]];
    • return encrypotoResult;
    • }

    #import <Security/Security.h>

    #import "NSData+Base64.h"

时间: 2024-10-25 06:43:15

ios下使用RSA算法加密与java后台解密配合demo的相关文章

ios下使用rsa算法与php进行加解密通讯

首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. DE

关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名

需求环境: 西安项目中,客户要求保护用户的密码信息,不允许在http中传递明文的密码信息. 实现: 用RSA非对称加密方式实现.后台生成rsa密钥对,然后在登陆页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,用私钥解密,获取密码明文. 这样客户端只需要知道rsa加密方式和公钥,前台不知道私钥是无法解密的,此解决方案还是相对比较安全的. 附件是参照网友资料的java+JS的实现,放在这里供大家下载.访问方式/RSA/login.jsp. 需要到http://www.bouncycas

iOS下使用SHA1WithRSA算法加签源码

首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. PE

rsa实现js前台加密java后台解密

前段时间咱老大吩咐我写一个rsa前台加密到后台用java解密.(说实话这之前我还真没用过) 不过没办法啊,这是任务,于是研究了一下.圆满完成任务了,下面共享下实现思路: 准备工作:其实鄙人也没那么强啦,第三方包是必须的 bcprov-jdk15on-148.jar commons-codec-1.7.jar commons-lang-2.4.jar log4j-1.2.15.jar slf4j-api-1.6.1.jar package com.web.utils; import java.io

RSA算法加密解密,数据传输,前台与后台数据交互

1.RSA算法加密解密思路. java后台随机生成公钥.私钥.存储于session中,告知前台js获取公钥.通过jsencrypt.min.js进行加密.传输回后台,后台通过私钥解密. 2.RSA常见异常分解. 问题一 Cannot find any provider supporting RSA 出现此问题,属于JDK版本bug问题,笔者1.8.0_171遇到此问题,更换1.8.0_211之后即可解决. 问题二 DER input, Integer tag error 出现此问题,主要是公钥,

RSA算法加密解密

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行. RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes a

springmvc使用RSA算法加密表单

今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统.这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情.以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚. 加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签

安全不安全002:C#实现RSA算法加密解密

通过前面的文章我们学会了如何生成公钥和私钥,详见这篇文章:https://blog.csdn.net/yysyangyangyangshan/article/details/80368397.那么,我们来看在C#中如何实现RSA加密解密.直接上代码,如下类是RSA算法实现的加密,加解密,签名以及签名的验证. /// <summary> /// 类名:RSACrypt /// 功能:RSA加密.解密.签名.验签 /// </summary> public sealed class R

微信小程序用AES加密和java后台对接

哇,我真的厉害,又对接成功了. 在原博客https://www.cnblogs.com/fuckingPangzi/p/10281990.html,继续完成的. 在前台js加密的时候,是有一个vi(偏移量)和AES的密钥差不多是16位的. 然后你在后台解密的时候,需要在设置vi时候,弄一下getBytes("UTF-8")就ok了.如图 刚把AES和RSA的微信小程序加密整理到一个项目里面去了. 原文地址:https://www.cnblogs.com/fuckingPangzi/p/