我正在构建一个IOS应用程序,它与JS通信。因此,两端之间的通信必须加密。所以我的主要意图是从Javascript端进行加密,然后发送到IOS应用的移动端,移动应用对数据进行解密。这就是我在Javascript方面所做的,它像预期的那样工作良好,
const key = CryptoJS.enc.Utf8.parse("MY SECRET KEY 123");
const iv = CryptoJS.enc.Utf8.parse("ui09ji884uh88984");
var encrypted = CryptoJS.AES.encrypt("Hello world",key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: iv
});
console.log("Encrypted data ="+encrypted);
问题是我如何使用CommonCrypto在swift中解密此加密数据。由于这是纯base64文本,我们如何将其提供给解密?到目前为止,我在swift中所做的代码张贴在下面,
func testCrypt(data data:[UInt8], keyData:[UInt8], ivData:[UInt8], operation:Int) -> [UInt8]? {
let cryptLength = size_t(data.count+kCCBlockSizeAES128)
var cryptData = [UInt8](repeating: 0, count:cryptLength)
let keyLength = size_t(kCCKeySizeAES128)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(CCOperation(operation),
algoritm,
options,
keyData,
keyLength,
ivData,
data,
data.count,
&cryptData,
cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
// cryptData.remove
cryptData.removeSubrange(numBytesEncrypted..<cryptData.count)
} else {
print("Error: (cryptStatus)")
}
return cryptData;
}
这是我调用上面方法的方式,
let message = "Hello world"
let messageData = Array(message.utf8)
let keyData = Array("MY SECRET KEY 123".utf8)
let ivData = Array("ui09ji884uh88984".utf8)
let str = ".."//THIS IS THE ENCRYPTED TEXT FROM JS
let buf = Array(str.utf8)
print("BUFF: ", buf)
let encryptedData = testCrypt(data:messageData, keyData:keyData, ivData:ivData, operation:kCCEncrypt)!
let decryptedData = testCrypt(data:encryptedData, keyData:keyData, ivData:ivData, operation:kCCDecrypt)!
var decrypted = String(bytes:decryptedData, encoding:String.Encoding.utf8)!
如果我们同时进行加密和解密,并传递加密的字节数组进行解密,则可以正常工作。但是,当我尝试将加密文本转换为字节数组并将其传递给它时,会发生异常。也是我转换的(例如:但是)和加密后的testCrypt返回(例如:encryptedData)是不相似的。谁能详细说明并提供解决方案,我将不胜感激。
好的,我发现了问题。在将其转换为UInt8数组之前,您需要将其转换为数据对象,然后将其转换为UInt8数组进行馈送。swift中的代码应该是这样的
let str = "SJeOvypKWad9GzUD2GHRig=="
let data = Data(base64Encoded: str);
let buf: [UInt8] = Array(data!)