什么是实现BlowFish ECB加密的最佳方式iOS ??? 我一直在用谷歌搜索了很多,发现图书馆here。但是这个库没有文档。不知道如何使用它。如何在iOS中实现Blowfish算法
回答
我从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_Encrypt你需要拨打 Blowfish_Decrypt。
下面是一个源代码(我假设你刚刚解密的密文,但与填充这里不处理):
+ (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, aRightRange;
NSData *aLeftBox, *aRightBox;
unsigned long dl = 0, dr = 0;
for (int i = 0; i< [decryptedData length]; i += 8) { // Divide data into octets...
// …and then into quartets
aLeftRange = NSMakeRange(i, 4);
aRightRange = NSMakeRange(i + 4, 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, &dl, &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
请注意您的代码:如果[dataToEncrypt length]%8!= 0,你应该只添加emptyData。 – ggfela
这太棒了,虽然我不能完全用另一种方式解密,但是你有示例代码吗? – perrohunter
@ggfela当然,谢谢。实际上,我已经在Coursera上进行了密码学课程,并且有一些关于填充的严格规则。你可以阅读[维基百科文章](http://en.wikipedia.org/wiki/Padding_(cryptography)#Block_cipher_mode_of_operation)中的内容并实现任何内容。 – Stas
上描述的分组密码的标准算法之一Apple自己的CommonCrypto API提供了(除其他之外)Blowfish实现。您可以在CBC(默认)或ECB模式下进行加密和解密。
有关文档,请参见CommonCrypto.h,CommonCryptor.h和CommonCrypto联机帮助页。
因为当时我已经写了Blowfish算法本地实现没有实现适合我的需要,前一段时间
也许这是一个老问题,但我想帮助的人谁需要一个本地类Blowfish算法。
它的工作原理与PHP
Objective-C的河豚实现
- 支持EBC和CBC模式完全兼容
- 支持填充RFC和零填充
- 工程与PHP的这个Mcrypt兼容
- 最初编码为iOS SDK。它可能也适用于OS X SDK
更多关于github;
这对于使用Apple提供的一个优势有哪些优势,这些优势已经由安全专家审查过了,并且如果存在漏洞将会及时进行修补。 –
当我写这个。我无法找到任何适用于iOS的兼容php的blowfish库。不久,没有其他选择。这是主要的情况。我不知道苹果的河豚包装纸。首先它的易于使用和易于理解的背后。如果涉及支持漏洞补丁的算法,我一定会选择苹果的。另一方面,我不认为该算法可能会导致漏洞。认为它只是一个小小的选择:P最后一件事可以为我提供iOS SDK for Apple的blowfish方法吗? –
算法中可能存在错误。它总是发生。除非你每天花2个小时阅读安全公告,否则你不应该自己实施 - 你应该使用由其他人维护的公告。 –
- 1. 如何在J2ME中实现Blowfish算法?
- 2. PHP和iOS中的Blowfish算法
- 3. 如何在JavaScript中实现PBEWithMD5AndDES算法?
- 4. 如何在Haskell中实现Dijkstra算法
- 5. 如何在JavaScript中实现TileWindows算法?
- 6. 如何在SQL中实现此算法?
- 7. 如何在ns3中实现GPSR算法?
- 8. 如何在h2o中实现apriori算法?
- 9. C++ Blowfish散列实现
- 10. 如何在Java中为Blowfish加密算法添加时间戳?
- 11. 如何解密在PHP中使用Blowfish算法?
- 12. 如何实现AO *算法?
- 13. C#实现中的Blowfish ECB加密
- 14. 如何在iOS上实现我的android算法?
- 15. 在RenderScript中实现算法
- 16. 如何实现iOS中
- 17. 如何在iOS中实现Android的getViewById?
- 18. 如何在ios 5中实现RETWEET?
- 19. 如何在iOS中实现这一点?
- 20. 如何在iOS中实现“打盹”?
- 21. 如何在IOS中实现IndexDB
- 22. 如何在iOS 6中实现旋转?
- 23. 如何在iOS中实现AFNetwoking interagtion?
- 24. 如何在iOS中实现视频DRM
- 25. Python中的算法实现
- 26. 如何在c中实现计算hashmap?
- 27. 哪个Blowfish算法最“正确”?
- 28. 如何实现Reddit投票算法?
- 29. 如何实现这样的算法?
- 30. 我该如何实现Goertzel算法?
http://www.example-code.com/objc/crypt2_blowfish.asp和http://code.google.com/p/blowfish-objc/feeds – iDev
感谢ACB。但是这个是付费图书馆。我正在寻找一个免费的源代码 –
@RatikantaPatra你在IOS中完成了ECB加密?我正在与同样的问题奋斗 – QueueOverFlow