2012-11-22 166 views
5

什么是实现BlowFish ECB加密的最佳方式iOS ??? 我一直在用谷歌搜索了很多,发现图书馆here。但是这个库没有文档。不知道如何使用它。如何在iOS中实现Blowfish算法

+1

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

+0

感谢ACB。但是这个是付费图书馆。我正在寻找一个免费的源代码 –

+0

@RatikantaPatra你在IOS中完成了ECB加密?我正在与同样的问题奋斗 – QueueOverFlow

回答

5

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

您还应该考虑玩PADDING_PHRASE,例如,如果您想要添加不只是几个空格,而是一些随机字节?在这种情况下,您应该以某种方式发送填充长度。

更新:其实,你不应该使用PADDING_PRASE在你的进程。相反,您应该使用Wikipedia page

+1

请注意您的代码:如果[dataToEncrypt length]%8!= 0,你应该只添加emptyData。 – ggfela

+0

这太棒了,虽然我不能完全用另一种方式解密,但是你有示例代码吗? – perrohunter

+0

@ggfela当然,谢谢。实际上,我已经在Coursera上进行了密码学课程,并且有一些关于填充的严格规则。你可以阅读[维基百科文章](http://en.wikipedia.org/wiki/Padding_(cryptography)#Block_cipher_mode_of_operation)中的内容并实现任何内容。 – Stas

2

上描述的分组密码的标准算法之一Apple自己的CommonCrypto API提供了(除其他之外)Blowfish实现。您可以在CBC(默认)或ECB模式下进行加密和解密。

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

2

因为当时我已经写了Blowfish算法本地实现没有实现适合我的需要,前一段时间

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

它的工作原理与PHP

Objective-C的河豚实现

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

更多关于github;

https://github.com/cantecim/FclBlowfish

+1

这对于使用Apple提供的一个优势有哪些优势,这些优势已经由安全专家审查过了,并且如果存在漏洞将会及时进行修补。 –

+0

当我写这个。我无法找到任何适用于iOS的兼容php的blowfish库。不久,没有其他选择。这是主要的情况。我不知道苹果的河豚包装纸。首先它的易于使用和易于理解的背后。如果涉及支持漏洞补丁的算法,我一定会选择苹果的。另一方面,我不认为该算法可能会导致漏洞。认为它只是一个小小的选择:P最后一件事可以为我提供iOS SDK for Apple的blowfish方法吗? –

+1

算法中可能存在错误。它总是发生。除非你每天花2个小时阅读安全公告,否则你不应该自己实施 - 你应该使用由其他人维护的公告。 –