zoukankan      html  css  js  c++  java
  • ios常见加密解密方法

    在其他平台中经常会计算MD5值,在iOS平台中也提供了该方法,首先需要导入头文件

    [cpp] view plain copy
    1. #import <CommonCrypto/CommonDigest.h>  

    方法CC_MD5可以获取MD5的16个字符的数组,再通过%02X的形式输出即可获取32位MD5值。

    [cpp] view plain copy
    1. @implementation NSString (CCCryptUtil)  
    2. -(NSString*) md5 {  
    3.     const char * cStrValue = [self UTF8String];  
    4.     unsigned char theResult[CC_MD5_DIGEST_LENGTH];  
    5.     CC_MD5(cStrValue, strlen(cStrValue), theResult);  
    6.     return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",  
    7.             theResult[0], theResult[1], theResult[2], theResult[3],   
    8.             theResult[4], theResult[5], theResult[6], theResult[7],   
    9.             theResult[8], theResult[9], theResult[10], theResult[11],   
    10.             theResult[12], theResult[13], theResult[14], theResult[15]];  
    11. }  
    12. @end  


    MD5只能称为一种不可逆的加密算法,只能用作一些检验过程,不能恢复其原文。

    apple还提供了RSA、DES、AES等加密算法,见到国外的网站关于AES加密的算法,在此经过加工可以用于字符串加密机密,可用于安全性要求较高的应用。

    首先需要导入头文件

    [cpp] view plain copy
    1. #import <CommonCrypto/CommonCryptor.h>  

    将NSData分类,添加NSData加密解密方法

    [cpp] view plain copy
    1. @implementation NSData (CCCryptUtil)  
    2.   
    3. - (NSData*)AES256EncryptWithKey:(NSString*)key {  
    4.       
    5.     char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)  
    6.     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)  
    7.       
    8.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    9.       
    10.     NSUInteger dataLength = [self length];  
    11.       
    12.     size_t bufferSize           = dataLength + kCCBlockSizeAES128;  
    13.     void* buffer                = malloc(bufferSize);  
    14.       
    15.     size_t numBytesEncrypted    = 0;  
    16.     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,  
    17.                                           keyPtr, kCCKeySizeAES256,  
    18.                                           NULL /* initialization vector (optional) */,  
    19.                                           [self bytes], dataLength, /* input */  
    20.                                           buffer, bufferSize, /* output */  
    21.                                           &numBytesEncrypted);  
    22.       
    23.     if (cryptStatus == kCCSuccess) {  
    24.         return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
    25.     }  
    26.       
    27.     free(buffer);  
    28.     return nil;  
    29. }  
    30.   
    31. - (NSData*)AES256DecryptWithKey:(NSString*)key {  
    32.       
    33.     char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)  
    34.     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)  
    35.       
    36.     // fetch key data  
    37.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    38.       
    39.     NSUInteger dataLength = [self length];  
    40.       
    41.     size_t bufferSize           = dataLength + kCCBlockSizeAES128;  
    42.     void* buffer                = malloc(bufferSize);  
    43.       
    44.     size_t numBytesDecrypted    = 0;  
    45.     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,  
    46.                                           keyPtr, kCCKeySizeAES256,  
    47.                                           NULL /* initialization vector (optional) */,  
    48.                                           [self bytes], dataLength, /* input */  
    49.                                           buffer, bufferSize, /* output */  
    50.                                           &numBytesDecrypted);  
    51.       
    52.     if (cryptStatus == kCCSuccess) {  
    53.         return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
    54.     }  
    55.       
    56.     free(buffer); //free the buffer;  
    57.     return nil;  
    58. }  
    59.   
    60. @end  

    上述代码AES256EncryptWithKey方法为加密函数,AES256DecryptWithKey为解密函数,加密和解密方法使用的参数密钥均为32位长度的字符串,所以可以将任意的字符串经过md5计算32位字符串作为密钥,这样可以允许客户输入任何长度的密钥,并且不同密钥的MD5值也不会重复。

    结合上述代码,加工NSString类,提供字符串的AES加密解密方法。代码如下:

    [cpp] view plain copy
    1. @implementation NSString (CCCryptUtil)  
    2.   
    3. // md5方法此处省略  
    4.   
    5. + (NSData*)AES256Encrypt:(NSString*)strSource withKey:(NSString*)key {  
    6.     NSData *dataSource = [strSource dataUsingEncoding:NSUTF8StringEncoding];  
    7.     return [dataSource AES256EncryptWithKey:[key md5]];  
    8. }  
    9.   
    10. + (NSString*)AES256Decrypt:(NSData*)dataSource withKey:(NSString*)key {  
    11.     NSData *decryptData = [dataSource AES256DecryptWithKey:[key md5]];  
    12.     return [[NSString alloc] initWithData:decryptData encoding:NSUTF8StringEncoding];  
    13. }  
    14.   
    15. @end  
  • 相关阅读:
    java中使用静态字段和构造函数跟踪某个类所创建对象的个数
    java中静态初始化块的执行顺序
    Java字段初始化的规律
    java web第一次课堂测试1
    java课极限测试
    对于java中反编译命令的使用以及Integer包装类的查看
    在java的静态方法中访问类的实例成员
    [Android开发] 获取Android的Google Map API密钥
    [Android开发] 整合不同版本的android project的方法
    比特,字节和像素之间的关系
  • 原文地址:https://www.cnblogs.com/Hakim/p/5408629.html
Copyright © 2011-2022 走看看