Я стучал головой о стену с этим. Мне нужно закодировать приложение для iPhone, чтобы зашифровать 4-значный «контакт» с помощью 3DES в режиме ECB для передачи в веб-сервис, который, как мне кажется, написан на .NET.iPhone 3GES шифрование длина ключа вопрос
+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
bzero(keyBuffer, sizeof(keyBuffer)); // fill with zeroes (for padding)
[key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
size_t returnLength = ([encryptData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
// NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
char* returnBuffer = malloc(returnLength * sizeof(uint8_t));
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
keyBuffer, kCCKeySize3DES, nil,
[encryptData bytes], [encryptData length],
returnBuffer, returnLength,
&numBytesEncrypted);
if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR");
else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL");
else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE");
else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT");
else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR");
else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED");
if(ccStatus == kCCSuccess) {
NSLog(@"TripleDESEncryptWithKey encrypted: %@", [NSData dataWithBytes:returnBuffer length:numBytesEncrypted]);
return [NSData dataWithBytes:returnBuffer length:numBytesEncrypted];
}
else
return nil;
} }
Я получаю значение, зашифрованное с использованием вышеуказанного кода, однако оно не соответствует значению веб-службы .NET.
Я считаю, что проблема заключается в том, что ключ шифрования, который я предоставил разработчикам веб-сервисов, составляет 48 символов.
Я вижу, что константа iPhone SDK «kCCKeySize3DES» равна 24. Поэтому я SUSPECT, но не знаю, что вызов API commoncrypto использует только первые 24 символа предоставленного ключа.
Это правильно?
Есть ли способ, которым я могу получить это, чтобы создать правильный зашифрованный вывод? Я выдаю байты данных из шифрования PRIOR в base64, кодируя его, и попытался сопоставить его с теми, которые генерируются из .NET-кода (с помощью .NET-разработчика, который отправил мне массив байтов). Не соответствуют ни закодированный байтовый массив, не содержащий base64, ни конечные строки с кодировкой base64.
Спасибо Томасу за подробный ответ здесь. Понятия, о которых вы говорите, - это именно то, что я подробно рассмотрел в деталях. Мне повезло, что у меня был доступ к .NET-версии кода шифрования, и это дало мне ценные указатели. 4-значный PIN-код был преобразован в 8-значное значение для подачи в алгоритм 3DES путем добавления 4 0. Я добавил свой код к этому ответу, но обозначил его как решение, потому что ваши знания были абсолютно правильными. –