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

改成如上就好了,代码我明天贴出来,电脑没电了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值