IOS加密 AES 256算法(EncryptAndDecrypt.h)[转载]

////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/zzzili/article/details/8610060

IOS加密 AES 256算法(EncryptAndDecrypt.h)[转载]

时间: 2024-10-21 13:16:11

IOS加密 AES 256算法(EncryptAndDecrypt.h)[转载]的相关文章

java中的AES 256算法遇到 Illegal key size or default parameters错的解决办法

 报错信息: Caused by: java.security.InvalidKeyException: Illegal key size or default parameters 问题原因: Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_policy.jar.US_export_policy.jar)做了相应限制.因此存在一些问题:●密钥长度上不能满足需求(如:java.security.InvalidKeyException: Ille

ios安全性---AES加密

数据加密在解密在软件开发过程中举足轻重的作用,可能有的公司在加密的时候有自己公司内部一套设计的算法,而在这方面不想浪费太大精力就可以去考虑使用第三方提供的加密算法,如AES加密算法,本篇内容介绍开源中国iOS客户端使用ASE算法加密密码: AES   GitHub 下载地址  https://github.com/Gurpartap/AESCrypt-ObjC 对一个比较大的工程我们可能都不知道某个类库或者方法在哪被使用,但是智能的Xcode给我们提供了一个全局搜索的功能,我们可以在真个工程中来

iOS 开发笔记-andriod/java/iOS三方AES通用加密

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,就几种语言的加密都实践了一遍,实现了.NET,java(andriod),iOS都同一套的加密算法,下面就分享给大家. AES加密有多种算法模式,下面提供两套模式的可用源码. 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一.CBC(Cipher Block Chaining,加密块链)模式 是一种循

常见的加密和解密算法—AES

一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一. Rijndae

iOS之AES加密解密

//AES加密解密#import <CommonCrypto/CommonCrypto.h>#import <CommonCrypto/CommonDigest.h> //AES128位加密 base64编码 注:kCCKeySizeAES128点进去可以更换256位加密 -(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key { char keyPtr[kCCKeySizeAES128+1];//

JAVA实现AES的加密和解密算法

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

没有绝对安全的系统:写在AES 256破解之后

NULL 在理论上,理论和实践是一致的.在实践中,呵呵. ——(应该是)爱因斯坦(说的) (INFO:本文中不会出现公式,请放心阅读) AES 256被破解了? 对于TLNR(Too Long, Not Read)的读者来说,先把答案放在这:是的,但也不尽然. 事件回顾如下:前几日在互联网上转发的一条题为“AES 256加密被破 一套1500元设备5分钟内搞定”的新闻引起了各界的关注.新闻在国内各大媒体转载,热门评论里不乏各种被高赞但实际上并不正确的说法:有说是字典攻击无线信号,和破解AES是两

常见的加密类型及其算法

加密类型 使用算法 基本特性 对称加密 DES(数据加密标准,56位密钥). AES(高级加密标准,128位密钥). 3DES.Blowfish.Twofish.CAST5.IDEA.RC6 加密.解密使用同一个密钥 通常用来加密数据,加解密速度快 密钥过多,管理密钥困难 密钥交换困难 加密:# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext 常用选项: -e:加密 -des3:加密数据时使用的算法,可用# openss

iOS下使用SHA1WithRSA算法加签源码

首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. PE