Intereting Posts
iOS UITableViewCell не отображается правильно, кроме индикатора раскрытия Основные данные, применяющие правило удаления при обновлении Строковые символы (метки) не учитываются корректно CoreData: ошибка – сущность не является идентификатором, совместимым с кодировкой ключа Ошибка Apple Mach-O Linker на DetailViewController При сбое приложения / двойного нажатия NSBluetoothPeripheralUsageDescription не используется Как установить цвет фона для сцены? Повторное включение зеркалирования на iOS Нужен ли мне сервер для создания статического Passbook, почему бы не сделать это локально в приложении? Как сделать UITextField полной ширины в Swift Как я могу рассчитать GPS DoP (Dilution of Precision) с помощью данных датчиков iPhone? При использовании подкласса UIActivityItemProvider не доступны никакие действия с акциями Асинхронная загрузка и UITableView -reloadData push-уведомление не работает в бакалейном магазине

Шифрование AES в iOS и Java

Я новичок в этом шифровании. Я создаю приложение для android и iOS, в которых я должен шифровать (используя AES Encryprtion) файл на стороне сервера и расшифровывать на стороне клиента как в iOS, так и в Android-приложении. Я получил код в Интернете, чтобы выполнить шифрование и расшифровку AES для Android и iOS, они работают нормально. На стороне сервера они используют java. Но проблема в Java Encrypted File не может быть расшифрована программой iOS, даже я получил тот же файлize, но файл не в правильном формате. Я отправил код ниже …

Шифрование и расшифровка Java:

public static byte[] encrypt(byte[] data, byte[] key, byte[] ivs) { try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); byte[] finalIvs = new byte[16]; int len = ivs.length > 16 ? 16 : ivs.length; System.arraycopy(ivs, 0, finalIvs, 0, len); IvParameterSpec ivps = new IvParameterSpec(finalIvs); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps); return cipher.doFinal(data); } catch (Exception e) { e.printStackTrace(); } return null; } public static byte[] decrypt(byte[] data, byte[] key, byte[] ivs) { try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); byte[] finalIvs = new byte[16]; int len = ivs.length > 16 ? 16 : ivs.length; System.arraycopy(ivs, 0, finalIvs, 0, len); IvParameterSpec ivps = new IvParameterSpec(finalIvs); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivps); return cipher.doFinal(data); } catch (Exception e) { e.printStackTrace(); } return null; } 

Код iOS для расшифровки:

 - (NSData *) decryptFile:(NSString *)key withData:(NSData *)fileData { char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); NSString* iv = @"12345678"; [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [fileData length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128, iv /* initialization vector (optional) */, [fileData bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); //free the buffer; return nil; } 

Дайте мне какое-либо решение или предложение по этой проблеме

Проблема связана с параметром iv .

1) Вы передаете NSString* как iv . Вероятно, вы захотите передать фактические байты.

2) Длина iv должна быть 16 (в данном случае) в соответствии с api docs CCCrypt. См. Ссылку ниже:

http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h