AES加解密以及示例
2016-01-18 23:20
253 查看
网上AES加解密的代码很多,其基本原理都差不多,很多都是直接将明文通过AES加密生成含有特殊的密文,而这些密文可能需要添加到url,这样就有可能被解析错了,所以有事需要将密文转化为ascii码,本文就是转化为ascii码,这样可以直接加在url后面直接请求接口了。当然里面还有很多的配置参数要适合自己了,要不然,呵呵?
很多时候发现在iOS端加完密之后和Java端加密结果甚为不一样,那么该怎么办呢?
看下文喽:
AES加解密的代码如下:
以下示例:
例子有点乱,但是基本实现了加解密,可以参考,对于加解密的原理,有机会再解释吧~
很多时候发现在iOS端加完密之后和Java端加密结果甚为不一样,那么该怎么办呢?
看下文喽:
AES加解密的代码如下:
- (NSData *)AES256ParmEncryptWithKey:(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 *)AES256ParmDecryptWithKey:(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; }
以下示例:
- (void)secretAdd { NSString *Token = @"CHINAPAPER#@$%"; NSData *mi = [[@"chinapaper:1234567890" dataUsingEncoding:NSUTF8StringEncoding] AES256ParmEncryptWithKey:Token]; NSString *s1 = [[NSString alloc]initWithData:mi encoding:NSUTF8StringEncoding]; LILog(@"%@", s1); NSMutableString *stttt = [NSMutableString string]; Byte *plainTextByte1 = (Byte *)[mi bytes]; printf("%s", plainTextByte1); for (int i = 0; i < [mi length]; i++){ [stttt appendString:[NSString stringWithFormat:@"%02x", plainTextByte1[i]]]; } LILog(@"====%@====", stttt); [self unlock:mi andByte:plainTextByte1 andStr:stttt]; } - (void)unlock:(NSData *)mii andByte:(Byte *)s andStr:(NSString *)cdcd{ NSString *Token = @"CHINAPAPER#@$%"; NSData *data = [self _16ToByte:cdcd]; NSData *mi = [data AES256ParmDecryptWithKey:Token]; NSMutableString *stttt = [NSMutableString string]; Byte *plainTextByte1 = (Byte *)[mi bytes]; for (int i = 0; i < [mi length]; i++){ [stttt appendString:[NSString stringWithFormat:@"%02x", plainTextByte1[i]]]; } NSString *str = [[NSString alloc]initWithData:mi encoding:NSUTF8StringEncoding]; LILog(@"====%@====", str); } - (NSData *)_16ToByte:(NSString *)hexString { int j=0; Byte bytes[[hexString length] / 2]; ///3ds key的Byte 数组, 128位 for(int i=0;i<[hexString length];i++) { int int_ch; /// 两位16进制数转化后的10进制数 unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16) int int_ch1; if(hex_char1 >= '0' && hex_char1 <='9') int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48 else if(hex_char1 >= 'A' && hex_char1 <='F') int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65 else int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97 i++; unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位) int int_ch2; if(hex_char2 >= '0' && hex_char2 <='9') int_ch2 = (hex_char2-48); //// 0 的Ascll - 48 else if(hex_char1 >= 'A' && hex_char1 <='F') int_ch2 = hex_char2-55; //// A 的Ascll - 65 else int_ch2 = hex_char2-87; //// a 的Ascll - 97 int_ch = int_ch1+int_ch2; NSLog(@"int_ch=%d",int_ch); bytes[j] = int_ch; ///将转化后的数放入Byte数组里 j++; } NSData *newData = [[NSData alloc] initWithBytes:bytes length:[hexString length] / 2]; return newData; }
例子有点乱,但是基本实现了加解密,可以参考,对于加解密的原理,有机会再解释吧~
相关文章推荐
- 【原】AFNetworking源码阅读(二)
- 使用Qt制作一个简易计算器
- 你所谓的努力,有事其实一文不值-------献给深陷bat的码农们
- 学习第六天——短暂迷茫
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
- C++制作俄罗斯方块 日志
- 01.HTML 5与HTML4的区别
- overflow内容溢出时,显示省略号
- CentOS5.8 + Nginx + MySQL + PHP + Xcache编译安装
- Android Activity Fragment 生命周期
- 第五篇
- git更新远程代码到本地
- linux驱动之并发与竟态
- 蓝桥杯 异或加密法
- 这么多开源框架,该用哪个好
- Swift入门———getter & setter
- 2016第三周一
- 自定义组合控件
- mysql在线改表结构 pt-online-schema-change
- jQuery - Detect value change on hidden input field