Czy ktoś może wskazać mi właściwy kierunek, aby móc zaszyfrować ciąg, zwracając inny ciąg z zaszyfrowanymi danymi? (Próbowałem z szyfrowaniem AES256.) Chcę napisać metodę, która wymaga dwóch wystąpień NSString, z których jedna to wiadomość do zaszyfrowania, a druga to „hasło” do zaszyfrowania - podejrzewam, że musiałbym wygenerować klucz szyfrowania z kodem dostępu, w sposób, który można odwrócić, jeśli kod dostępu jest dostarczany z zaszyfrowanymi danymi. Metoda powinna następnie zwrócić NSString utworzony z zaszyfrowanych danych.
Wypróbowałem technikę opisaną w pierwszym komentarzu do tego postu , ale jak dotąd nie miałem szczęścia. CryptoExercise firmy Apple z pewnością ma coś, ale nie mogę tego zrozumieć ... Widziałem wiele odniesień do CCCrypt , ale zawiodło w każdym przypadku, gdy z niego korzystałem.
Musiałbym także być w stanie odszyfrować zaszyfrowany ciąg, ale mam nadzieję, że jest to tak proste, jak kCCEncrypt / kCCDecrypt.
Odpowiedzi:
Ponieważ nie opublikowałeś żadnego kodu, trudno jest dokładnie określić, jakie problemy napotykasz. Jednak post na blogu, do którego prowadzi łącze, wydaje się działać całkiem przyzwoicie ... poza dodatkowym przecinkiem w każdym wywołaniu,
CCCrypt()
który powodował błędy kompilacji.Późniejszy komentarz do tego posta zawiera dostosowany kod , który działa dla mnie i wydaje się nieco prostszy. Jeśli dołączysz ich kod dla kategorii NSData, możesz napisać coś takiego: (Uwaga:
printf()
wywołania służą tylko do zademonstrowania stanu danych w różnych punktach - w prawdziwej aplikacji nie ma sensu drukować takich wartości .)Biorąc pod uwagę ten kod i fakt, że zaszyfrowane dane nie zawsze będą ładnie przekładać się na NSString, wygodniejsze może być napisanie dwóch metod, które zawijają potrzebną funkcjonalność, do przodu i do tyłu ...
To zdecydowanie działa w systemie Snow Leopard, a @Boz informuje, że CommonCrypto jest częścią Core OS na iPhonie. Zarówno 10.4, jak i 10.5 mają
/usr/include/CommonCrypto
, chociaż 10.5 ma stronęCCCryptor.3cc
podręcznika dla, a 10.4 nie, więc YMMV.EDYCJA: Zobacz to pytanie uzupełniające dotyczące używania kodowania Base64 do reprezentowania zaszyfrowanych bajtów danych jako ciągu (w razie potrzeby) przy użyciu bezpiecznych, bezstratnych konwersji.
źródło
autorelease
.Złożyłem zbiór kategorii dla NSData i NSString, który wykorzystuje rozwiązania znalezione na blogu Jeffa LaMarche i kilka wskazówek Quinna Taylora tutaj na Stack Overflow.
Używa kategorii, aby rozszerzyć NSData, aby zapewnić szyfrowanie AES256, a także oferuje rozszerzenie NSString do bezpiecznego szyfrowania danych BASE64 na łańcuchy.
Oto przykład pokazujący użycie do szyfrowania ciągów:
Pobierz pełny kod źródłowy tutaj:
Dzięki za wszystkie pomocne wskazówki!
-- Michael
źródło
@owlstead, jeśli chodzi o twoją prośbę o „kryptograficznie bezpieczny wariant jednej z podanych odpowiedzi”, zobacz RNCryptor . Został zaprojektowany, aby robić dokładnie to, o co prosisz (i został zbudowany w odpowiedzi na problemy z kodem wymienionym tutaj).
RNCryptor używa PBKDF2 z solą, zapewnia losowy IV i dołącza HMAC (również generowany z PBKDF2 z własną solą. Obsługuje działanie synchroniczne i asynchroniczne.
źródło
Czekałem trochę na @QuinnTaylor, aby zaktualizować jego odpowiedź, ale ponieważ tego nie zrobił, oto odpowiedź nieco jaśniejsza i w taki sposób, że załaduje się na XCode7 (i być może większy). Użyłem tego w aplikacji Cocoa, ale prawdopodobnie będzie działać dobrze również z aplikacją na iOS. Nie ma błędów ARC.
Wklej przed jakąkolwiek sekcją @implementation w pliku AppDelegate.m lub AppDelegate.mm.
Wklej te dwie funkcje w wybranej klasie @implementation. W moim przypadku wybrałem @implementation AppDelegate w moim pliku AppDelegate.mm lub AppDelegate.m.
źródło
dataWithBytesNoCopy
po prostu przydziel obiektNSMutableData
withdataWithLength
i użyjmutableBytes
właściwości wskaźnika bajtów, a następnie zmień rozmiar, ustawiając jegolength
właściwość. 3. Bezpośrednie użycie łańcucha do szyfrowania jest bardzo niebezpieczne, należy użyć klucza pochodnego, takiego jak utworzony przez PBKDF2.keyData.length = kCCKeySizeAES256;
.https://github.com/muneebahmad/AESiOSObjC
źródło