我正在尝试仅使用 64 个有效位来解密 RC2 数据。
由于我只能拥有 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 输入数据未正确解码或解密。
我发送to128
的原因是因为我的密钥长度为 64 个短整数,我相信 1 个短整数等于 2 个字节。因此,.keyLength
CCCrypt
64 * 2=128
我不知道我需要为该选项发送什么。我刚刚使用kCCOptionPKCS7Padding
了取自 AES 示例的内容。其他可用选项是kCCOptionECBMode
和CBC
。当我尝试其他两个选项时,cryptStatus
确实变为kCCSuccess
,但数据始终为null
. 我认为它错误地报告了成功。
当我说我“手动检查某些内容的准确性”时,我的意思是我将这些点的密钥和密码与成功运行的 JavaScript 实现进行了比较。
如何使用 Apple 的库(即 CommonCrypt)解密 RC2 数据?