2016-01-06 83 views
1

我已經使用JavaCCCrypt填充選項似乎並沒有影響到解密

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key); 
return cipher.doFinal(text.getBytes());  

加密(請注意,在Java中,PKCS5Padding實際使用AES link時PKCS7Padding)的字符串

而且我的解密內部代碼是:

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
             kCCAlgorithmAES128, 
             0, 
             key.bytes, 
             kCCBlockSizeAES128, 
             iv.bytes, 
             [encrypted bytes], 
             dataLength, 
             buffer, 
             bufferSize, 
             &numBytesEncrypted); 

叫這樣的:

let decryptedData = decryptor.AES128DecryptWithKeyString(key, encryptedString: encodedString) //this does the CCCrypt stuff 
let string:NSString = NSString(data: decryptedData, encoding: NSUTF8StringEncoding) ?? "" 
let data = NSData(base64EncodedString: string as String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 

所以,即使它使用PKCS5Padding加密,我的解密工作正常,儘管沒有填充選項。此外,如果我將0選項更改爲kCCOptionPKCS7Padding,它也可以解密。

這是預期的行爲?填充選項僅與kCCEncrypt相關,而不與kCCDecrypt相關?

此外,如果我們改變了Java加密

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 

和盤手動有效載荷與零個字節,那麼它仍能正常解密不管我是否使用0作爲一個選項或kCCOptionPKCS7Padding

回答

1

當你說填充不會影響解密,你在看十六進制轉儲的輸出嗎?

的襯墊將在0x01的範圍內尾隨字符0x10其是非打印ASCII字符,以便在打印已經被加密以PKCS#7填充但具有填充選項解密的字符串時,它可能看起來是相同的。

將示例輸出兩種方式作爲十六進制轉儲添加到問題中,您應該看到實際發生的情況。

返回狀態並不表示正確的解密或無效的填充,只有嚴重的調用錯誤。

實施例:

let keyData  = Array("123456789".utf8) 
let messageData = Array("Don´t try".utf8) 

let encrypted = testCrypt(data:messageData, keyData:keyData, operation:kCCEncrypt, options:UInt32(kCCOptionPKCS7Padding))! 
print("encrypted:  \(encrypted)") 

let decryptedPKCS7 = testCrypt(data:encrypted, keyData:keyData, operation:kCCDecrypt, options:UInt32(kCCOptionPKCS7Padding))! 
print("decrypted PKCS7: \(decryptedPKCS7)") 

let decryptedNone = testCrypt(data:encrypted, keyData:keyData, operation:kCCDecrypt, options:UInt32(0))! 
print("decrypted None: \(decryptedNone)") 

輸出:

 
encrypted:  [136, 95, 194, 76, 137, 107, 196, 39, 245, 108, 106, 84, 139, 49, 14, 139] 
decrypted PKCS7: [68, 111, 110, 194, 180, 116, 32, 116, 114, 121] 
decrypted None: [68, 111, 110, 194, 180, 116, 32, 116, 114, 121, 6, 6, 6, 6, 6, 6] 

的trailling 6個0x06字節是未去除的填充。

+0

我正在查看NSData並將其轉換爲UIImage,並正確顯示。 –

+0

當我沒有指定kCCOptionPKCS7Padding時,我在NSData上看到了額外的填充字節,但是我很困惑,爲什麼在將UIImage'let data = NSData(base64EncodedString:string as String,選項:NSDataBase64DecodingOptions.IgnoreUnknownCharacters)' 填充字節消失。 (即使沒有IgnoreUnknownCharacters選項,它們也會消失) –

+0

由於數據無效(包含填充字符),操作未定義。 – zaph

相關問題