@vitaliyharchenko

В чем ошибка AES шифрования?

Для работы авторизации в приложении необходимо проводить AES256 дешифровку. Есть аналог на PHP. Не могу отладить до конца работу на Obj C.

Аналог на PHP на SandBox
Код на SandBox

На Objective C выполняю код:

NSString *rndEncoded = @"CzN5txPZjwyfG2/YhQ8ddqpGDIY8meeW2oZL9+Rvbzp4B1UBVsOCsTFqGJ528TfX";
        
        const char *pass_md5 = "92877af70a45fd6a2ed7fe81e1236b78";
        char key1[32];
        for(int i = 0; i < 16; i++){
            int q;
            sscanf(pass_md5 + i * 2, "%02x", &q);
            key1[i] = q;
        }
        for(int i = 16; i < 32; i ++)
            key1[i] = 0;
        
        int iv_size = 16;
        
        NSMutableData *ciphertext_dec_data = [[NSMutableData alloc] initWithBase64EncodedString:rndEncoded options:0];

        NSInteger ciphertext_length = ciphertext_dec_data.length;

        NSRange iv_dec_range = NSMakeRange(0, iv_size);
        NSData *iv_dec_data = [ciphertext_dec_data subdataWithRange:iv_dec_range];
        
        NSRange ciphertext_dec_range = NSMakeRange(iv_size, ciphertext_length - iv_size);
        NSData *ciphertext_dec = [ciphertext_dec_data subdataWithRange:ciphertext_dec_range];
       
        NSData *key = [NSData dataWithBytes:key1 length:32];
        NSData *iv = iv_dec_data;
        NSData *data = ciphertext_dec;
        
        NSMutableData *cipherData = [NSMutableData dataWithLength:32];
        size_t outLength;
        
        CCCryptorStatus result
        = CCCrypt(kCCDecrypt, // operation, replace with kCCDecrypt to decrypt
                  kCCAlgorithmAES128, // Same as MCRYPT_RIJNDAEL_256
                  kCCOptionECBMode , // CBC mode
                  key1, // key
                  16, // Since you are using AES256
                  iv.bytes,// iv
                  data.bytes, // dataIn
                  data.length, // dataInLength,
                  cipherData.mutableBytes, // dataOut
                  cipherData.length, // dataOutAvailable
                  &outLength); // dataOutMoved
        if (result == kCCSuccess) {            
            NSString *resultString = [cipherData base64Encoding];
            NSLog(@"chiperdata length = %lu", (unsigned long)cipherData.length);
            NSLog(@"chiperdata = %@", cipherData);
            NSLog(@"result = %@", resultString);
            NSLog(@"should be = 78f8aceb24b60fb12990397f52a62067");
            NSData *must = [@"78f8aceb24b60fb12990397f52a62067" dataUsingEncoding:4];
            NSLog(@"should bytes = %@", must);
        } else {
            NSLog(@"Crypthor status: %d", result);
        }


В консоль выводил все переменные и сравнивал с пхп побайтово, все совпадает до срабатывания CCCrypt.
result = PAsfj3K66m6tLw3utWl/R5h/NbYPoNDw77QqwdZfWQ0=
should be = 78f8aceb24b60fb12990397f52a62067
result bytes = <3c0b1f8f 72baea6e ad2f0dee b5697f47 987f35b6 0fa0d0f0 efb42ac1 d65f590d>
must bytes= <37386638 61636562 32346236 30666231 32393930 33393766 35326136 32303637>


Получаю на выходе: "PAsfj3K66m6tLw3utWl/R5h/NbYPoNDw77QqwdZfWQ0="
А должно быть:
"78f8aceb24b60fb12990397f52a62067"

В чем ошибка? Подскажите, пожалуйста.
  • Вопрос задан
  • 2427 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
Что ж я постоянно в комменты-то пишу?! :-(

В приведенном коде - kCCOptionECBMode, а в PHP - CBC режим.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы