我在使用 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];
似乎我几乎尝试了每个设置两次,不同的编码等等......我的错误在哪里?