您的位置:首页 > 移动开发 > IOS开发

Blowfish for IOS

2016-12-25 19:44 561 查看
最近项目需求研究了一下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;
}


改成如上就好了,代码我明天贴出来,电脑没电了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 加密 算法 blowfish