2009-09-13 4 views
15

J'ai une application iPhone qui crypte un NSString en entrée en utilisant CCCrypt (AES256) et une clé en clair. La chaîne et la clé sont données à la méthode de chiffrement qui renvoie un objet NSData.NSData chiffré à NSString dans obj-c?

Demande [Description des données] où « données » sont les données de chaîne cryptée donne une NSString comme: « < 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a> » mais lorsque je tente de le convertir en un NSString, je reçois « (nul)".

J'ai besoin de renvoyer un NSString à l'utilisateur, qui peut être utilisé pour le décrypter à la chaîne d'origine en utilisant la même clé en clair. Si la propriété 'description' de l'objet NSData peut renvoyer une chaîne, est-il possible de produire un NSString à partir de l'objet NSData sans obtenir "(null)"? MISE À JOUR: Merci à Quinn, qui suggère d'utiliser l'encodage Base64 pour produire la chaîne embrouillée. D'après ce que je comprends, l'encodage Base64 ne permute pas simplement les caractères, mais l'échange de caractères dépend de la position, donc c'est bien. Ma seule préoccupation est que je veux être capable de crypter le message avec un mot de passe et que la phrase secrète identique soit entrée lorsque la chaîne embrouillée doit être décodée - quelqu'un peut-il suggérer des façons de l'implémenter?

+0

J'ai mis à jour ma réponse pour répondre à cette question ci-dessous. Vous avez raison, Base64 n'est pas un algorithme de substitution - il étend essentiellement 3 octets à 4 octets, donc les données encodées sont 1,37 fois plus grandes que celles de son équivalent non-codé. Fondamentalement, il prend 3 morceaux de 8 bits et le redivise en 4 morceaux de 6 bits, puis les réinterprète chacun comme des morceaux de 8 bits, qui peuvent facilement être représentés en ASCII. Wikipedia a plus de détails. –

Répondre

32

Tout d'abord, NE PAS utiliser -[NSData description] pour créer un NSString à de telles fins. Je m'excuse si my previous answer vous a induit en erreur, j'imprimais simplement la description pour démontrer que le NSData peut être crypté et décrypté.) Au lieu de cela, utilisez les méthodes -dataUsingEncoding: et -initWithData:encoding: de NSString pour convertir entre NSData et NSString. Même avec ceux-ci, notez que les données cryptées AES ne se traduiront probablement pas correctement dans les chaînes telles quelles. Certaines séquences d'octets ne fonctionneront pas bien, donc c'est une bonne idée de coder les données avant de créer la chaîne.

Je vous suggère d'essayer Base64 encoding le NSData, puisque les données Base64 peuvent toujours être représentées comme une chaîne ASCII. (Bien sûr, quand vous faites cela, vous devrez décoder de base64 avant de déchiffrer.)

Voici quelques ressources utiles ...


Edit: je suppose que vous auriez combinez cela avec ma réponse à your previous question sur le cryptage AES des objets NSString. L'encodage de données en Base64 ne place aucune restriction sur les données elles-mêmes - il peut s'agir de données chiffrées AES elles-mêmes. Voici ce qu'il faut faire si vous voulez juste entrée de chaîne et de sortie:

  • cryptage
    • Fournir le NSString à chiffrer, et le mot de passe à utiliser pour le chiffrement.
    • Convertissez la chaîne en NSData et exécutez le chiffrement AES (voir la question précédente). Base64: codez NSData, puis créez et renvoyez et NSString de la sortie codée.
  • Décryptage
    • Fournir la chaîne cryptée et codée, et le mot de passe à utiliser pour déchiffrer.
    • Créer un NSData à partir de la première chaîne, puis Base64-décoder les données.
    • Effectuez le déchiffrement AES sur les données, puis créez et renvoyez un NSString.

Il est vraiment juste une question d'enchaîner les deux parties ensemble et les exécuter en sens inverse à la sortie. De ma réponse précédente, vous pouvez modifier encryptString:withKey: pour effectuer la dernière étape et renvoyer une chaîne et modifiez decryptData:withKey: à decryptString:withKey: et acceptez deux chaînes. C'est assez simple.

+3

+1 et Merci pour le lien vers NSDataAdditions, très utile! –

+0

@FreeAsInBeer Veuillez ne pas marquer les réponses des autres personnes comme Wiki de la communauté lorsque vous les éditez. Ce n'est pas ce que c'est. –

+0

@QuinnTaylor La FAQ indique que vous êtes le seul à avoir spécifiquement accès à la case à cocher Wiki communautaire. Ma modification a peut-être provoqué par inadvertance l'entrée en mode Wiki de la communauté, mais cela était complètement involontaire. S'il vous plaît, n'accusez pas les autres de faire des choses qu'ils ne peuvent pas faire. [Référence] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

J'ai rassemblé un ensemble complet de catégories pour NSData et NSString pour fournir le chiffrement AES256 pour les chaînes.

Veuillez consulter my answer sur la 'question d'' origine pour plus de détails.