【发布时间】:2017-04-17 14:37:12
【问题描述】:
我正在尝试使用以下代码使用 128 密钥解密消息。这是字符串的扩展:
func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters),
cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {
let keyLength = size_t(kCCKeySizeAES128)
let operation: CCOperation = UInt32(kCCDecrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(options)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyData.bytes, keyLength,
nil,
data.bytes, data.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
let unencryptedMessage = String(data: cryptData, encoding:NSUTF8StringEncoding)
return unencryptedMessage
}
else {
return nil
}
}
return nil
}
对于输入向量 (iv),我使用 nil 值。 存在 crypData 但我无法正确阅读,并且 unencryptedMessage 也为零。在线工具会通知数据不正确,但在后端它工作正常。
键值和消息值是base64Url。
用法:
let decryptedMessage = message.aesDecrypt(keyTodecrypt, iv: nil)
斯威夫特 2.3
【问题讨论】:
-
没有用于 AES 加密的标准设置或格式。除非您可以准确地描述加密器是如何构建消息的,否则您无法解密它。你有加密代码吗?
-
您注意到密钥是 Base64 编码的(至少我认为这就是“base64Url”的意思)。但是您将其解码为 utf-8。这可能是您的主要问题,但肯定还有更多问题。
-
@zaph 我的意思是输入值是正确的,并且后端能够使用 java 库对其进行解密。而且是 ECB 模式,而不是 CBC。
-
@AntonKashpor 我说的是键。你是这样解码的:
keyData = key.dataUsingEncoding(NSUTF8StringEncoding)。这会将密钥解码为 UTF-8,而不是 Base-64。 -
仅当数据以 utf-8 编码时。如果您正在解码 Base64,那么您需要
Data.init(base64Encoded:options:)。没有将任意字符串转换为数据的“通用”方法。您必须使用其编码的系统进行解码。
标签: ios swift encryption aes commoncrypto