2009-09-13 13 views
15

Mam aplikację na iPhone'a, która szyfruje wprowadzony NSString za pomocą CCCrypt (AES256) i klucza zwykłego tekstu. Łańcuch i klucz są podane w metodzie szyfrowania, która zwraca obiekt NSData.Zaszyfrowane NSData do NSString w obj-c?

Żądanie [opis danych] gdzie „dane” jest zaszyfrowane dane ciąg daje NSString jak: „< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>”, ale gdy próbuję przekonwertować do NSString, otrzymuję „(zero)".

Muszę zwrócić NSString do użytkownika, który może być użyty do odszyfrowania z powrotem do oryginalnego ciągu za pomocą tego samego klucza tekstowego. Jeśli właściwość 'description' obiektu NSData może zwrócić ciąg znaków, czy istnieje sposób, w jaki mogę wygenerować NSString z obiektu NSData bez uzyskania "(null)"?

AKTUALIZACJA: Podziękowania dla Quinna, który sugeruje użycie kodowania Base64 w celu utworzenia splątanego łańcucha. Z tego co rozumiem, kodowanie Base64 nie polega jedynie na zamianie znaków, ale wymiana znaków zależy od pozycji, więc to jest w porządku.

Moim jedynym zmartwieniem jest to, że chcę móc zaszyfrować wiadomość za pomocą "hasła" i wymagać podania identycznego hasła, gdy rozmyty łańcuch musi zostać zdekodowany - czy ktoś może zaproponować sposoby wdrożenia tego?

+0

Zaktualizowałem swoją odpowiedź pod adresem podanym poniżej. Masz rację, Base64 nie jest algorytmem zastępowania - w zasadzie rozszerza 3 bajty do 4 bajtów, więc zakodowane dane są 1,37x tak duże, jak ich niekodowany odpowiednik. Zasadniczo zajmuje 3 porcje 8-bitowe i redivides go na 4 6-bitowe porcje, a następnie reinterpretuje każdy z nich jako 8-bitowe kawałki, które mogą być łatwo reprezentowane w ASCII. Wikipedia ma więcej szczegółów. –

Odpowiedz

32

Po pierwsze, NIE używaj do tworzenia NSString do takich celów. (Najlepiej traktować -description jako debugowania. Przepraszam jeśli my previous answer zwieść cię, ja po prostu wydrukować opis, aby wykazać, że NSData mogą być szyfrowane i odszyfrowywane). Zamiast tego należy użyć -dataUsingEncoding: i -initWithData:encoding: metody NSString do konwersji między NSData i NSString. Nawet z tymi, zauważ, że dane zaszyfrowane za pomocą algorytmu AES prawdopodobnie nie przełożą się na łańcuchy tak jak są - niektóre sekwencje bajtowe po prostu nie będą ładnie odtwarzane, więc dobrze jest zakodować dane przed utworzeniem łańcucha.

Proponuję wypróbować Base64 encoding NSData, ponieważ dane Base64 zawsze mogą być reprezentowane jako ciąg znaków ASCII. (Oczywiście, jeśli to zrobisz, będziesz mieć do dekodowania od Base64 przed odszyfrowania.)

Oto kilka przydatnych zasobów ...


Edit: byłem zakładając chcesz połączyć to z moją odpowiedź do your previous question szyfrowania AES obiektów NSString. Kodowanie danych jako Base64 nie nakłada żadnych ograniczeń na same dane - z pewnością może to być samo szyfrowanie danych AES. Oto co należy zrobić, jeśli chcesz po prostu ciąg wejście i wyjście:

  • Encryption
    • Zapewnić NSString być szyfrowane, a hasło do użycia do szyfrowania.
    • Konwertuj ciąg znaków na NSData i wykonaj na nim szyfrowanie AES (patrz poprzednie pytanie).
    • Base64 koduje NSData, a następnie tworzy i zwraca NSString zakodowanego wyjścia.
  • Rozszyfrowanie
    • podać zaszyfrowane i zakodowany ciąg znaków, a hasło do użycia dla odszyfrowania.
    • Utwórz NSData z pierwszego ciągu, a następnie Base64 - dekoduj dane.
    • Wykonaj deszyfrowanie AES danych, a następnie utwórz i zwróć NSString.

To naprawdę tylko kwestia łączenia dwóch części razem i wykonując je w odwrotnej kolejności na drodze. Z mojej poprzedniej odpowiedzi można zmodyfikować encryptString:withKey:, aby wykonać ostatni krok i zwrócić ciąg znaków, a następnie zmienić decryptData:withKey: na decryptString:withKey: i zaakceptować dwa ciągi. To całkiem proste.

+3

+1 i dzięki za link do NSDataAdditions, bardzo przydatne! –

+0

@FreeAsInBeer Proszę nie oznaczaj odpowiedzi innych osób jako społeczności Wiki podczas ich edycji. To nie jest to, do czego służy. –

+0

@QuinnTaylor Najczęściej zadawane pytania stanowią, że jesteś jedynym, który ma konkretny dostęp do pola wyboru Community Wiki. Moja edycja mogła przypadkowo spowodować przejście do trybu wiki społeczności, ale było to całkowicie nieumyślne. Proszę nie oskarżać innych ludzi o robienie rzeczy, których nie mogą zrobić. [Referencja] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

Połączyłem kompletny zestaw kategorii dla NSData i NSString, aby zapewnić szyfrowanie AES256 dla łańcuchów.

Aby uzyskać więcej informacji, zobacz "oryginalne" pytanie na stronie my answer.