美文网首页iOS iOS开发iOS之逆向开发
iOS加密方式(RSA签名、加密、AES)

iOS加密方式(RSA签名、加密、AES)

作者: 深圳张学友 | 来源:发表于2017-07-27 14:20 被阅读460次

    之前项目中采取的加密方式,只是对于重要的参数进行AES加密,再将各个参数拼接而成,通过MD5签名后形成最后一个参数。目前,改用了RSA加密签名的方式进行加密,总结了下iOS中常用的加密方式。

    AES加密

    主要针对于些重要的参数进行加密,如账号、密码等,具体代码实现可下Demo查看

    //AES加密
    - (NSData *)AES128EncryptedDataWithKey:(NSString *)key iv:(NSString *)iv
    {
        return [self AES128Operation:kCCEncrypt key:key iv:iv];
    }
    //AES解密
    - (NSData *)AES128DecryptedDataWithKey:(NSString *)key iv:(NSString *)iv
    {
        return [self AES128Operation:kCCDecrypt key:key iv:iv];
    }
    
    - (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
    {
        char keyPtr[kCCKeySizeAES128 + 1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
        char ivPtr[kCCBlockSizeAES128 + 1];
        bzero(ivPtr, sizeof(ivPtr));
        if (iv) {
            [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        }
    
        NSUInteger dataLength = [self length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
    
        size_t numBytesEncrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(operation,
                                              kCCAlgorithmAES128,
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,
                                              keyPtr,
                                              kCCBlockSizeAES128,
                                              ivPtr,
                                              [self bytes],
                                              dataLength,
                                              buffer,
                                              bufferSize,
                                              &numBytesEncrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        }
        free(buffer);
        return nil;
    }
    

    DES加密

    //des加密  
    + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key  
    {  
        char keyPtr[kCCKeySizeAES256+1];  
        bzero(keyPtr, sizeof(keyPtr));  
          
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
          
        NSUInteger dataLength = [data length];  
          
        size_t bufferSize = dataLength + kCCBlockSizeAES128;  
        voidvoid *buffer = malloc(bufferSize);  
          
        size_t numBytesEncrypted = 0;  
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,  
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                              keyPtr, kCCBlockSizeDES,  
                                              NULL,  
                                              [data bytes], dataLength,  
                                              buffer, bufferSize,  
                                              &numBytesEncrypted);  
        if (cryptStatus == kCCSuccess) {  
            return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
        }  
          
        free(buffer);  
        return nil;  
    }  
    
    //des解密  
    + (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key  
    {  
        char keyPtr[kCCKeySizeAES256+1];  
        bzero(keyPtr, sizeof(keyPtr));  
          
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
          
        NSUInteger dataLength = [data length];  
          
        size_t bufferSize = dataLength + kCCBlockSizeAES128;  
        voidvoid *buffer = malloc(bufferSize);  
          
        size_t numBytesDecrypted = 0;  
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,  
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                              keyPtr, kCCBlockSizeDES,  
                                              NULL,  
                                              [data bytes], dataLength,  
                                              buffer, bufferSize,  
                                              &numBytesDecrypted);  
          
        if (cryptStatus == kCCSuccess) {  
            return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
        }  
          
        free(buffer);  
        return nil;  
    }  
    

    MD5加密

    MD5加密一般用于数据准确性检测,加密结果不可逆,一般用于不需要解密的地方.
    iOS SDK自带有MD5加密的框架CommonCrypto,使用时导入即可。
    可以根据需要选择16位、32位、64位的。

    #import "CommonCrypto/CommonDigest.h"
    + (NSString *)md5HexDigest:(NSString*)input
    {
        const char* str = [input UTF8String];
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        CC_MD5(str, strlen(str), result);
        NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];//
        
        for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
            [ret appendFormat:@"%02X",result[i]];
        }
        return ret;
    }
    
    

    RSA加密、解密和签名、验签

    加密主要是做加密操作,防止信息泄露。
    加签主要是为了防恶意攻击,防止别人模拟我们的客户端对我们的服务器进行攻击,避免服务器瘫痪。

    公钥、私钥

    公钥、私钥可以使用字符串的形式,也可以用文件的形式。
    RSA加密:公钥放在客户端,并使用公钥对数据进行加密,服务端拿到数据后用私钥进行解密。
    RSA加签:私钥放在客户端,并使用私钥对数据进行加签,服务端拿到数据后用公钥进行验签。

    RSA加密、解密

    RSA加密只需要导入Security.framework框架即可使用 这篇文章有详细的代码可参考,Demo中也有,使用起来比较简单。

    这里使用的密钥文件是.der和.p12格式,与java不同

    RSA加密文章

    RSA签名、验签

    签名和加密使用的是不同的方法,使用下面这个库可以实现RSA签名(这个库也可实现RSA加密解密的功能)
    iOSRSAHandler

    签名方式有两种:1.MD5+RSA 2.sha+RSA 本库中的sha加密使用的是sha1,我改成了sha256

    其他

    base64加密

    主要用于隐藏明文,信息可以随意进行解密,iOS 也提供了Base64加密的api,使用非常简单。

    凯撒加密

    凯撒加密是一种简单的文字替换加密。例如将字符串中的前几位进行替换。 考虑到加密内容不只是英文字母。此处改进使用ASCII码偏移进行加密解密。

    Demo下载

    iOS加密Demo

    相关文章

      网友评论

      • 不辣先生:我用rsa+aes 在本地能行德通,服务器解不出来?
        不辣先生:android jdk生成的随机key是32位字符,而ios这边是16位的字符这个咋整啊?然后后台解不出ios的
        不辣先生:@深圳张学友 不是,发现是aes后台的解不出来
        深圳张学友:sha加密是不是用的sha1

      本文标题:iOS加密方式(RSA签名、加密、AES)

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