RSA加密

作者: HJXu | 来源:发表于2016-06-22 16:38 被阅读110次

最近在了解了下RSA加密算法和加签算法,学习了好多相关的知识
相较于DES,更加安全可靠
首先了解几个相关概念,方便后续问题的解决:
RSA算法
由来:1977年由Rivest、Shamir 和 Adleman 发明的,RSA就是取自他们三个人的名字。
地位:目前地球上最重要的加密算法,毫不夸张的说只要有计算机网络的地方就有RSA算法
理论依据:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥。该算法能够抵抗目前已知的所有密码攻击。RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密。我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器。
对称算法和非对称算法:
对称加密:用户A通过某种算法对信息M加密.用户B必须通过同样的算法进行解密才能得到信息M.
非对称加密:用户A

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;  
}  

相关文章

  • RSA加密方式

    RSA加密方式 获取RSA密钥 加密 解密 js库

  • C# RSA加解密和MD5加密

    1.RSA加密 2.RSA解密 3.RSA签名 RSA签名验签 4.MD5加密

  • RSA签名认证

    RSA可汗学院第一章 RSA加密 RSA加密原理第一章 RSA加密原理第二章 如何生成RSA公钥私钥 生成类似支付...

  • kotlin版本RSA非对称加密解密与分段加密解密

    基于kotlin语言的RSA非对称加密解密与分段加密解密 RSA非对称加密 RSA非对称加密的具体算法与来源我就不...

  • # RSA 公钥加密算法

    # RSA 公钥加密算法 # RSA 公钥加密算法

  • 命令

    文件编译 加密解密 1. 对称加密 DES AES Base64 2. 非对称加密 RSA RSA加密:公钥加密,...

  • Java加密

    MD5加密: RSA加密: CBC加密:

  • RSA加密算法详解

    什么是RSA算法? RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是197...

  • 项目加密 RSA+DES3加密方式

    rsa加密参考网址 rsa加密参考网址 des3加密支持中文加密 des加密参考网址 加密的方式为 先将数据进行D...

  • 常用的加密

    加密 RSA MD5 SHA-1 DES 3DES RSA RSA是一种非对称加密算法(公钥加密,私钥解密)。对极...

网友评论

      本文标题:RSA加密

      本文链接:https://www.haomeiwen.com/subject/rpkndttx.html