3DES шифрование с использованием CFB8 и без заполнения в iOS?
Я разрабатываю приложение, которое будет отправлять зашифрованные данные на сервер. Сервер использует 3des с CFB8 и без заполнения. Я прочитал большинство связанных вопросов в stackru, но все еще не могу заставить его работать. Работал над этим в течение нескольких дней, но все еще не смог заставить его соответствовать шифрованию сервера. вот что я попробовал
+ (NSString*) doCipher:(NSString*)plainText operation:(CCOperation)encryptOrDecrypt {
const void *vplainText;
NSData* plainTextData;
size_t plainTextBufferSize;
if (encryptOrDecrypt == kCCDecrypt)
{
NSData *EncryptData =[NSData dataWithBase64EncodedString:plainText];
plainTextBufferSize = [EncryptData length];
vplainText = [EncryptData bytes];
}
else
{
plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
plainTextBufferSize = [plainTextData length];
}
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
uint8_t iv[kCCBlockSize3DES];
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
memset((void *) iv, 0x0, (size_t) sizeof(iv));
const void *vkey = kPrivateKey;
unsigned char IV[8]={0,0,0,0,0,0,0,0};
ccStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithm3DES,
0,
[keyData bytes],
[key length],
IV,
[plainTextData bytes],
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
else if (ccStatus == kCCParamError) return @"PARAM ERROR";
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";
NSString *result;
if (encryptOrDecrypt == kCCDecrypt)
{
result = [[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
}
else
{
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64EncodedString];
}
return result;
}
Похоже на то CCOptions
в настоящее время поддерживает kCCOptionPKCS7Padding
а также kCCOptionECBMode
Как добиться 3des с CFB8 и без заполнения. Любое предложение будет оценено.
1 ответ
РЕДАКТИРОВАТЬ: Извините; Я пропустил ключевой момент ранее. Вы никогда не просите режим CFB8. По умолчанию используется режим CBC.
Вы не можете использовать CCCrypt()
за это. Вы должны использовать CCCryptorCreateWithMode()
так что вы можете пройти режим. Тогда позвони CCCryptorUpdate()
с данными и CCCryptorFinal()
заканчивать.
Если вы не хотите заполнять, почему вы запрашиваете заполнение? Удалить kCCOptionPKCS7Padding
, Если вы не хотите никаких опций (которые у вас не отображаются), просто передайте 0.
CFB-8 принимает вектор инициализации. Вы установили все 0. Это то, что использует сервер? (Это очень плохой IV; IV для CFB должен быть случайным, а не фиксированным.)
Эти строки опасны:
plainTextBufferSize = [plainText length];
vplainText = (const void *) [plainText UTF8String];
Это обрезает любые многобайтовые строки. Лучшее решение для этого - создать NSData
:
plainTextData = [self.plainText dataUsingEncoding:NSUTF8StringEncoding];
Вы можете использовать bytes
а также length
на plainTextData
,