Blowfish for IOS

最近項目需求研究了一下blowfish的算法,發現網上都沒有現成的,有一個還是一個坑,三天,都在弄這個,最後還是功夫不負有心人,弄好了,現在我就總結一下吧。

一、算法種類

對稱加密,不對稱加密,不可逆加密

二、常見的算法

AES,DES,3DES,BLOWFISH,MD5,SHA1,SHA2等

三、加密模式

ECB\CBC\CFB\CTR\OFB\CFB8

四、通用的加解密的實現代碼

如果項目沒有特殊的pbox和sbox那就可以用一套通用的代碼

參考的是簡書上一個人寫的,很好
http://www.jianshu.com/p/ddd316925953

實現blowfish的通用方式代碼如下

   NSString *plaintText = @"你好";
    NSData *source = [plaintText dataUsingEncoding:NSUTF8StringEncoding];



    [source bfCryptoBlowfishEncodeWithMode:BuffCryptoModeECB iv:@"11111111" key:mykey completion:^(NSData *cryptoData) {

        NSMutableString *cypherText = [[NSMutableString alloc] init];
        [cryptoData enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
            unsigned char *dataBytes = (unsigned char *) bytes;
            for (NSInteger i = 0; i < byteRange.length; i++) {
                NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
                if ([hexStr length] == 2) {
                    [cypherText appendString:hexStr];
                } else {
                    [cypherText appendFormat:@"0%@", hexStr];
                }
            }
        }];
        dispatch_async(dispatch_get_main_queue(),^{
            NSLog(@"%@",cypherText);

        });



        [cryptoData bfCryptoBlowfishDecodeWithMode:BuffCryptoModeECB iv:@"00000000" key:mykey completion:^(NSData *cryptoData2) {

            NSString *result= [[NSString alloc] initWithData:cryptoData2 encoding:NSUTF8StringEncoding];
            NSLog(@"%@",result);

        }];

    }];

my key就是你的key

這種方式用的是系統的庫,所以你沒辦法改,所以只適合通用

特定的Blowfish的iOS實現

我找的網上的一個代碼,用的是ECB模式,但是加解密出來的跟服務端用java出來的結果不一樣,我研究了一下發現他的填充方式不一樣,java那套是沒夠位就補0,網上找的那套是沒夠位就補長度,也就是PKCS5Padding和PKCS7Padding的區別,然後我就改了一下,發現還是不行,然後加密就好,但是解密還是有問題,找了好久發現是string 轉成nsdata的方式不對,

+(NSData *)hexStringToData:(NSString *)hexString{  
    const char *chars = [hexString UTF8String];  
    int i = 0;  
    int len = (int)hexString.length;  
    NSMutableData *data = [NSMutableData dataWithCapacity:len/2];  
    char byteChars[3] = {'\0','\0','\0'};  
    unsigned long wholeByte;  

    while (i<len) {  
        byteChars[0] = chars[i++];  
        byteChars[1] = chars[i++];  
        wholeByte = strtoul(byteChars, NULL, 16);  
        [data appendBytes:&wholeByte length:1];  
    }  
    return data;  
}  

改成如上就好了,代碼我明天貼出來,電腦沒電了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章