Iphone iOS 5:数据加密AES-256 EncryptWithKey:未找到
问题是关于iOS5应用程序。我有一个视图控制器,其中有一些UITextFields。 我想用AES-256加密数据 事实上,我不知道我必须添加哪些先决条件包来进行加密和解密。我已经浏览了其他帖子,但是太多的解释把事情搞砸了 请告诉我使用AES-256加密数据必须包含的内容和所有包、头文件Iphone iOS 5:数据加密AES-256 EncryptWithKey:未找到,iphone,ios,ios5,Iphone,Ios,Ios5,问题是关于iOS5应用程序。我有一个视图控制器,其中有一些UITextFields。 我想用AES-256加密数据 事实上,我不知道我必须添加哪些先决条件包来进行加密和解密。我已经浏览了其他帖子,但是太多的解释把事情搞砸了 请告诉我使用AES-256加密数据必须包含的内容和所有包、头文件 钱德拉是指以下类别 常见问题解答:什么是类别 简而言之,Cocoa API添加了该方法。简单地扩展类 更多信息 文件新Cocoa Touch-目标-C类别 如果您想使用类别,您的类将添加一个#import“
钱德拉是指以下类别 常见问题解答:什么是类别 简而言之,Cocoa API添加了该方法。简单地扩展类 更多信息 文件新Cocoa Touch-目标-C类别 如果您想使用类别,您的类将添加一个#import“NSData+Encryption.h” //NSData+Encryption.h
@interface NSData (Encryption)
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey:(NSString *)key;
@end
//NSData+Encryption.m
#import "NSData+Encryption.h"
#import <CommonCrypto/CommonCryptor.h>
@implementation NSData (Encryption)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
#导入“NSData+Encryption.h”
#进口
@实施NSData(加密)
-(NSData*)AES256EncryptWithKey:(NSString*)密钥{
//AES256的“键”应为32字节,否则将填充为空
char keyPtr[kCCKeySizeAES256+1];//为终止符预留的空间(未使用)
bzero(keyPtr,sizeof(keyPtr));//用零填充(用于填充)
//获取关键数据
[key-getCString:keyPtr-maxLength:sizeof(keyPtr)编码:NSUTF8StringEncoding];
NSU整数数据长度=[自身长度];
//参见文档:对于分组密码,输出大小将始终小于或
//等于输入大小加上一个块的大小。
//这就是为什么我们需要在这里添加一个块的大小
size\u t bufferSize=dataLength+kccblocksizeaaes128;
void*buffer=malloc(bufferSize);
大小\u t numBytesEncrypted=0;
CCCryptorStatus cryptStatus=CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*初始化向量(可选)*/,,
[self bytes],数据长度,/*输入*/
缓冲区,缓冲区大小,/*输出*/
&(未加密);
if(cryptStatus==kCCSuccess){
//返回的NSData拥有缓冲区的所有权,并在释放时释放缓冲区
返回[NSData DATAFTHBYTESNOCOPY:缓冲区长度:numBytesEncrypted];
}
释放(缓冲区);//释放缓冲区;
返回零;
}
-(NSData*)AES256DecryptWithKey:(NSString*)密钥{
//AES256的“键”应为32字节,否则将填充为空
char keyPtr[kCCKeySizeAES256+1];//为终止符预留的空间(未使用)
bzero(keyPtr,sizeof(keyPtr));//用零填充(用于填充)
//获取关键数据
[key-getCString:keyPtr-maxLength:sizeof(keyPtr)编码:NSUTF8StringEncoding];
NSU整数数据长度=[自身长度];
//参见文档:对于分组密码,输出大小将始终小于或
//等于输入大小加上一个块的大小。
//这就是为什么我们需要在这里添加一个块的大小
size\u t bufferSize=dataLength+kccblocksizeaaes128;
void*buffer=malloc(bufferSize);
大小\u t numBytesDecrypted=0;
CCCryptorStatus cryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*初始化向量(可选)*/,,
[self bytes],数据长度,/*输入*/
缓冲区,缓冲区大小,/*输出*/
&不加密);
if(cryptStatus==kCCSuccess){
//返回的NSData拥有缓冲区的所有权,并在释放时释放缓冲区
返回[NSData DATAFTHBYTESNOPY:缓冲区长度:numbytes加密];
}
释放(缓冲区);//释放缓冲区;
返回零;
}
@结束
检查此问题:@Adam:未列出要包含的包和头文件。此答案提供了完整的解决方案:它是否智能,或者是否有一种方法可以直接使用nsstrings来实现这一点,而不涉及nsdata?我对此解决方案印象深刻。