Расшифровка RC2 с использованием CCCrypt
Я пытаюсь расшифровать данные RC2 только с 64 эффективными битами.
Поскольку я могу иметь только 64-битные, я понимаю, что перед вызовом CCCrypt
Я должен использовать метод, чтобы уменьшить ключ до этого количества бит. Поскольку я не смог найти такой метод в библиотеке Apple CommonCrypto, я использую этот метод определения ключей, который я нашел.
Это параметры метода:
void rc2_keyschedule( unsigned short xkey[64],
const unsigned char *key,
unsigned len,
unsigned bits )
Для фактической части расшифровки я пытаюсь отработать пример, который использует AES 256. Это то, что я до сих пор:
// setup the key to send to CCCrypt
unsigned char originalKey[16] = /* derived from some other method */;
unsigned short key[64];
unsigned effectiveBits = 64;
rc2_keyschedule(key, originalKey, 16, effectiveBits);
// key is now 128 bytes, and I manually checked it for accuracy
// setup the cipherText to send to CCCrypt
NSData *cipherText = /* derived from some other method */;
// cipherText was manually checked for accuracy
// setup the buffer to send to CCCrypt
size_t bufferSize = [cipherText length] + kCCBlockSizeRC2;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
// call CCCrypt
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmRC2,
kCCOptionPKCS7Padding,
key, 128,
NULL /* initialization vector (optional) */,
[cipherText bytes], [cipherText length],
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
Когда я запускаю это, cryptStatus
имеет значение kCCDecodeError
который задокументирован как:
@constant kCCDecodeError Входные данные не были правильно декодированы или расшифрованы.
Причина я посылаю 128
как keyLength
в CCCrypt
потому что мой ключ длиной 64 коротких целых, и я считаю, что 1 короткое равно 2 байта. Таким образом, 64 * 2=128
,
Я понятия не имею, что мне нужно отправить для варианта. Я просто использовал kCCOptionPKCS7Padding
который был взят из примера AES. Другие доступные варианты kCCOptionECBMode
а также CBC
, Когда я пробую другие два варианта, cryptStatus
становится kCCSuccess
, но данные всегда null
, Я думаю, что это ошибочно сообщает об успехе.
Когда я говорю, что "что-то проверял вручную на точность", я имею в виду, что сравнивал ключ и шифр в тех точках с реализацией JavaScript, которая работает успешно.
Как я могу использовать библиотеки Apple (т.е. CommonCrypt) для расшифровки данных RC2?