2012-11-22 4 views
5

Quelle est la meilleure façon de mettre en œuvre BlowFish ECB cryptage en iOS ??? J'ai été googling beaucoup et trouvé la bibliothèque here. Mais il n'y a pas de documentation de cette bibliothèque. Je ne sais pas comment l'utiliser.Comment implémenter l'algorithme Blowfish dans iOS

+1

http://www.example-code.com/objc/crypt2_blowfish.asp et http://code.google.com/p/blowfish-objc/feeds – iDev

+0

grâce ACB. Mais celui-ci est une bibliothèque payante. Je suis à la recherche d'un code source libre –

+0

@RatikantaPatra vous avez fait le chiffrement de la BCE dans IOS? Je suis aux prises avec le même problème – QueueOverFlow

Répondre

5

J'ai reçu l'implémentation de Paul Kocher de Bruce Schneier's website. Et voici comment une méthode de cryptage peut ressembler à:

#define PADDING_PHRASE @"  " 

#import "CryptoUtilities.h" 
#import "blowfish.h" 
#import "NSData+Base64Utilities.h" 

@implementation CryptoUtilities 

+ (NSString *)blowfishEncrypt:(NSData *)messageData usingKey:(NSData *)secretKey 
{ 
    NSMutableData *dataToEncrypt = [messageData mutableCopy]; 

    if ([dataToEncrypt length] % 8) { 
     NSMutableData *emptyData = [[PADDING_PHRASE dataUsingEncoding:NSUTF8StringEncoding] mutableCopy]; 

     emptyData.length = 8 - [dataToEncrypt length] % 8; 
     [dataToEncrypt appendData:emptyData]; 
    } 

    // Here we have data ready to encipher  
    BLOWFISH_CTX ctx; 
    Blowfish_Init (&ctx, (unsigned char*)[secretKey bytes], [secretKey length]); 

    NSRange aLeftRange, aRightRange; 
    NSData *aLeftBox, *aRightBox; 
    unsigned long dl = 0, dr = 0; 

    for (int i = 0; i < [dataToEncrypt length]; i += 8) { // Divide data into octets... 
     // …and then into quartets 
     aLeftRange = NSMakeRange(i, 4); 
     aRightRange = NSMakeRange(i + 4, 4); 

     aLeftBox = [dataToEncrypt subdataWithRange:aLeftRange]; 
     aRightBox = [dataToEncrypt subdataWithRange:aRightRange]; 

     // Convert bytes into unsigned long 
     [aLeftBox getBytes:&dl length:sizeof(unsigned long)]; 
     [aRightBox getBytes:&dr length:sizeof(unsigned long)]; 

     // Encipher 
     Blowfish_Encrypt(&ctx, &dl, &dr); 

     // Put bytes back 
     [dataToEncrypt replaceBytesInRange:aLeftRange withBytes:&dl]; 
     [dataToEncrypt replaceBytesInRange:aRightRange withBytes:&dr]; 
    } 

    return [dataToEncrypt getBase64String]; 
} 

Je ne suis pas très bon en C, mais il semble que ma mise en œuvre fonctionne correctement. Pour déchiffrer vous devez simplement répéter les mêmes étapes, mais au lieu de Blowfish_Encrypt vous devez appeler Blowfish_Decrypt.
Voici un code source pour que (je suppose que vous décryptez tout le texte chiffré, mais ne traitent pas avec un rembourrage ici):

+ (NSData *)blowfishDecrypt:(NSData *)messageData usingKey:(NSData *)secretKeyData 
{ 
    NSMutableData *decryptedData = [messageData mutableCopy]; 

    BLOWFISH_CTX ctx; 
    Blowfish_Init (&ctx, (unsigned char*)[secretKeyData bytes], [secretKeyData length]); 

    NSRange aLeftRange, aRightRange; 
    NSData *aLeftBox, *aRightBox; 
    unsigned long dl = 0, dr = 0; 

    for (int i = 0; i< [decryptedData length]; i += 8) { // Divide data into octets... 
     // …and then into quartets 
     aLeftRange = NSMakeRange(i, 4); 
     aRightRange = NSMakeRange(i + 4, 4); 

     aLeftBox = [decryptedData subdataWithRange:aLeftRange]; 
     aRightBox = [decryptedData subdataWithRange:aRightRange]; 

     // Convert bytes into unsigned long 
     [aLeftBox getBytes:&dl length:sizeof(unsigned long)]; 
     [aRightBox getBytes:&dr length:sizeof(unsigned long)]; 

     // Decipher 
     Blowfish_Decrypt(&ctx, &dl, &dr); 

     // Put bytes back 
     [decryptedData replaceBytesInRange:aLeftRange withBytes:&dl]; 
     [decryptedData replaceBytesInRange:aRightRange withBytes:&dr]; 
    } 

    return decryptedData; 
} 

Vous voudrez peut-être revenir octets purs ou chaîne base64. Pour le dernier cas j'ai une catégorie, qui ajoute un initialisateur, qui initialise l'objet NSData avec la chaîne Base64 et une méthode, qui permet d'obtenir la chaîne Base64 de NSData.

Vous devriez également penser à jouer avec PADDING_PHRASE, par exemple, que se passe-t-il si vous voulez ajouter non seulement plusieurs espaces, mais quelques octets aléatoires? Dans ce cas, vous devriez envoyer une longueur de remplissage en quelque sorte.

Mise à jour: En fait, vous ne devriez pas utilisation PADDING_PRASE dans votre processus. Au lieu de cela, vous devez utiliser l'un des algorithmes standard pour les chiffrements de bloc décrits sur Wikipedia page

+1

Notez sur votre code: Vous devriez seulement ajouter emptyData si [dataToEncrypt length]% 8! = 0. – ggfela

+0

C'est génial, je ne peux pas vraiment travailler autrement pour le décryptage, avez-vous un exemple de code? – perrohunter

+0

@ggfela bien sûr, merci. En fait, j'ai suivi un cours de cryptographie sur Coursera et il y avait des règles strictes sur le rembourrage. Vous pouvez lire à propos de ceux dans [article Wikipedia] (http://en.wikipedia.org/wiki/Padding_ (cryptographie) #Block_cipher_mode_of_operation) et mettre en œuvre tout. – Stas

2

L'API CommonCrypto d'Apple fournit (entre autres) une implémentation de Blowfish. Vous pouvez crypter et décrypter dans les modes CBC (par défaut) ou ECB.

Voir CommonCrypto.h, CommonCryptor.h et la page de manuel CommonCrypto pour la documentation.

2

J'ai écrit une implémentation native pour l'algorithme Blowfish car il n'y avait pas de mise en œuvre pour répondre à mes besoins il y a quelque temps

Peut-être que c'est une vieille question, mais je veux aider quelqu'un qui a besoin d'une classe native pour l'algorithme Blowfish .

Son fonctionne entièrement compatible avec PHP

Un Objective-C Blowfish mise en œuvre

  • Supporte le mode EBC et CBC
  • Prise en charge RFC rembourrage et le rembourrage zéro
  • Works compatible avec Mcrypt PHP
  • Initialement codé pour iOS SDK.Il peut aussi travailler pour OS X SDK

Plus sur GitHub;

https://github.com/cantecim/FclBlowfish

+1

Quels sont les avantages de ce sur l'utilisation de celui fourni par Apple, qui a été approuvé/etc par les experts de la sécurité et sera corrigé rapidement s'il y a des vulnérabilités? –

+0

Quand j'ai écrit ceci. Je n'ai pas trouvé de bibliothèque blowfish compatible avec php pour iOS. Peu de temps il n'y avait pas d'alternatives. C'est le cas principal. Je ne savais pas à propos du wrapper blowfish de la pomme. Tout d'abord, il est facile à utiliser et facile à comprendre derrière la scène. S'il s'agit de soutenir l'algorithme avec des correctifs aux vulnérabilités, je choisirais sûrement l'Apple. D'un autre côté, je ne pense pas que l'algorithme puisse causer des vulnérabilités. Pensez-y comme juste une petite alternative: P Une dernière chose pourriez-vous me fournir les méthodes blowfish d'Apple pour iOS SDK? –

+1

il pourrait y avoir des bogues dans l'algorithme. Cela arrive tout le temps. À moins que vous ne passiez 2 heures par jour à lire des bulletins de sécurité, vous ne devriez pas en implémenter un vous-même - vous devriez en utiliser un qui est maintenu par quelqu'un d'autre. –