I zostały łzawienie włosy przez cały dzień próbuje rozwiązać ten ...różnica między iPhone AES (objective-c) i Java
Mam klienta, Objective-C działa na iPhone, podłączenie do Jawy serwer. IPhone szyfruje dane za pomocą AES, ale nie mogę odszyfrować go na serwerze. Używam znanego hasła i komunikatu (pojedynczy ciąg) i generuję tablicę bajtów w telefonie iPhone, generując tablicę bajtów porównania na serwerze Java za pomocą tego samego klucza i komunikatu, ale tablice bajtów są zupełnie inne (i dlatego nie mogą być dekodowane po stronie Java).
Klient korzysta z biblioteki CommonCrypto z następującymi ustawieniami ...
danych jest NSData
przytrzymanie „komunikat” słowo używając dataUsingEncoding:NSASCIIStringEncoding
Klucz jest NSData
trzymając frazę „1234567891123456” ponownie stosując kodowanie jako powyżej. algorytm kCCAlgorithmAES128
Opcje jest kCCOptionsPKCS7Padding
(co wierzę przyrównuje do EBC na serwerze ?!)
Serwer jest za pomocą następującego kodu ...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
ale dane w encryptedData nie pasuje to, co jest generowane w kodzie celu-c, tablice bajtów są zupełnie inne.
Czy ktoś może zobaczyć cokolwiek oczywistego, że robię źle? myślę ustawienia są takie same ... :(
- UPDATE - Zgodnie z życzeniem ....
Ok, więc tutaj jedzie ....
iPhone klient szyfrowanie następującego ciągu "wiadomość" Używa klucza "1234567891123456" Używa wektora inicjalizacyjnego "1010101010101010" Używa AES128, z trybem CBC (o ile wiem) i opcjami kCCOptionsPKCS7Padding
Wynik szyfrowania (z kodowaniem base64) jest UHIYllDFAXl81ZM7OZPAuA ==
Serwer jest zaszyfrowanie ten sam ciąg, z tym samym kluczem i wektorem inicjalizacji. Używa następującej Cipher.getInstance ("AES/CBC/PKCS5Padding");
Wynikiem kodowania (kodowanie base64) jest ALBnFIHysLbvAxjvtNo9vQ ==
Dzięki.
- UPDATE 2 - Zgodnie z życzeniem ...
Oto kod iPhone ....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
kategoria NSData do szyfrowania pochodzi stąd ...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
Nawiasem mówiąc, mam zaznaczone tablice bajtów, które są w toencrypt, pass i iv i dopasować te, które znajdują się na serwerze.
Zmieniono serwer, aby korzystać z EBC zgodnie z sugestią i nadal nie działa. Nawiasem mówiąc zauważyłem serwer używający PKCS5 i klienta używającego PKCS7, ale nie ma 5 dostępnych na kliencie i 7 dostępnych na serwerze, i podobno są one kompatybilne. –
Tak, wypełnienie PKCS7 jest takie samo jak PKCS5Padding. Jeśli zmiana na ECB nie zadziałała, prawdopodobnie iPhone używa trybu CBC. Musisz określić wektor inicjujący i upewnić się, że serwer używa tego samego. – erickson
Dzięki za odpowiedzi. Stworzyłem IV sam na kliencie i na serwerze, ale nadal nie działa. To tutaj brakuje solidnej i niezawodnej biblioteki AES dla iPhone'a! :( –