【发布时间】:2011-10-06 05:19:23
【问题描述】:
我必须将 Android 应用迁移到使用 Cipher 的 iOS。所以这里是Android代码:
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine()));
...
byte[] result = Hex.encode(output, 0, output.length);
String resultS = new String(Str.toChars(result));
我为objective-c 尝试了很多东西,但找不到一种方法来获得与Java 相同的字符串。我使用了这里的 iOS 代码 http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/(还有很多,但都一样)。
然后要在 iOS 上获取字符串,请使用以下内容:
NSString* resultS = [encryptedData base64Encoding]
但结果字符串不匹配。也许问题是我如何处理 NSData 的编码(似乎 Java 版本不使用 base64,我没问题?)
有什么想法吗?
编辑 1:
好的,我取得了一些进展(我希望)。检查 java 代码,他们使用 8 块大小和 DES/CBC,密钥为 24 个字符。所以我将代码从 CocoaFu 更改为:
- (NSData *)doCipher:(NSData *)dataIn
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeDES];
uint8_t iv[kChosenCipherBlockSize];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
symmetricKey.bytes,
kCCKeySize3DES,
(const void *)iv,
dataIn.bytes,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&cryptBytes);
if (ccStatus != kCCSuccess) {
NSLog(@"CCCrypt status: %d", ccStatus);
}
dataOut.length = cryptBytes;
return dataOut;
}
当我尝试在 java 中对“测试”消息进行编码时,我得到“f69d7c299597c880”,但在 iOS 上(当然使用相同的密钥)我得到 3DES 的“ ”和“ " 用于 DES。关于我还能改变什么的任何想法?
【问题讨论】:
-
Base64 编码与十六进制编码不同。在比较输出之前使用相同的编码。
标签: android iphone objective-c ios encryption