AES256加密/解密错误+ IOS SDK 7 [英] AES256 Encryption/Decryption Error+ IOS SDK 7

查看:339
本文介绍了AES256加密/解密错误+ IOS SDK 7的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用AES256的安全性和存储数据的加密形式,这在IOS 6及更低版本中正常工作,但是当我在IOS 7中测试了我的应用程序时,我没有收到我之前存储的数据。调试之后,我发现解密不起作用是IOS 7并返回空白。



我的代码如下:



<$ (NSData *)AES256DecryptWithKey:(NSString *)键{
//'key'应为AES256的32个字节,否则为零填充

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,
keyPtr,kCCKeySizeAES256,
NULL / *初始化向量(可选)* /,
[self bytes],dataLength, * input * /
buffer,bufferSize,/ * output * /
& numBytesDecrypted);
if(cryptStatus == kCCSuccess){
//返回的NSData取得缓冲区的所有权,并在释放后释放
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //释放缓冲区;
return nil;

}



在IOS 7中再次获取我的数据?



谢谢

解决方案

找到关于 Apple Devforums 上的此问题的解决方案。

   - (NSData *)encrypt:(NSString *)key {
//'key'应该是32字节对于AES256,将以零填充方式
char keyPtr [kCCKeySizeAES256 + 1]; //用于终结器的空间(未使用)
bzero(keyPtr,sizeof(keyPtr)); //填充零(用于填充)

BOOL patchNeeded =([key length]> kCCKeySizeAES256);
if(patchNeeded){
key = [key substringToIndex:kCCKeySizeAES256]; //确保该键不再长于需要的(kCCKeySizeAES256)
}

//获取密钥数据
[key getCString:keyPtr maxLength:sizeof(keyPtr)encoding :NSUTF8StringEncoding];

if(patchNeeded){
keyPtr [0] ='\0'; //以前的iOS版本比iOS7设置第一个字符为'\0',如果键长于kCCKeySizeAES256
}

NSUInteger dataLength = [self length];

//查看文档:对于块密码,输出大小始终小于或等于输入大小加上一个块的大小。
//这就是为什么我们需要在这里添加一个块的大小
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void * buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL / *初始化向量(可选)* /,
[self bytes],dataLength, * input * /
buffer,bufferSize,/ * output * /
& numBytesEncrypted);
if(cryptStatus == kCCSuccess){
//返回的NSData获取缓冲区的所有权,并在释放后释放它
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer); //释放缓冲区;
return nil;
}

当然,复制粘贴相同的修补程序用于解密方法。 >

I am using AES256 for security and store data in encryption form which is working fine in IOS 6 and below but when i have tested my app in IOS 7, I am not getting my data which was store previously. After debugs, i found decryption is not working is IOS 7 and return blank.

My Code as below:

- (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;

}

Can you please help to get my data again in IOS 7?

Thanks

解决方案

Found the solution on this problem on Apple Devforums.

- (NSData *)encrypt:(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)

 BOOL patchNeeded = ([key length] > kCCKeySizeAES256);
 if (patchNeeded) {
      key = [key substringToIndex:kCCKeySizeAES256]; // Ensure that the key isn't longer than what's needed (kCCKeySizeAES256)
 }

 // fetch key data
 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

 if (patchNeeded) {
      keyPtr[0] = '\0';  // Previous iOS version than iOS7 set the first char to '\0' if the key was longer than kCCKeySizeAES256
 }

 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;
}

Of course, copy paste the same patch for the decrypt method.

这篇关于AES256加密/解密错误+ IOS SDK 7的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆