我正在尝试使用CCCrypt来加密我的数据,但是它有问题,我加密后数据长度发生了变化,但是在解密时没有发生,这里是以下代码。
- (NSData *)AES256EncryptWithKeyGenerateIV:(NSString *)key {
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCKeySizeAES128+1];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5([key UTF8String], strlen([key UTF8String]), result);
NSString* resultString = [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
resultString = [resultString substringToIndex:16];
bzero(ivPtr, sizeof(ivPtr));
[resultString getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
NSLog(@"Before encrypt dataLength is %d",dataLength);
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
0,
keyPtr, kCCBlockSizeAES128,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
NSLog(@"After file encrypted dataLength is %d",numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
以下是我打印数据长度的日志:
2012-07-09 18:29:20.787加密之前dataLength是248
2012-07-09 18:29:20.788文件加密后dataLength为240
2012-07-09 18:29:20.789加密前dataLength为20
2012-07-09 18:29:20.790文件加密后dataLength为16
2012-07-09 18:29:20.792加密之前dataLength是583
2012-07-09 18:29:20.792文件加密后dataLength为576
2012-07-09 18:29:20.795加密之前dataLength是31120
2012-07-09 18:29:20.796文件加密后dataLength为31120
2012-07-09 18:29:20.797加密前dataLength是27551
2012-07-09 18:29:20.798文件加密后dataLength为27536
2012-07-09 18:29:20.800加密之前dataLength是1266
2012-07-09 18:29:20.800文件加密后dataLength为1264
2012-07-09 18:29:20.802加密前dataLength为431315
2012-07-09 18:29:20.809文件加密后dataLength为431312
2012-07-09 18:29:20.815加密之前dataLength是204
2012-07-09 18:29:20.815文件加密后dataLength为192
2012-07-09 18:29:20.817加密之前dataLength是1083
2012-07-09 18:29:20.817文件加密后dataLength为1072
2012-07-09 18:29:20.818加密前dataLength为440
2012-07-09 18:29:20.819文件加密后dataLength为432
有人可以告诉我为什么好吗?
答案 0 :(得分:1)
使用分组密码时必须应用填充,以使纯文本适合密码块。 AES是块密码,使用128位,16字节的块大小。在CCOptions中使用显式填充和CBC模式尝试它,请参阅CCCrypt的Apple文档如何做到这一点(尽管我再次看到了我生活中对加密方法的更好描述)。
[编辑]
注意:尝试kCCOptionPKCS7Padding
,CBC可能是默认值。
答案 1 :(得分:1)
我使用CCCrypt函数对DES进行加密。当要加密的数据长度不是8字节的倍数时,发生错误大小。
所以我按照以下方式处理:
- (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
NSString *ciphertext = nil;
const char *textBytes = [plainText UTF8String];
NSUInteger dataLength = [plainText length];
NSUInteger len1=dataLength % 8;
if(len1!=0)
{
dataLength+=(8-len1);
}
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
Byte iv[] = {0x02, 0x00, 0x01, 0x02, 0x00, 0x06, 0x00, 0x05};
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
NULL,
[key UTF8String], kCCKeySizeDES,
iv,
textBytes, dataLength,
buffer, 1024,
&numBytesEncrypted);
.....
}
然后一切都好!