2

我在使用 CommonCrypto 函数时遇到了一些严重的问题。BlackBerry 和 Windows Mobile 现有两个应用程序,它们都使用具有 ECB 模式的 Triple-DES 加密进行数据交换。在任一加密结果上都是相同的。

现在我想在我们的 iPhone 应用程序中实现 3DES 加密,所以我直接使用 CommonCrypto: http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-32207/CommonCrypto/CommonCryptor.h

如果我使用 CBC 模式,我会得到一些结果,但它们与 Java 或 C# 的结果不对应。无论如何,我想使用 ECB 模式,但我根本不让它工作 - 出现参数错误......

这是我对欧洲央行模式的呼吁......我把它剥离了一点:

const void *vplainText;

plainTextBufferSize = [@"Hello World!" length];
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);

plainText = (const void *) [@"Hello World!" UTF8String];
NSString *key = @"abcdeabcdeabcdeabcdeabcd";

ccStatus = CCCrypt(kCCEncrypt,
     kCCAlgorithm3DES,
     kCCOptionECBMode,
     key,
     kCCKeySize3DES,
     nil, // iv, not used with ECB
     plainText,
     plainTextBufferSize,
     (void *)bufferPtr, // output
     bufferPtrSize,
     &movedBytes);

t 或多或少是这里的代码:http://discussions.apple.com/thread.jspa?messageID=9017515 但如前所述,我每次都会收到参数错误...

当我使用 kCCOptionPKCS7Padding 而不是 kCCOptionECBMode 并在 C# 和我的 iPhone 代码中设置相同的初始化向量时,iPhone 会给我不同的结果。从 bufferPtr 获取我的输出是否有错误?目前我以这种方式获得加密的东西:

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding];

似乎我几乎尝试了每个设置两次,不同的编码等等......我的错误在哪里?

4

3 回答 3

1

您可以发布错误消息吗?

我发现解决这些问题的最佳方法之一是获取已知输入、已知键和已知输出(“测试向量”),并将预期输出的字节与观察到的输出进行比较。

您在这里所做的可能不是测试输出的好方法:

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding];

你怎么知道加密的二进制数据可以用NSISOLatin1StringEncoding编码来解释?

相反,直接比较字节(通过[myData description]等)或使用十六进制或base64编码转换输出。

于 2009-09-07T20:04:54.550 回答
1

我认为问题在于仅 kCCOptionECBMode 是不够的。您还需要填充(因为它是一个块密码)。如果您同时通过(即 kCCOptionPKCS7Padding | kCCOptionECBMode ),它将起作用。

于 2010-03-14T10:49:25.333 回答
0

我意识到这是一个老问题,但作为参考,我认为您的密钥不应该作为 NSString 传入。密钥应该从十六进制转换为字节数组。这个hexToBytes NSString 扩展应该通过执行以下操作来提供您需要的内容:

[[key hexToBytes] bytes]

密钥也应该是给定密钥的两倍(48 个十六进制字符,即 24 个字节)。

于 2012-05-28T13:43:19.040 回答