我正在使用CommonCrypto
解密从服务器获取的加密MP3文件。
实际上,服务器端使用AES 128位加密和CBC模式,所以我想用同样的方式解密它。
我用下面的代码来解密。
#import <CommonCrypto/CommonCrypto.h
func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? {
let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
print("keyLength = \(keyData.length), keyData = \(keyData)")
let ivBytes = UnsafePointer<UInt8>(ivData.bytes)
print("ivLength = \(ivData.length), ivData = \(ivData)")
let dataLength = Int(data.length)
let dataBytes = UnsafePointer<UInt8>(data.bytes)
print("dataLength = \(dataLength), data = \(data)")
let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
let cryptLength = size_t(cryptData.length)
let keyLength = size_t(kCCKeySizeAES128)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes, keyLength,
ivBytes,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")
} else {
print("Error: \(cryptStatus)")
}
return cryptData;
}
如何在此代码中指定CBC模式和
PKCS5Padding
?提前谢谢
最佳答案
AES的块大小始终使用16字节。PKCS5Padding
的块大小定义为8字节。所以你不能使用像AES/CBC/PKCS5Padding
这样的组合。
只有当块大小不超过8字节时,才能使用PKCS5Padding
。
另一件事CCCrypt
是在CBC
模式下工作的默认值,因此在这种情况下不需要提到CBC
模式。举例来说,如果你想ECB
模式,那么你应该提到kCCOptionECBMode
不幸的是,苹果文档没有PKCS5Padding
。当块大小正好为8字节时,可以使用PKCS7Padding
替代PKCS5Padding
。
关于ios - iOS Swift中具有CBC模式的AES 128解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33497348/