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_Decrypt而不是Blowfish_Encrypt。 这是一个源代码(我假设您只是解密密文,但这里不处理填充):

+ (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 字符串。对于最后一种情况,我有一个类别,它添加了一个初始化程序,它使用 Base64 字符串和一个方法初始化 NSData 对象,该方法允许从 NSData 获取 Base64 字符串。

您还应该考虑使用 PADDING_PHRASE,例如,如果您不仅要添加几个空格,还要添加一些随机字节怎么办?在这种情况下,您应该以某种方式发送填充长度。

更新:实际上,你不应该在你的过程中使用 PADDING_PRASE。相反,您应该使用维基百科页面上描述的分组密码的标准算法之一

于 2012-12-10T05:11:33.523 回答
2

Apple 自己的 CommonCrypto API 提供(除其他外)Blowfish 实现。您可以在 CBC(默认)或 ECB 模式下加密和解密。

有关文档,请参阅 CommonCrypto.h、CommonCryptor.h 和 CommonCrypto 联机帮助页。

于 2013-09-27T21:11:02.303 回答
2

我已经为河豚算法编写了一个本机实现,因为前段时间没有满足我需要的实现

也许这是一个老问题,但我想帮助需要河豚算法本机类的人。

它的作品与 PHP 完全兼容

Objective-C Blowfish 实现

  • 支持EBC和CBC模式
  • 支持填充 RFC 和零填充
  • 与 PHP 的 Mcrypt 兼容
  • 最初为 iOS SDK 编码。它也适用于 OS X SDK

更多关于 github;

https://github.com/cantecim/FclBlowfish

于 2015-01-07T20:49:16.987 回答