大佬教程收集整理的这篇文章主要介绍了iphone – 如何在iOS中实现Blowfish算法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#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_Decrypt而不是Blowfish_Encrypt.
这是一个源代码(我假设您只是解密密文,但这里不处理填充):
+ (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,dr = 0; for (int i = 0; i< [decryptedData length]; i += 8) { // Divide data into octets... // …and then into quartets aLeftRange = NsmakeRange(i,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,&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中描述的块密码的标准算法之一
以上是大佬教程为你收集整理的iphone – 如何在iOS中实现Blowfish算法全部内容,希望文章能够帮你解决iphone – 如何在iOS中实现Blowfish算法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。