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

原创 2015年07月07日 17:14:26

最近在研究RSA加密算法和加签算法,学习了好多相关的知识,

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

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"

    • 有问题就联系我吧!哈哈!

      请看http://blog.csdn.net/jinglijun/article/details/7791032

    转自于:http://blog.csdn.net/justinjing0612/article/details/7770315

通过ios实现RSA加密和解密

在加密和解密中,我们需要了解的知识有什么事openssl;RSA加密算法的基本原理;如何通过openssl生成最后我们需要的der和p12文件。 废话不多说,直接写步骤: 第一步:openssl来生成...
  • u011467458
  • u011467458
  • 2016年02月16日 19:44
  • 4203

RSA前端加密,java后台解密

/**  * RSA算法加密/解密工具类。  *  * @author fuchun  * @version 1.0.0, 2010-05-05  */ public abstract class R...
  • xiao_a_gang
  • xiao_a_gang
  • 2016年08月25日 14:45
  • 1476

用javascript与java进行RSA加密与解密

这几天一直做安全登录,网上查了好多资料,不尽如意。 具体实现思路如下: 1。服务端生成公钥与私钥,保存。 2。客户端在请求到登录页面后,随机生成一字符串。 3。后此随机字符串作...
  • ccecwg
  • ccecwg
  • 2015年01月20日 11:04
  • 470

iOS客户端与JAVA服务器之间的RSA加密解密【转】

来自:http://blog.csdn.net/showhilllee/article/details/50592003   在网上找了许多篇关于RSA加密解密的文章与博客,是很有帮助,但比...
  • chenyefei
  • chenyefei
  • 2016年11月22日 10:36
  • 975

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

最近在研究RSA加密算法和加签算法,学习了好多相关的知识, 首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest、Adi Shamirh...
  • u013896628
  • u013896628
  • 2015年11月18日 15:39
  • 198

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

最近刚好看到有人问iOS和java端rsa加密解密的问题,看到了以下别人的这些文章,先收藏下来。 最近在研究RSA加密算法和加签算法,学习了好多相关的知识, 首先了解一下几个相关概...
  • wu347771769
  • wu347771769
  • 2015年07月08日 19:06
  • 286

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

rsa前段加密 准备工作:其实鄙人也没那么强啦,第三方包是必须的                             bcprov-jdk15on-148.jar          ...
  • zhangxiong0797
  • zhangxiong0797
  • 2014年11月04日 09:59
  • 1954

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

最近在研究RSA加密算法和加签算法,学习了好多相关的知识, 首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest、Adi Shamirh和L...
  • Li_Huifeng
  • Li_Huifeng
  • 2015年01月05日 10:56
  • 804

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

ios下使用RSA算法加密与java后台解密配合demo java和iOS之间的加密解密 iOS加密解密完整代码...
  • jueyi1127
  • jueyi1127
  • 2015年07月03日 16:07
  • 628

Java,Android使用RSA 算法加解密

RSA算法:RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在...
  • mytfapp
  • mytfapp
  • 2015年08月05日 10:46
  • 1164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios下使用RSA算法加密与java后台解密配合demo
举报原因:
原因补充:

(最多只允许输入30个字)