<p>免责声明:我无法运行问题代码。除其他事项外,它还不完整,扩展声明丢失。它似乎是Swift 2代码,至少需要更新到Swift 3。在</p>
<p>加密:cryptdata<br/>
&D699D6900美元</p>
<p>是完全错误的,它甚至是长度错误的加密数据块大小的倍数。在</p>
<p>使用PKCS#7填充和CBC模式,加密结果应为:C99A30D8DA44968418E8B66F42790216。见Cyyptomathic<a href="http://extranet.cryptomathic.com/aescalc?key=D5A78C66E9B3ED40B3A92480C732527F1A919FDCF68957D2B7E9218F6221085D&iv=00000000000000000000000000000000&input=68656c6c6f0b0b0b0b0b0b0b0b0b0b0b&mode=cbc&action=Encrypt&output=D325896523E2624EAF273FF7B5AA38DF" rel="nofollow noreferrer">AES CALCULATOR</a>。注意<code>0b0b0b0b0b0b0b0b0b0b0b</code>是PKCS#7填充。在</p>
<p>下面是Swift 3中的一个例子,这是<strong>不是生产的</strong>代码,它至少缺少错误处理。在</p>
<pre><code>func SHA256(string:String) -> Data {
let data = string.data(using:.utf8)!
var hashData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
_ = hashData.withUnsafeMutableBytes {digestBytes in
data.withUnsafeBytes {messageBytes in
CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes)
}
}
return hashData
}
func aesCBCEncrypt(data:Data, keyData:Data, ivData:Data) -> Data {
let cryptLength = size_t(kCCBlockSizeAES128 + data.count + kCCBlockSizeAES128)
var cryptData = Data(count:cryptLength)
var numBytesEncrypted :size_t = 0
let cryptStatus = cryptData.withUnsafeMutableBytes {cryptBytes in
data.withUnsafeBytes {dataBytes in
keyData.withUnsafeBytes {keyBytes in
ivData.withUnsafeBytes {ivBytes in
CCCrypt(CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES),
CCOptions(kCCOptionPKCS7Padding),
keyBytes, keyData.count,
ivBytes,
dataBytes, data.count,
cryptBytes, cryptLength,
&numBytesEncrypted)
}}}}
cryptData.count = (cryptStatus == kCCSuccess) ? numBytesEncrypted : 0
return cryptData;
}
let keyString = "sample_key"
let keyData = SHA256(string:keyString)
print("keyString: \(keyString)")
print("keyData: \(hexEncode(keyData))")
let clearData = hexDecode("68656c6c6f")
// let keyData = hexDecode("d5a78c66e9b3ed40b3a92480c732527f1a919fdcf68957d2b7e9218f6221085d")
let ivData = hexDecode("00000000000000000000000000000000")
print("clearData: \(hexEncode(clearData))")
print("keyData: \(hexEncode(keyData))")
print("ivData: \(hexEncode(ivData))")
let cryptData = aesCBCEncrypt(data:clearData, keyData:keyData, ivData:ivData)
print("cryptData: \(hexEncode(cryptData))")
</code></pre>
<p>输出:</p>
^{pr2}$