2012-11-22 12 views
5

Jaki jest najlepszy sposób na wdrożenie BlowFish ECB szyfrowania w iOS ??? Często googlowałem i znalazłem bibliotekę here. Ale nie ma dokumentacji tej biblioteki. Nie wiem, jak z niego korzystać.Jak zaimplementować algorytm Blowfish w iOS

+1

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

+0

dzięki ACB. Ale ta jest płatną biblioteką. Szukam darmowego kodu źródłowego –

+0

@RatikantaPatra zrobiłeś szyfrowanie ECB w IOS? Mam problemy z tym samym numerem – QueueOverFlow

Odpowiedz

5

Mam implementację Paula Kochera z Bruce Schneier's website. A oto jak może wyglądać metoda szyfrowania:

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

Nie jestem naprawdę dobry w C, ale wygląda na to, że moja implementacja działa poprawnie. Aby odszyfrować, wystarczy powtórzyć te same kroki, ale zamiast Blowfish_Encrypt należy zadzwonić pod numer Blowfish_Decrypt.
Oto kod źródłowy to (zakładam, że po prostu odszyfrować tekst zaszyfrowany, ale nie radzić sobie z wyściółką tutaj):

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

może chcesz wrócić czystych lub Base64 ciąg bajtów. Dla ostatniego przypadku mam kategorię, która dodaje inicjator, który inicjuje obiekt NSData z łańcuchem Base64 i metodą, która pozwala uzyskać ciąg Base64 z NSData.

Powinieneś także pomyśleć o graniu z PADDING_PHRASE, na przykład, jeśli chcesz dodać nie tylko kilka spacji, ale kilka losowych bajtów? W takim przypadku należy jakoś wysłać długość dopełnienia.

Aktualizacja: Właściwie nie powinien użycie PADDING_PRASE w swoim procesie. Zamiast tego należy użyć jednego ze standardowych algorytmów dla szyfrów blokowych opisanych na Wikipedia page

+1

Uwaga na temat twojego kodu: Powinieneś tylko dodać emptyData, jeśli [dataToEncrypt length]% 8! = 0. – ggfela

+0

To jest genialne, ale nie mogę pracować w inny sposób do odszyfrowania, czy masz przykładowy kod? – perrohunter

+0

@ggfela, oczywiście, dziękuję. Właściwie wziąłem kurs kryptograficzny na Courserze i istniały pewne ścisłe zasady dotyczące dopełniania. Możesz przeczytać o nich w [artykuł w Wikipedii] (http://pl.wikipedia.org/wiki/Padding_ (kryptografia) #Block_cipher_mode_of_operation) i zaimplementować dowolne. – Stas

2

Własne API CommonCrypto firmy Apple zapewnia (między innymi) implementację Blowfish. Możesz szyfrować i odszyfrowywać w trybach CBC (domyślnie) lub ECB.

Zobacz dokumentację CommonCrypto.h, CommonCryptor.h i stronę roboczą CommonCrypto.

2

Pisałem natywną implementację algorytmu Blowfish, gdyż nie było wdrożenie, aby dopasować moje potrzeby jakiś czas temu

Może jest to stara sprawa, ale chcę pomóc komuś, kto potrzebuje natywną klasę dla algorytmu Blowfish .

swoje prace w pełni kompatybilny z PHP

implementacji Objective-C Blowfish

  • Obsługuje tryb EBC i CBC
  • Obsługuje dopełnienie RFC i wypełnianie zerami
  • Works kompatybilny z PHP mcrypt
  • Oryginalnie zakodowany dla SDK iOS.Może działać również dla OS X SDK

Więcej o github;

https://github.com/cantecim/FclBlowfish

+1

Jakie są tego zalety wynikające z używania tego, który zapewnia Apple, który został sprawdzony/etc przez ekspertów ds. Bezpieczeństwa i zostanie natychmiast naprawiony, jeśli są luki? –

+0

Kiedy to napisałem. Nie mogłem znaleźć żadnej biblioteki blowfish, która działa kompatybilna z php na iOS. Wkrótce nie było alternatyw. To jest główny przypadek. Nie wiedziałem o opakowaniu blowfish na jabłko. Przede wszystkim jest łatwy w użyciu i łatwy do zrozumienia za sceną. Jeśli chodzi o wspieranie algorytmów z łatkami do luk w zabezpieczeniach, z pewnością wybrałbym ten z Apple. Z drugiej strony nie sądzę, że algorytm może powodować luki w zabezpieczeniach. Pomyślcie, że to tylko mała alternatywa: P Jeszcze jedną rzeczą, którą mógłbyś podać mi metody blowfish firmy apple dla SDK iOS? –

+1

mogą występować błędy w algorytmie. To się zdarza cały czas. Jeśli nie spędzasz 2 godzin dziennie na czytaniu biuletynów o zabezpieczeniach, nie powinieneś sam ich wdrażać - powinieneś użyć takiego, który jest obsługiwany przez kogoś innego. –

Powiązane problemy