LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

大道至简

zixincao.lofter.com|个人应用 for Android

共4篇文章,15人喜欢

应用截图

大道至简

大道至简

 

ios开发常用的加解密方法

        一般来说,ios平台最常用的加解密有:MD5、AES等。

        MD5是一种不可逆的运算,利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。但在加密一些简单文本方面安全性还是太差,有专门的网站就可以破解:http://www.cmd5.com,所以只适用于一些对安全性要求较低的应用。

        要想使用MD5加密算法,需要先引入头文件,然后为NSString添加类别方法。

  1. #import <CommonCrypto/CommonDigest.h>

        头文件中提供的方法:CC_MD5可以获取MD5的16个字符的数组,再通过%02X的形式输出即可获取32位MD5值。以下是类别方法:

  1. @implementation NSString (CCCryptUtil)

  2. -(NSString*) md5 :(NSString *)str

  3.  {

  4.        

  5. const char *cStr = [str UTF8String];

  6.     unsigned char result[16];

  7. CC_MD5(cStr, strlen(cStr), result); // This is the md5 call

  8. return [NSString stringWithFormat:

            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3], 
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ]; 


  9. }

  10. @end

        因为MD5加密的单向性,所以MD5只有加密方法,没有解密方法。

        如果对应用的安全性要求比较高,可以使用AES算法,同样需要引入上面的头文件。先为NSData添加类别方法,包含加密与解密方法,以下是类别方法:

  1. @implementation NSData (CCCryptUtil)


  2. - (NSData*)AES256EncryptWithKey:(NSString*)key {

  3.     

  4.     char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)

  5.     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

  6.     

  7.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

  8.     

  9.     NSUInteger dataLength = [self length];

  10.     

  11.     size_t bufferSize           = dataLength + kCCBlockSizeAES128;

  12.     void* buffer                = malloc(bufferSize);

  13.     

  14.     size_t numBytesEncrypted    = 0;

  15.     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,

  16.                                           keyPtr, kCCKeySizeAES256,

  17.                                           NULL /* initialization vector (optional) */,

  18.                                           [self bytes], dataLength, /* input */

  19.                                           buffer, bufferSize, /* output */

  20.                                           &numBytesEncrypted);

  21.     

  22.     if (cryptStatus == kCCSuccess) {

  23.         return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

  24.     }

  25.     

  26.     free(buffer);

  27.     return nil;

  28. }


  29. - (NSData*)AES256DecryptWithKey:(NSString*)key {

  30.     

  31.     char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)

  32.     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

  33.     

  34.     // fetch key data

  35.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

  36.     

  37.     NSUInteger dataLength = [self length];

  38.     

  39.     size_t bufferSize           = dataLength + kCCBlockSizeAES128;

  40.     void* buffer                = malloc(bufferSize);

  41.     

  42.     size_t numBytesDecrypted    = 0;

  43.     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,

  44.                                           keyPtr, kCCKeySizeAES256,

  45.                                           NULL /* initialization vector (optional) */,

  46.                                           [self bytes], dataLength, /* input */

  47.                                           buffer, bufferSize, /* output */

  48.                                           &numBytesDecrypted);

  49.     

  50.     if (cryptStatus == kCCSuccess) {

  51.         return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

  52.     }

  53.     

  54.     free(buffer); //free the buffer;

  55.     return nil;

  56. }


  57. @end

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

        结合上述代码,还可以为NSString添加类别方法:

  1. @implementation NSString (CCCryptUtil)


  2. // md5方法此处省略


  3. + (NSData*)AES256Encrypt:(NSString*)strSource withKey:(NSString*)key {

  4.     NSData *dataSource = [strSource dataUsingEncoding:NSUTF8StringEncoding];

  5.     return [dataSource AES256EncryptWithKey:[key md5]];

  6. }


  7. + (NSString*)AES256Decrypt:(NSData*)dataSource withKey:(NSString*)key {

  8.     NSData *decryptData = [dataSource AES256DecryptWithKey:[key md5]];

  9.     return [[NSString alloc] initWithData:decryptData encoding:NSUTF8StringEncoding];

  10. }

  11. @end

我的腾讯微博:http://t.qq.com/zixincaoeq

                                                                                                                      ------大道至简的lofter,期待你的来访。




大道至简

功能说明

1. 独立查看“大道至简”发布在LOFTER的所有文章
2. 文章更新通知提醒
3. 归档方式查看
4. 方便的分享文章到微信、微博

创建一个属于自己的APP

本应用由UAPP生成,内容版权归作者所有。UAPP支持LOFTER、网易博客、新浪博客、百度空间、QQ空间、blogbus、豆瓣日记、点点网、搜狐博客、网易摄影等生成个人应用。

了解更多