Le Chiffrement AES pour un NSString sur l'iPhone
Quelqu'un peut me pointer dans la bonne direction pour être en mesure de chiffrer une chaîne, de retour d'une autre chaîne avec les données chiffrées? (J'ai essayé avec du chiffrement AES256.) Je veux écrire une méthode qui prend deux NSString cas, l'un étant le message à chiffrer et l'autre étant un "code d'accès" pour les chiffrer avec, je crois, je dois générer la clé de chiffrement avec le code d'authentification, d'une manière qui peut être renversée si le code d'accès est fourni avec les données chiffrées. La méthode doit alors retourner un NSString créé à partir de données chiffrées.
J'ai essayé la technique décrite dans le premier commentaire sur ce post, mais je n'ai pas eu de chance jusqu'à présent. Apple CryptoExercise a certainement quelque chose, mais je ne peux pas donner un sens... j'ai vu beaucoup de références à CCCrypt, mais il a échoué dans tous les cas, je l'ai utilisé.
Je voudrais aussi avoir pour être en mesure de décrypter une chaîne cryptée, mais j'espère que c'est aussi simple que kCCEncrypt/kCCDecrypt.
- Veuillez noter que je vous ai donné une prime à une réponse par Rob Napier, qui a fourni un sécurisé version de la réponse.
Vous devez vous connecter pour publier un commentaire.
Puisque vous n'avez pas posté de code, il est difficile de savoir exactement quels problèmes vous êtes à la rencontre. Cependant, le blog vous lien ne semble pas fonctionner assez décemment... en dehors de la virgule supplémentaire dans chaque appel à
CCCrypt()
qui a provoqué des erreurs de compilation.Plus tard un commentaire sur ce poste comprend ce code adapté, ce qui fonctionne pour moi, et il semble un peu plus simple. Si vous incluez le code pour que le NSData catégorie, vous pouvez écrire quelque chose comme ceci: (Note: Le
printf()
les appels sont seulement pour démontrer l'état des données à différents moments, dans une application réelle, il ne serait pas logique de faire imprimer ces valeurs).Compte tenu de ce code, et le fait que les données chiffrées ne sera pas toujours traduire parfaitement dans un NSString, il peut être plus pratique d'écrire deux méthodes qui enveloppent les fonctionnalités dont vous avez besoin, en avant et en arrière...
Cela fonctionne bien sur Snow Leopard, et @Boz rapports que CommonCrypto fait partie du Noyau du système d'exploitation sur l'iPhone. Les deux 10.4 et 10.5 ont
/usr/include/CommonCrypto
, bien que 10.5 a une page de man pourCCCryptor.3cc
et 10.4 n'est pas le cas, YMMV.EDIT: Voir cette question de suivi sur l'utilisation de l'encodage Base64 pour la représentation des données chiffrées octets comme une chaîne de caractères (si désiré) à l'aide de coffre-fort, sans perte de conversions.
autorelease
.J'ai rassemblé une collection de catégories pour NSData et NSString qui utilise des solutions trouvées sur Jeff LaMarche blog et quelques conseils par Quinn Taylor, ici, sur un Débordement de Pile.
Il utilise les catégories d'étendre NSData de fournir chiffrement AES256 et propose également une extension de NSString à BASE64 encode des données cryptées en toute sécurité pour les cordes.
Voici un exemple pour montrer l'utilisation pour le cryptage des chaînes:
Obtenir le code source complet ici:
Merci pour tous les conseils utiles!
-- Michael
@owlstead, concernant votre demande pour "un point de vue cryptographique sécurisé variante de l'une des réponses," s'il vous plaît voir RNCryptor. Il a été conçu pour faire exactement ce que vous demandez (et a été construit en réponse à des problèmes avec le code répertorié ici).
RNCryptor utilise PBKDF2 avec le sel, fournit un hasard IV, et s'attache HMAC (également généré à partir de PBKDF2 avec son propre sel. Il soutien synchrone et asynchrone.
J'ai attendu un peu sur @QuinnTaylor de mettre à jour sa réponse, mais depuis il n'a pas, voici la réponse un peu plus clairement et d'une manière qu'il se charge sur XCode7 (et peut-être plus). Je l'ai utilisé dans une application Cocoa, mais il en sera probablement de travailler bien avec une application iOS ainsi. N'a pas d'ARC erreurs.
Coller avant tout @mise en œuvre de l'article dans votre AppDelegate.m ou AppDelegate.mm de fichier.
Coller ces deux fonctions dans l' @mise en œuvre de la classe que vous désirez. Dans mon cas, j'ai choisi @mise en œuvre AppDelegate dans mon AppDelegate.mm ou AppDelegate.m fichier.
dataWithBytesNoCopy
juste allouer unNSMutableData
avecdataWithLength
et l'utilisation de lamutableBytes
propriété de l'octet pointeur, puis il suffit de les redimensionner en définissant c'estlength
de la propriété. 3. L'aide de la chaîne directement pour un chiffrement est très précaire, un dérivé de la clé doit être utilisé tel que créé par PBKDF2.keyData.length = kCCKeySizeAES256;
.