IOS开发各种加解密,编解码

1.AES加解密,给NSData添加类别 NSData+AES

添加头文件#import <CommonCrypto/CommonCryptor.h>

- (NSData *)AES256EncryptWithKey:(NSString *)key {//加密

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

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

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

- (NSData *)AES256DecryptWithKey:(NSString *)key {//解密

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

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

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

2.base64编解码参考

GTMDefines.h

GTMBase64.h

GTMBase64.m

下载地址

http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/?r=87

http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/?r=575

3.各种加密,数字摘要。给NSString添加类别NSString+Encrypto

(1).MD5数字摘要

- (NSString *)md5 {

const char *cStr = [self UTF8String];

unsigned char result[16];

CC_MD5( cStr, strlen(cStr), result );

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]

];

}

(2)SHA1摘要

- (NSString*) sha1
{
    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:self.length];
 
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
 
    CC_SHA1(data.bytes, data.length, digest);
 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
 
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
 
    return output;
}

(3)base64编码
- (NSString *) base64
{    
    NSData * data = [self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    data = [GTMBase64 encodeData:data]; 
    NSString * output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    return output; 
}

(4)SHA1与base64结合
- (NSString *) sha1_base64
{
    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:self.length];
 
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
 
    CC_SHA1(data.bytes, data.length, digest);
 
    NSData * base64 = [[NSData alloc]initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
    base64 = [GTMBase64 encodeData:base64];
 
    NSString * output = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding]; 
    return output; 
}
 
(5)MD5与base64结合
- (NSString *) md5_base64
{
    const char *cStr = [self UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest );
 
    NSData * base64 = [[NSData alloc]initWithBytes:digest length:CC_MD5_DIGEST_LENGTH];
    base64 = [GTMBase64 encodeData:base64];
 
    NSString * output = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding]; 
    return output;
}

4.3DES是一种对称的加密方式,因为用的同一个密钥。

对于加解密的安全性什么大家可以google,baidu自己找资料参考。

我也不过是简单的说一下通信加密中的一种可实现方案而已。

同样的3DES加密基本也都是统一的,系统也直接提供了API,基本代码如下

//3des加解密

+ (NSString*)TripleDES:(NSString*)plainText encryptOrDecrypt:(CCOperation)encryptOrDecrypt

{

const void *vplainText;

size_t plainTextBufferSize;

if (encryptOrDecrypt == kCCDecrypt)//解密

{

NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];

plainTextBufferSize = [EncryptData length];

vplainText = [EncryptData bytes];

}

else //加密

{

NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];

plainTextBufferSize = [data length];

vplainText = (const void *)[data bytes];

}

CCCryptorStatus ccStatus;

uint8_t *bufferPtr = NULL;

size_t bufferPtrSize = 0;

size_t movedBytes = 0;

bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);

bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));

memset((void *)bufferPtr, 0x0, bufferPtrSize);

// memset((void *) iv, 0x0, (size_t) sizeof(iv));

const void *vkey = (const void *) [DESKEY UTF8String];

// NSString *initVec = @"init Vec";

//const void *vinitVec = (const void *) [initVec UTF8String];

//  Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};

ccStatus = CCCrypt(encryptOrDecrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding | kCCOptionECBMode,

vkey,

kCCKeySize3DES,

nil,

vplainText,

plainTextBufferSize,

(void *)bufferPtr,

bufferPtrSize,

&movedBytes);

//if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");

/*else if (ccStatus == kCC ParamError) return @"PARAM ERROR";

else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";

else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";

else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";

else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";

else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; */

NSString *result;

if (encryptOrDecrypt == kCCDecrypt)

{

result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr

length:(NSUInteger)movedBytes]

encoding:NSUTF8StringEncoding]

autorelease];

}

else

{

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

result = [GTMBase64 stringByEncodingData:myData];

}

return result;

}

时间: 2024-10-13 16:48:08

IOS开发各种加解密,编解码的相关文章

H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码图像: PPS:图像参数集,作用于编码视频序列中一个或多个独立的图像: 这两个帧也是独立的NALU. I-Frame:关键帧,帧内编码后的帧,显示比较完全的一帧: P-Frame:参考前一帧,可能只是对比前一帧的运动估计的变化部分: B-Frame:会参照前后的帧,其他类似P-Frame.B和P F

.net&#160;安卓IOS跨平台des加解密双向的(可以互相加解密)

1 #region 跨平台加解密(c# 安卓 IOS) 2 3 // public static string sKey = "12345678"; 4 5 // /// 6 7 // /// 解密 8 9 // /// 10 11 // /// 要解密的以Base64 12 13 // /// 密钥,且必须为8位 14 15 // /// 已解密的字符串 16 17 // public static string DesDecrypt(string pToDecrypt) 18 19

iOS开发--混编篇&amp;swift与OC混合使用

Swift与OC混合使用 swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift [cpp] view plaincopy import Foundation class Act : NSObject { fun

iOS开发之加载大量网络图片优化

1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着才能把图片放入图片路径显示.比如: -(UIImage *) getImageFromURL:(NSString *)fileURL {   //NSLog(@"执行图片下载函数");       UIImage * result;       NSData * data = [NSData dataWithContentsO

iOS开发-UIWebView加载本地和网络数据

UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置的,实现一些基本的功能.UIWebView可以查看Html网页,pdf文件,docx文件,txt文件文件,系统自带的Safari就是UIWebView实现的. 基础布局 页面布局很简单就是一个文本框,一个按钮,一个UIWebView,页面布局如下: 如果想简单一点的话,其实用UIWebView也行,

iOS开发——路径篇&amp;混编路径与全局宏路径

混编路径与全局宏路径 最近在做东西的时候有一个地方要用到一个第三方库的,但是目前swift版的还没有找到,自己又不想写(其实是不会写),所以就想到了混编,但是中间出现了好多问题,其中印象最深的就是桥接文件的路径问题,着让我想到了关于Xcode6之前的一个pch文件路径,虽然不一样,但是,我就是很傻逼的在这里搞了好久才搞通,所以就总结一些. 一:混编路径 关于混编,这里就不多说了.平时我们想要实现一个功能,但是在swift目前还没有找到好的方法,而正好objective-C却很容易实现的时候(或第

iOS开发之加载、滑动翻阅大量图片优化解决方案

本文转载至 http://mobile.51cto.com/iphone-413267.htm 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制.我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏浏览界面的这短暂的1秒内(和后续的几秒),都发生了什么. AD:2014WOT全球软件技术峰会北京站 课程视频发布 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界

iOS开发_UIWebView加载本地html

项目中遇到这样的问题:webview放在uiscrollview,webview加载本地html,之后需要计算webview高度. 步骤如下: 1.首先创建webview.几点注意,高度一定要小于你要加载的html的高度,最好设定个最小值,比如1:并且设置scalesPageToFit = YES使之自适应高度; self.bottomWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(self.middle

ios开发 uiwebview加载网页时阻止禁止取消图片下载

http://www.icab.de/blog/2009/08/18/url-filtering-with-uiwebview-on-the-iphone/ - (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request { NSURL *url = [request URL]; BOOL blockURL = [url.absoluteString hasSuffix:@"jpg"] || [url.ab