2016-02-15 93 views
0

在我的iOS应用程序中,我必须解密来自服务器的数据。我用CommonCrypto框架,经过多次试验,我成功地与CCCrypt AES解密

CCCrypt(kCCDecrypt, // operation 
        kCCAlgorithmAES128, // Algorithm 
        kCCOptionPKCS7Padding | kCCModeCBC, // options 
        key.bytes, // key 
        key.length, // keylength 
        nil,// iv 
        cipherData.bytes, // dataIn 
        cipherData.length, // dataInLength, 
        decryptedData.mutableBytes, // dataOut 
        decryptedData.length, // dataOutAvailable 
        &outLength); // dataOutMoved 

解密在Java服务器中的数据加密后与

byte[] buff = new byte[100]; 
byte[] buf2 = new byte[32]; 
byte[] mainKey = ... 
byte[] raw = ... 
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine()); 
KeyParameter par = new KeyParameter(mainKey); 
int minSize = cipher.getOutputSize(data.length); 
byte[] outBuf = new byte[minSize]; 
int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); 
int length2 = cipher.doFinal(outBuf, length1); 
int actualLength = length1 + length2; 
byte[] result = new byte[actualLength]; 
System.arraycopy(outBuf, 0, result, 0, result.length); 

现在,我不明白的kCCOptionPKCS7Padding | kCCModeCBC感。 kCCOptionPKCS7Padding = 0x0001kCCModeCBC = 2所以kCCOptionPKCS7Padding | kCCModeCBC = 3但不存在用于分组密码的值为3的选项。

有没有人可以帮助我理解?

+0

*“但是不存在用于值为3的分组密码的选项”* - 你是什么意思? –

+0

对不起@ArtjomB,但正如我向Rob指出的,我误解了位域的含义。现在更清楚了。 – Giorgio

回答

2

您在这里输入kCCModeCBC时出错。所有CCOption枚举值以kCCOption开头。 kCCModeCBCCCMode枚举的一部分。你不能以这种方式组合它们。你正在逃避它,因为CBC恰好是默认的。您应该删除| kCCModeCBC。 (CCMode被称为CCCryptorCreateWithMode一个新的接口使用。界面你使用默认为CBC和有一个选项切换到ECB模式来代替。))

要在更深层次的问题,这些都是bit fields。所以“比特零”(值为1)是PKCS7填充。第一位(值为2)打开ECB(不是CBC)。如果你“或”他们(这与添加他们相同),你会得到3,这意味着两种选择。这是在C中传递布尔数据的一种非常常见的方式,给每个字段一个较大的整数。

如果有更多的字段,他们将有值4,8,16,32等所有权力的两个。所以你打开或关闭的选项恰好是一个(开)和零(关)的二进制数。对于这些类型的值,C没有很好的维护类型安全的方法,所以它不会阻止你组合无关的枚举,就像你在这里完成的那样。


它之所以“工程”与kCCModeCBC的是,它具有相同的价值kCCOptionECBMode。您的加密处于ECB模式,而不是CBC模式。 (这恰好意味着你的密码几乎肯定是非常不安全的,但这是一个单独的问题。)

+0

如果我删除| kCCModeCBC解密结果不正确。我发现获得正确结果的唯一方法是kCCOptionPKCS7Padding | kCCModeCBC。我同意你的看法,这是毫无意义的。这就是为什么我问这个问题。 – Giorgio

+0

'kCCModeCBC'和'kCCOptionECBMode'恰好具有相同的值。 –

+0

好的。那么'kCCOptionECBMode'和'kCCOptionPKCS7Padding'不是互斥的吗?如果我只使用'kCCOptionPKCS7Padding',我有一个填充CBC密码。如果我使用'kCCOptionPKCS7Padding | kCCOptionECBMode'我有一个填充ECB密码。对? – Giorgio