您的位置:首页 > 其它

AES加解密以及示例

2016-01-18 23:20 253 查看
网上AES加解密的代码很多,其基本原理都差不多,很多都是直接将明文通过AES加密生成含有特殊的密文,而这些密文可能需要添加到url,这样就有可能被解析错了,所以有事需要将密文转化为ascii码,本文就是转化为ascii码,这样可以直接加在url后面直接请求接口了。当然里面还有很多的配置参数要适合自己了,要不然,呵呵?

很多时候发现在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;
}


例子有点乱,但是基本实现了加解密,可以参考,对于加解密的原理,有机会再解释吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: