2012-11-22 7 views
5
implementieren

Was ist der beste Weg zu implementieren BlowFish ECB Verschlüsselung in iOS ??? Ich habe viel gegoogelt und die Bibliothek here gefunden. Aber es gibt keine Dokumentation dieser Bibliothek. Nicht sicher, wie man es benutzt.Wie Blowfish-Algorithmus in iOS

+1

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

+0

dank ACB. Aber dieses ist eine bezahlte Bibliothek. Ich bin auf der Suche nach einem kostenlosen Quellcode –

+0

@RatikantaPatra Sie getan EZB-Verschlüsselung in IOS? Ich kämpfe mit dem gleichen Problem – QueueOverFlow

Antwort

5

Ich habe Paul Kocher Implementierung von Bruce Schneier's website. Und hier ist, wie ein Verschlüsselungsverfahren kann wie folgt aussehen:

#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]; 
} 

Ich bin nicht wirklich gut in C, aber es scheint, dass meine Implementierung korrekt funktioniert. Zum Entschlüsseln müssen Sie nur die gleichen Schritte wiederholen, aber anstelle von Blowfish_Encrypt müssen Sie Blowfish_Decrypt anrufen.
Hier ist ein Quellcode für das (Ich gehe davon aus, dass Sie den Chiffretext nur entschlüsseln, aber befasst sich nicht mit Polsterung hier):

+ (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; 
} 

Sie könnten reine Bytes oder Base64-String zurückgeben möchten. Für den letzten Fall habe ich eine Kategorie, die einen Initialisierer hinzufügt, der das NSData-Objekt mit Base64-String initialisiert, und eine Methode, mit der Base64-String von NSData abgerufen werden kann.

Sie sollten auch darüber nachdenken, mit PADDING_PHRASE zu spielen, zum Beispiel, was ist, wenn Sie nicht nur mehrere Leerzeichen, sondern einige zufällige Bytes hinzufügen möchten? In diesem Fall sollten Sie irgendwie eine Padding-Länge senden.

Update: Eigentlich Sie sollte nicht Verwendung PADDING_PRASE in Ihrem Prozess. Stattdessen sollten Sie einen der Standardalgorithmen für Blockchiffren verwenden, die unter Wikipedia page

+1

Hinweis auf den Code: Sie sollten nur emptyData hinzufügen, wenn [dataToEncrypt length]% 8! = 0. – ggfela

+0

Das ist genial, ich kann nicht ganz anders hin zum Entschlüsseln arbeiten, haben Sie einen Beispielcode? – perrohunter

+0

@ggfela natürlich, danke. Eigentlich habe ich den Cryptography-Kurs auf Coursera absolviert und es gab einige strenge Regeln zum Padding. Sie können über die in [Wikipedia-Artikel] (http://en.wikipedia.org/wiki/Padding_ (Kryptografie) #Block_cipher_mode_of_operation) lesen und implementieren. – Stas

2

beschrieben werden. Apples eigene CommonCrypto-API stellt (unter anderem) eine Blowfish-Implementierung bereit. Sie können in den Modi CBC (Standard) oder ECB verschlüsseln und entschlüsseln.

Siehe CommonCrypto.h, CommonCryptor.h und die CommonCrypto-Manpage für die Dokumentation.

2

ich eine native Implementierung für Blowfish-Algorithmus geschrieben habe, da es keine Implementierung war, um meine Bedürfnisse vor einiger Zeit

Vielleicht ist eine alte Frage zu passen, aber ich möchte jemanden helfen, die für Blowfish-Algorithmus eine native Klasse benötigt .

Sein Werk voll kompatibel mit PHP

Ein Objective-C Blowfish Implementierung

  • Unterstützt EBC und CBC-Modus
  • Unterstützt Polsterung RFC und Zero-padding
  • Works kompatibel mit PHP Mcrypt
  • Ursprünglich für iOS SDK codiert.Es kann auch für OS X SDK funktionieren

Mehr auf github;

https://github.com/cantecim/FclBlowfish

+1

Was sind die Vorteile gegenüber der Verwendung des von Apple bereitgestellten Programms, das von Sicherheitsexperten geprüft wurde und bei Sicherheitslücken sofort aktualisiert wird? –

+0

Als ich das schrieb. Ich konnte keine Blowfish-Bibliothek finden, die mit PHP für iOS kompatibel ist. Kurz gab es keine Alternativen. Das ist der Hauptfall. Ich wusste nichts über den Blowfish Wrapper des Apfels. Vor allem ist es einfach zu bedienen und hinter der Szene leicht zu verstehen. Wenn es darum geht, einen Algorithmus mit Patches für Schwachstellen zu unterstützen, würde ich mich sicher für den Apple entscheiden. Auf der anderen Seite glaube ich nicht, dass der Algorithmus Sicherheitslücken verursachen könnte. Betrachten Sie es als nur eine kleine Alternative: P Eine letzte Sache können Sie mir Apple Blowfish-Methoden für iOS SDK bieten? –

+1

könnte es Fehler im Algorithmus geben. Es passiert ständig. Wenn Sie nicht jeden Tag zwei Stunden mit dem Lesen von Sicherheitsbulletins verbringen, sollten Sie nicht selbst eines implementieren - Sie sollten eines verwenden, das von jemand anderem gepflegt wird. –