iphone – 如何在iOS中实现Blowfish算法
发布时间:2020-12-15 01:43:53 所属栏目:百科 来源:网络整理
导读:在iOS中实现BlowFish ECB加密的最佳方法是什么? 我一直在谷歌搜索,发现了库 here.但是没有这个库的文档.不知道如何使用它. 解决方法 我从 Bruce Schneier’s website开始实现Paul Kocher.以下是加密方法的外观: #define PADDING_PHRASE @" "#import "Crypt
在iOS中实现BlowFish ECB加密的最佳方法是什么?
我一直在谷歌搜索,发现了库 here.但是没有这个库的文档.不知道如何使用它. 解决方法
我从
Bruce Schneier’s website开始实现Paul Kocher.以下是加密方法的外观:
#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中描述的块密码的标准算法之一 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Oracle 11g导出空表、少表的解决办法
- .net – MEF是一个依赖注入框架?
- c – 如何将winhttp api与“transfer-encoding:chunked”一
- 使用TinyXml 解析XML文件
- ruby-on-rails – Rails和日期,默认情况下是以UTC格式存储的
- c# – Autofac – 自动注册错误:没有找到与“公共绑定标志
- 浅谈window.onbeforeunload() 事件调用ajax
- C# Base64编码
- ruby-on-rails – Rails 3 / Bundler gem:Bundler的’unde
- ruby-on-rails – 在rails中改变一周的第一天