我需要将一个使用Cipher的Android应用迁移到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));
我尝试了很多Objc的东西,但找不到一种方法来获得与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和24个字符的DES/CBC密钥。因此,我将代码从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中对“test”消息进行编码时,我得到了“f69d7c299597c880”,但在iOS上(当然使用相同的密钥)我得到了3DES的“< 91864397 > < 41434eaa >”,以及DES的“< ed660859 > < 4bad6f7f >”。你有什么其他的想法可以改变吗?