Каков наилучший метод/подход для шифрования и кодирования base64 строки UTF с максимальным размером 20 байтов в target-c? Я склоняюсь к Blowfish из-за размера блока 8 байт.
Пожалуйста, предоставьте пример кода? Спасибо.
Каков наилучший метод/подход для шифрования и кодирования base64 строки UTF с максимальным размером 20 байтов в target-c? Я склоняюсь к Blowfish из-за размера блока 8 байт.
Пожалуйста, предоставьте пример кода? Спасибо.
Да.
DES, 3DES и Blowfish имеют размер блока 8 байтов, поэтому зашифрованный вывод будет 8 байтов, кодирование Base64 8 байтов приведет к 12 байтам.
AES имеет размер блока 16, поэтому 8 байтов + заполнение будут 16 байтами данных. Кодировка Base64 16 байтов приведет к 24 байтам, поэтому AES не будет работать.
Есть и другие проблемы, такие как режим CBC и iv, хорошая схема будет использовать случайный iv и передавать его с зашифрованным сообщением. Оставшиеся биты в Base64 можно использовать для передачи частичного iv. Но это уже мимо вопроса.
В настоящее время предпочтительным алгоритмом симметричного шифрования является AES. DES больше не рекомендуется для новой работы и имеет несколько известных слабых ключей. Blowfish также не рекомендуется, но многим он нравится и может быть лучше, чем DES.
Вот пример использования 8-байтовых данных с 64-битным ключом и без iv. 3DES можно использовать, заменив константы Blowfish на 3DES и 24-байтовый ключ. Это не рекомендуемое решение, хорошее решение должно учитывать использование, желаемую безопасность, ценность данных и потенциальных злоумышленников, среди прочего, таких как iv и ключ.
+ (NSData *)doCipher:(NSData *)dataIn
iv:(NSData *)iv
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
error:(NSError **)error
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length];
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmBlowfish,
0,
symmetricKey.bytes,
kCCKeySizeMinBlowfish,
nil,
dataIn.bytes, dataIn.length,
dataOut.mutableBytes, dataOut.length,
&cryptBytes);
if (ccStatus == kCCSuccess) {
dataOut.length = cryptBytes;
}
else {
if (error) {
*error = [NSError errorWithDomain:@"kEncryptionError"
code:ccStatus
userInfo:nil];
}
dataOut = nil;
}
return dataOut;
}
Тест: я поместил вышеуказанный метод в имена классов Test
.
uint8_t keyBytes[] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
NSData *key = [NSData dataWithBytes:keyBytes length:8];
uint8_t dateBytes[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
NSData *data = [NSData dataWithBytes:dateBytes length:8];
NSLog(@"data: %@", data);
NSError *error;
NSData *encryptData = [Test doCipher:data iv:nil key:key context:kCCEncrypt error:&error];
NSString *encryptString = [encryptData base64EncodedStringWithOptions:0];
NSLog(@"encryptData: %@", encryptData);
NSLog(@"encryptString: %@", encryptString);
NSData *decryptData = [Test doCipher:encryptData iv:nil key:key context:kCCDecrypt error:&error];
NSLog(@"decryptData: %@", decryptData);
Выход:
data: 01020304 05060708 encryptData: 9e8ec0a8 71ab9d10 encryptString: no7AqHGrnRA= decryptData 01020304 05060708