IOS加密 AES 256算法(EncryptAndDecrypt.h)
【摘要】
EncryptAndDecrypt.h#import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption) - (NSData *)AES256EncryptWithKey:(NSData *)key; //加密 - (NSDa...
-
EncryptAndDecrypt.h
-
#import <Foundation/Foundation.h>
-
-
@class NSString;
-
-
@interface NSData (Encryption)
-
-
- (NSData *)AES256EncryptWithKey:(NSData *)key; //加密
-
-
- (NSData *)AES256DecryptWithKey:(NSData *)key; //解密
-
-
- (NSString *)newStringInBase64FromData; //追加64编码
-
-
+ (NSString*)base64encode:(NSString*)str; //同上64编码
-
-
+(NSData*)stringToByte:(NSString*)string;
-
-
+(NSString*)byteToString:(NSData*)data;
-
-
-
-
@end
-
///EncryptAndDecrypt.m
-
-
-
#import "EncryptAndDecrypt.h"
-
-
#import <CommonCrypto/CommonCrypto.h>
-
-
static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-
@implementation NSData (Encryption)
-
-
- (NSData *)AES256EncryptWithKey:(NSData *)key //加密
-
{
-
//AES256加密,密钥应该是32位的
-
-
const void * keyPtr2 = [key bytes];
-
-
char (*keyPtr)[32] = keyPtr2;
-
-
//对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小
-
-
//所以在下边需要再加上一个块的大小
-
-
NSUInteger dataLength = [self length];
-
-
size_t bufferSize = dataLength + kCCBlockSizeAES128;
-
-
void *buffer = malloc(bufferSize);
-
-
size_t numBytesEncrypted = 0;
-
-
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
-
-
kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,
-
-
[key bytes], kCCKeySizeAES256,
-
-
NULL,/* 初始化向量(可选) */
-
-
[self bytes], dataLength,/*输入*/
-
-
buffer, bufferSize,/* 输出 */
-
-
&numBytesEncrypted);
-
-
if (cryptStatus == kCCSuccess) {
-
-
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
-
-
}
-
-
free(buffer);//释放buffer
-
-
return nil;
-
-
}
-
-
- (NSData *)AES256DecryptWithKey:(NSData *)key //解密
-
{
-
//同理,解密中,密钥也是32位的
-
-
const void * keyPtr2 = [key bytes];
-
-
char (*keyPtr)[32] = keyPtr2;
-
-
//对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小
-
-
//所以在下边需要再加上一个块的大小
-
-
NSUInteger dataLength = [self length];
-
-
size_t bufferSize = dataLength + kCCBlockSizeAES128;
-
-
void *buffer = malloc(bufferSize);
-
-
size_t numBytesDecrypted = 0;
-
-
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
-
-
kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,
-
-
keyPtr, kCCKeySizeAES256,
-
-
NULL,/* 初始化向量(可选) */
-
-
[self bytes], dataLength,/* 输入 */
-
-
buffer, bufferSize,/* 输出 */
-
-
&numBytesDecrypted);
-
-
if (cryptStatus == kCCSuccess) {
-
-
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
-
-
}
-
-
free(buffer);
-
-
return nil;
-
-
}
-
-
-
- (NSString *)newStringInBase64FromData //追加64编码
-
{
-
-
NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];
-
-
unsigned char * working = (unsigned char *)[self bytes];
-
-
int srcLen = [self length];
-
-
for (int i=0; i<srcLen; i += 3) {
-
-
for (int nib=0; nib<4; nib++) {
-
-
int byt = (nib == 0)?0:nib-1;
-
-
int ix = (nib+1)*2;
-
-
if (i+byt >= srcLen) break;
-
-
unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F);
-
-
if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F);
-
-
[dest appendFormat:@"%c", base64[curr]];
-
-
}
-
-
}
-
-
return dest;
-
-
}
-
-
+ (NSString*)base64encode:(NSString*)str
-
{
-
-
if ([str length] == 0)
-
-
return @"";
-
-
const char *source = [str UTF8String];
-
-
int strlength = strlen(source);
-
-
char *characters = malloc(((strlength + 2) / 3) * 4);
-
-
if (characters == NULL)
-
-
return nil;
-
-
NSUInteger length = 0;
-
-
NSUInteger i = 0;
-
-
while (i < strlength) {
-
-
char buffer[3] = {0,0,0};
-
-
short bufferLength = 0;
-
-
while (bufferLength < 3 && i < strlength)
-
-
buffer[bufferLength++] = source[i++];
-
-
characters[length++] = base64[(buffer[0] & 0xFC) >> 2];
-
-
characters[length++] = base64[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
-
-
if (bufferLength > 1)
-
-
characters[length++] = base64[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
-
-
else characters[length++] = '=';
-
-
if (bufferLength > 2)
-
-
characters[length++] = base64[buffer[2] & 0x3F];
-
-
else characters[length++] = '=';
-
-
}
-
-
NSString *g = [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];
-
-
return g;
-
-
}
-
-
+(NSData*)stringToByte:(NSString*)string
-
{
-
NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""];
-
if ([hexString length]%2!=0) {
-
return nil;
-
}
-
Byte tempbyt[1]={0};
-
NSMutableData* bytes=[NSMutableData data];
-
for(int i=0;i<[hexString length];i++)
-
{
-
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
-
return nil;
-
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_char2 >= 'A' && hex_char2 <='F')
-
int_ch2 = hex_char2-55; A 的Ascll - 65
-
else
-
return nil;
-
-
tempbyt[0] = int_ch1+int_ch2; ///将转化后的数放入Byte数组里
-
[bytes appendBytes:tempbyt length:1];
-
}
-
return bytes;
-
}
-
-
+(NSString*)byteToString:(NSData*)data
-
{
-
Byte *plainTextByte = (Byte *)[data bytes];
-
NSString *hexStr=@"";
-
for(int i=0;i<[data length];i++)
-
{
-
NSString *newHexStr = [NSString stringWithFormat:@"%x",plainTextByte[i]&0xff];///16进制数
-
if([newHexStr length]==1)
-
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
-
else
-
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
-
}
-
return hexStr;
-
}
-
-
-
@end
使用
-
-(void)Jiami
-
{
-
NSString *plainText = @"AES中国";//明文
-
-
NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
-
-
-
NSString *keyStr = @"12345678901234567890123456789012";
-
NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding];
-
-
-
NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyDataStr];
-
-
NSString *hexStr = [NSData byteToString:cipherTextData];
-
-
NSLog(@"密文:%@",hexStr);
-
[self Jiemi:hexStr];
-
-
-
-
}
-
-
-(void)Jiemi:(NSString *)hexString
-
{
-
NSString *keyStr = @"12345678901234567890123456789012";
-
NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding];
-
-
NSData *data = [NSData stringToByte:hexString];
-
-
/
-
-
NSData *datas = [data AES256DecryptWithKey:keyDataStr];
-
NSLog([[NSString alloc]initWithData:datas encoding:NSUTF8StringEncoding]);
-
}
http://blog.csdn.net/pjk1129/article/details/8489550
文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。
原文链接:zzzili.blog.csdn.net/article/details/8610060
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)