Я просто кодирую базовые методы «шифрования» и «дешифрования» для AES на iPhone, используя CCrypt.
Я провел несколько тестов и был действительно поражен, обнаружив, что иногда, если вы пытаетесь расшифровать зашифрованный текст с помощью ключа, отличного от того, который использовался для шифрования обычного текста, CCrypt не возвращает никаких ошибок.
Вот пример:
- (void) testDecryptTextWithTheWrongKey {
NSData *encryptKey = [Base64 decodeBase64WithString:@"+LtNYThpgIlQs2CaL00R6AuG2C/i6U1Vt1+6wfFeFMk="];
NSData *decryptKey = [Base64 decodeBase64WithString:@"yg7BvhM8npVGpAFpAESDn3IRWpe6qeQWaa1rwHiTsyU="];
NSString *plainText = @"The text to be encrypted";
NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSData *encrypted = [LocalCrypto encryptText:plainTextData key:encryptKey error:&error];
assertThat(error, nilValue());
assertThat(encrypted, notNilValue());
error = nil;
NSData *decrypted = [LocalCrypto decryptText:encrypted key:decryptKey error:&error];
assertThat(error, notNilValue());
assertThat(decrypted, nilValue());
}
Мои методы шифрования и дешифрования, определенные в LocalCrypto, просто вызывают внутренний метод «executeCryptoOperation», указывающий, что они хотят зашифровать или расшифровать:
+ (NSData *) executeCryptoOperation:(CCOperation)op key:(NSData *) key input:(NSData *) input error:(NSError **)error {
size_t outLength;
NSMutableData *output = [NSMutableData dataWithLength:input.length + kCCBlockSizeAES128];
CCCryptorStatus result = CCCrypt(op, // operation
kCCAlgorithmAES128, // Algorithm
kCCOptionPKCS7Padding | kCCOptionECBMode, // options
key.bytes, // key
key.length, // keylength
nil, // iv
input.bytes, // dataIn
input.length, // dataInLength,
output.mutableBytes, // dataOut
output.length, // dataOutAvailable
&outLength); // dataOutMoved
if (result == kCCSuccess) {
output.length = outLength;
} else {
*error = [NSError errorWithDomain:kCryptoErrorDomain code:result userInfo:nil];
return nil;
}
return output;
}
Что ж, мой вопрос: нормально ли, что CCrypt возвращает kCCSuccess, когда мы пытаемся расшифровать зашифрованный текст ключом, отличным от того, который использовался во время шифрования? Я что-то упускаю или делаю что-то не так?
Это правда, что даже когда CCrypt возвращает успех для расшифровки, я не могу получить правильную NSString из результирующих данных, но я определенно ожидаю, что CCrypt вернет какую-то ошибку в этой ситуации (как, вероятно, сделал бы Java).
Если это нормальное поведение, как я должен узнать, вернула ли операция дешифрования настоящий простой текст или просто набор байтов, которые не имеют никакого смысла?
Здесь есть аналогичный вопрос, но ответ меня не очень убеждает: Возврат неверного текста расшифровки при использовании недопустимого ключа
Спасибо!