iOS 以byte数组作为密钥的3des加密
2015-08-15 16:22
525 查看
最近做3des加密的时候,服务器返回的byte数组作为密钥,网上的方法都是以字符串作为密钥。先将字符串进行utf8编码,再转换成data,这样和直接用byte数组进行加密是有区别的,转换后的data字节数增加了一倍,这时候怎么办呢?
首先 对密钥字符串进行处理,把16进制字符串转换为byte数组(nadata)
这样就得到了data的密钥,然后进行3des加密
ok,这样就可以得到加密后的结果了
首先 对密钥字符串进行处理,把16进制字符串转换为byte数组(nadata)
- (NSData *) stringToHexData { int len = [self length] / 2; // Target length unsigned char *buf = malloc(len); unsigned char *whole_byte = buf; char byte_chars[3] = {'\0','\0','\0'}; int i; for (i=0; i < [self length] / 2; i++) { byte_chars[0] = [self characterAtIndex:i*2]; byte_chars[1] = [self characterAtIndex:i*2+1]; *whole_byte = strtol(byte_chars, NULL, 16); whole_byte++; } NSData *data = [NSData dataWithBytes:buf length:len]; free( buf ); return data; }
这样就得到了data的密钥,然后进行3des加密
+(NSString*)TripleDES:(NSString*)plainText andCCOperation:(CCOperation )encryptOrDecrypt anddata:(NSData*)data { 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]; const void *vkey = (const void *)[data bytes]; // 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); NSString *result; if (encryptOrDecrypt == kCCDecrypt) { result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding]; } else { NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; result = [GTMBase64 stringByEncodingData:myData]; } return result; }
ok,这样就可以得到加密后的结果了
相关文章推荐
- ios学习之旅---指针也不难
- iOS开发常用快捷键
- iOS_第三方字体的导入和使用
- 个人常用iOS第三方库以及XCode插件介绍
- Xcode中iOS模拟器程序中的plist路径
- Xcode中iOS模拟器程序中的plist路径
- Xcode中iOS模拟器程序中的plist路径
- ios打包应用程序,生成ipa文件
- 高仿美团iOS版,版本号5.7
- 高仿百度传课iOS版,版本号2.4.1.2
- 高仿土豆视频iOS版
- IOS中图片作为button的背景图拉伸
- iOS SDK详解之NSCopying协议
- 高仿 IOS遨游哈哈最新版
- VMware Workstation11.0安装Mac OS X 10.10最完整指南(包含所需所有资源下载)
- 苹果开发 笔记(61)recursiveDescription 方法
- NSNumberFormatter的使用
- ios开发问题汇总
- iOS开发之OC内存管理
- 【iOS开发】 CoreText 使用教程:以创建一个简单的杂志应用为例