最近項目需求研究了一下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;
}
改成如上就好了,代碼我明天貼出來,電腦沒電了。