2010-01-11 3 views
4

Je suis à la recherche d'un code de cacao sur le cryptage AES et j'ai fait quelques recherches google pour cela. J'ai trouvé ce lien très utile - http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html. Donc j'ai essayé mais ça n'a pas marché pour moi. Quelqu'un peut-il me suggérer un lien ou un code source utile qui peut m'aider à l'implémenter dans mon exemple d'application?Tout code source de cacao pour le décryptage de cryptage AES?

+2

Tout ce que vous finissez par utiliser, ce serait une bonne idée de le mettre (si ce n'est déjà fait) dans quelques méthodes Pour crypter et décrypter, créez un scénario de test qui tente de crypter et de déchiffrer un exemple de chaîne à l'aide de ces méthodes, comme le fait votre application. Si l'échantillon sort à l'autre extrémité en comparant avec l'échantillon original, vous savez que cela fonctionne. Si ce n'est pas le cas, vous savez que c'est cassé. (Pendant que vous y êtes, testez également que le texte chiffré ne compare pas, ou même ne contient pas comme sous-chaîne, le texte en clair. Vous * ne * voulez vraiment pas que cela soit brisé.) –

+1

Je pense que vous devriez utiliser Cryptage OpenSSL. c'est assez bon voir ceci http://deusty.blogspot.in/2007/01/using-openssl-in-cocoa.html – Imdad

Répondre

6

Le cryptage AES128 est disponible sur l'iPhone dans le cadre CommonCrypto. Les fonctions pertinentes sont dans l'en-tête CommonCryptor.h.

Vous pouvez créer un cryptor comme ceci:

// Assume key and keylength exist 
CCCryptorRef cryptor; 
if(kCCSuccess != CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, 0, key, keyLength, NULL, &cryptor)) 
    ; //handle error 

// Repeatedly call CCCryptorUpdate to encrypt the data 

CCCryptorRelease(cryptor); 

Il semble de la question et le lien que vous recherchez par exemple les implémentations de AES. Je ne recommanderais pas cela, utilisez l'implémentation d'Apple!

Il semble que http://pastie.org/297563.txt pourrait vous aider aussi, mais je ne l'ai pas testé.

+0

Merci sbooth [http://pastie.org/297563.txt][1] fonctionne Existe-t-il une source pour l'encodage/décodage de la base 128? – Devarshi

+1

Notez que la pâte fournie contient une clé codée en dur provenant d'un espace restreint (c'est-à-dire beaucoup plus facile à deviner qu'une clé d'espace complète) et n'utilise aucune IV, ce qui la rend vulnérable aux attaques par répétition. Pour un usage simple, il semble plutôt bien écrit, mais pas pour quelque chose qui allait réellement être attaqué. –

13

J'utilise une catégorie simple sur NSData qui utilise le cadre intégré CommonCrypto pour effectuer le cryptage AES 256 bits. Je l'utilise sur le Mac mais cela devrait fonctionner sur iPhone aussi:

#import <CommonCrypto/CommonCryptor.h> 
@implementation NSData (AESAdditions) 
- (NSData*)AES256EncryptWithKey:(NSString*)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize   = dataLength + kCCBlockSizeAES128; 
    void* buffer    = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesEncrypted); 

    if (cryptStatus == kCCSuccess) 
    { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData*)AES256DecryptWithKey:(NSString*)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize   = dataLength + kCCBlockSizeAES128; 
    void* buffer    = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) 
    { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 
@end 
+0

irsk, merci pour votre réponse! Cependant nous sommes confrontés au même problème dans votre code auquel nous étions confrontés avec le code précédent !! – Devarshi

+0

Hey, j'utilise NSBundle + pathForResource pour le chemin de fichier et en choisissant un fichier à crypter, mais comment puis-je le connecter au cryptage réel. Je sais que c'est une question stupide, mais comment appelez-vous crypter et décrypter les méthodes NSData à utiliser sur un bouton? Comme [soi-même], mais je ne peux pas trouver l'entrée pour «clé» Merci! –

+10

J'ai souvent rencontré ce bloc de code et il y a un certain nombre de problèmes de sécurité. Je les ai écrits avec un code de remplacement ici: http://robnapier.net/blog/aes-commoncrypto-564. –

1

merci pour la grande extension de catégorie. Une chose que j'ai découverte - lorsque vous utilisez CCCrypt avec un algorithme plus fort que 64 bits, vous devez être conforme aux réglementations d'exportation BIS. Voir la FAQ d'iTunes Connect pour plus de détails. Même si vous utilisez l'API Crypto API d'Apple, vous devez obtenir l'approbation du BIS.

Il y a eu une discussion sur sf à ce sujet avant (dans le contexte de l'utilisation de ssl):

Using SSL in an iPhone App - Export Compliance

Cordialement Chris

2

Tous les exemples que j'ai trouvé ne fonctionnait pas pour moi, donc j'ai changé la solution ci-dessus. Celui-ci fonctionne pour moi et utilise le Google-Lib pour Base64 choses:

+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData*)data encryptOrDecrypt:(CCOperation)encryptOrDecrypt { 

    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    if (encryptOrDecrypt == kCCDecrypt) 
    { 
     data = [GTMBase64 decodeData:data]; 
    } 

     NSUInteger dataLength = [data length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 

    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(encryptOrDecrypt, 
              kCCAlgorithmAES128, 
              kCCOptionPKCS7Padding, 
              keyPtr, 
              kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [data bytes], dataLength, /* input */ 
              buffer,  bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus != kCCSuccess){ 
     NSLog(@"ERROR WITH FILE ENCRYPTION/DECRYPTION"); 
     return nil; 
    } 

    NSData *result; 

    if (encryptOrDecrypt == kCCDecrypt) 
    { 
     result = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted]; 
    } 
    else 
    { 
     NSData *myData = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted]; 
     result = [GTMBase64 encodeData:myData]; 
    } 

    free(buffer); //free the buffer; 
    return result; 
} 
Questions connexes