- (NSData *)AES256EncryptWithKey:(NSString *)key//加密
{
//AES的密钥长度256字节
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCKeySizeAES256+1];
memset(ivPtr, 0, sizeof(ivPtr));
[APP_PUBLIC_IV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
//密文的长度
NSUInteger dataLength = [self length];
//密文长度+补位长度
size_t bufferSize = dataLength + kCCKeySizeAES256;
//为加密结果开辟空间
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
/* kCCDecrypt:加密/解密
* kCCAlgorithmAES128:加密方式
* kCCOptionPKCS7Padding | kCCOptionECBMode:工作模式
* keyPtr:UTF-8格式的key
* kCCKeySizeAES256:按32位长度解密
* iv:私钥
* [self bayes]:密文
* ...
*/
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCKeySizeAES256,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key//解密
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCKeySizeAES256+1];
memset(ivPtr, 0, sizeof(ivPtr));
[APP_PUBLIC_IV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCKeySizeAES256;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCKeySizeAES256,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}