网上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;
}
例子有点乱,但是基本实现了加解密,可以参考,对于加解密的原理,有机会再解释吧~