6

iOSでBlowFish ECB暗号化を実装する最良の方法は何ですか??? 私はよくグーグルで検索しており、ここでライブラリを見つけました。しかし、このライブラリのドキュメントはありません。使い方がわからない。

4

3 に答える 3

5

Bruce Schneier のウェブサイトから Paul Kocher の実装を入手しました。暗号化方式は次のようになります。

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

私は C があまり得意ではありませんが、私の実装は正しく機能しているようです。復号化するには、同じ手順を繰り返すだけで済みますが、Blowfish_Encrypt の代わりにBlowfish_Decrypt呼び出す必要があります。 そのためのソース コードを次に示します (暗号化テキストを復号化するだけであると仮定しますが、ここではパディングを処理しません)。

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

純粋なバイトまたは Base64 文字列を返したい場合があります。最後のケースでは、NSData オブジェクトを Base64 文字列で初期化するイニシャライザと、NSData から Base64 文字列を取得できるメソッドを追加するカテゴリがあります。

また、PADDING_PHRASE で遊ぶことについても考える必要があります。たとえば、いくつかのスペースだけでなく、ランダムなバイトを追加したい場合はどうすればよいでしょうか? この場合、何らかの方法でパディングの長さを送信する必要があります。

更新:実際には、プロセスで PADDING_PRASE を使用しないでください。代わりに、ウィキペディアのページで説明されているブロック暗号の標準アルゴリズムの 1 つを使用する必要があります。

于 2012-12-10T05:11:33.523 に答える
2

Apple 独自の CommonCrypto API は、(とりわけ) Blowfish 実装を提供します。CBC (デフォルト) または ECB モードで暗号化および復号化できます。

ドキュメントについては、CommonCrypto.h、CommonCryptor.h、および CommonCrypto マンページを参照してください。

于 2013-09-27T21:11:02.303 に答える