У меня есть некоторые методы класса шифрования и дешифрования в моем приложении. Я могу шифровать «данные», используя «ключ», и он отлично работает. Я могу записать эти данные на диск, а затем прочитать данные позже с помощью приложения и вызвать decryptWithKey для дешифрования блока данных. Все отлично работает. Однако, если я включу этот файл класса .m в другое приложение, скомпилируйте это приложение и попытайтесь расшифровать те же самые данные, которые были зашифрованы с помощью первого приложения, вызов CCCrypt (расшифровка) завершился неудачно ... ну, а не точно, он возвращает Success но данные не дешифруются. Я сравнил данные и ключевые значения в обоих приложениях, и они идентичны, вплоть до байта.Ошибка 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);
}
Обратите внимание, что приведенный выше код крайне небезопасен (подробнее см. Http://robnapier.net/blog/aes-commoncrypto-564). «18 * dataInLength» также очень странно. В лучшем случае это должно быть 'dataInLength + 16', но это должно все еще работать (оно слишком велико). Странно, что вы шифруете необработанные данные, но затем планируете расшифровать строку ASCII (даже не UTF-8). Когда вы говорите, что дешифрование завершилось с ошибкой, 'numBytesEncrypted' больше 0? Возможно, преобразование% s ASCII не выполняется (хотя тогда вы должны получить мусор). Когда вы говорите «не расшифровать», каков фактический симптом? –
после выполнения CCCrypt (kCCDecrypt), numBytesEncrypted (который должен быть переименован в numBytesDecrypted), равен 0, szPlainText пуст, а result = 0/kCCSuccess. – WebDrive
Я уже несколько раз заглядывал, и похоже, что это может иметь какое-то отношение к приложению «A», приложение Encrypting, предназначено для OSX 10.7 deploy/baseSDK и приложения «B», приложение для дешифрования, предназначено для развертывания OSX 10.9/BaseSDK; @RobNapier, может ли это вызвать проблемы? – WebDrive