我的应用程序中有一些加密和解密类方法。我可以使用“密钥”对“数据”进行加密,效果很好。我可以将该数据写入磁盘,然后使用该应用程序稍后读取数据并调用decryptWithKey来解密数据块。一切都很好。但是,如果我将此.m类文件包含到另一个应用程序中,编译该应用程序并尝试解密用第一个应用程序加密的相同数据,则CCCrypt(解密)调用失败...好吧,不完全是,它返回成功但数据未解密。我比较了两个应用程序中的数据和键值,它们是相同的,直到字节。
有什么想法吗?
+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero( keyPtr1, sizeof(keyPtr1) ); // fill with zeroes (for padding)
[key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
size_t dataInLength = [data length];
size_t dataOutLength = 18*dataInLength;
[data setLength:dataOutLength];
result = CCCrypt( kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
(const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */,
[data mutableBytes], dataInLength, /* input */
[data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted );
[data setLength:numBytesEncrypted];
}
@catch (NSException *exception)
{
WDCATCH(exception);
}
return ( result == kCCSuccess );
}
+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key
{
CCCryptorStatus result = kCCSuccess;
@try
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
char szPlaintext[1024]={0};
bzero( keyPtr, sizeof(keyPtr) ); // fill with zeroes (for padding)
[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding];
size_t numBytesEncrypted = 0;
result = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
(const void*)keyPtr, kCCKeySizeAES256,
0 /* initialization vector (optional) */,
[data mutableBytes], [data length], /* input */
szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */
&numBytesEncrypted );
if (result == kCCSuccess)
{
szPlaintext[numBytesEncrypted] = 0;
*plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext];
}
}
@catch (NSException *exception)
{
WDCATCH(exception);
} return ( result == kCCSuccess );
}
答案 0 :(得分:0)
我不是Objective-C专家,但char szPlaintext[1024]={0};
decryptWithKey
对我来说似乎非常可疑。首先分配1024个字节,然后将指针指定给包含元素0
的数组? plaintext
作为字符串的生成看起来也很可疑,但它可能适用于ASCII编码的明文(?)。