Расшифровка RC2 с использованием CCCrypt - PullRequest
2 голосов
/ 02 сентября 2010

Я пытаюсь расшифровать данные 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...