2013-11-25 10 views
5

Mam aplikację, która pobiera zaszyfrowane wideo w trybie skompresowanym z serwera Java. Po stronie iOS nie mogę tego odszyfrować.Deszyfrowanie plików wideo w systemie iOS

Kod ja użyciem szyfrowania w Javie jest:

// generate a key 
     KeyGenerator keygen = KeyGenerator.getInstance("AES"); 
     keygen.init(128); // To use 256 bit keys, you need the "unlimited strength" encryption policy files from Sun. 
     //byte[] key = keygen.generateKey().getEncoded(); 
     byte key[] = {0x00, 0x01, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 
     SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 


     SecureRandom random = new SecureRandom(); 

     IvParameterSpec ivspec = new IvParameterSpec(key); 

     // initialize the cipher for encrypt mode 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec); 

     System.out.println(); 

     byte[] encrypted = cipher.doFinal(IOUtils.toByteArray(new FileInputStream(new File(fileName)))); 

Mój kod do deszyfrowania w iOS jest następujący:

 char keyPtr[kCCKeySizeAES256+1]; 
bzero(keyPtr, sizeof(keyPtr)); 

[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF16StringEncoding]; 
Byte iv [] = {0x00, 0x01, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

//unsigned char keyPtr[kCCKeySizeAES128] = { 0x00, 0x01, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

NSData *passwordData = [@"[[email protected]" dataUsingEncoding:NSUTF8StringEncoding]; 

size_t numBytesEncrypted = 0; 

NSUInteger dataLength = [self length]; 

size_t bufferSize = dataLength + kCCBlockSizeAES128; 
void *buffer_decrypt = malloc(bufferSize); 

CCCryptorStatus result = CCCrypt(kCCDecrypt , kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
           passwordData.bytes, kCCKeySizeAES256, 
           iv, 
           [self bytes], [self length], 
           buffer_decrypt, bufferSize, 
           &numBytesEncrypted); 
NSLog(@".......decryption...........%d........",result); 
if(result == kCCSuccess) 
    return [NSData dataWithBytesNoCopy:buffer_decrypt length:numBytesEncrypted]; 

Co może być tutaj problem i jak mogę go rozwiązać ?

+1

Co stanie się, gdy spróbujesz odszyfrować? Czy otrzymujesz komunikat o błędzie? Czy otrzymujesz po prostu zły wynik? Bez dodatkowych informacji trudno będzie Ci pomóc w rozwiązaniu tego problemu. –

+0

Nie otrzymuję żadnego błędu podczas odszyfrowywania. ale nie odszyfrowuje danych pliku. – user3030053

+0

Próba odszyfrowania pliku wideo przyniesie pomyślny blok i zwróci dane. ale pobieranie plików jest zaszyfrowane – user3030053

Odpowiedz

3

Hasło nie jest prawidłowa długość kCCAlgorithmAES128, to jest 88 bitów:

NSData *passwordData = [@"[[email protected]" dataUsingEncoding:NSUTF8StringEncoding]; 

Istnieje sprzeczność:

kCCAlgorithmAES128 i kCCKeySizeAES256

klucz deszyfrowania nie jest taka sama jak klucz szyfrowania.
Deszyfrowanie iv nie jest tożsame z szyfrowaniem iv.

Tylko na początek, musisz je poprawić.

Jak pisze @Duncan, zacznij od bardzo prostego przypadku i kiedy to działa, dodaj złożoność. Prostym punktem początkowym jest dokładnie jeden blok danych, brak dopełnienia, prosty klucz prawidłowego rozmiaru, kropka iv wszystkich zer.

Najlepszy zakład: zatrudnić eksperta od domeny, bezpieczeństwo jest bardzo trudne do uzyskania.

+0

Dzięki, teraz działa dobrze, zmieniono 7pad na Bez dopełniania i kluczy do kCCAlgorithmAES128 – user3030053