如何使用 CommonCrypto 在 swift 中解密
How to decrypt in swift using CommonCrypto
我正在构建一个 IOS 应用程序,它与 JS 通信。所以两端之间的通信必须加密。所以我的主要意图是从Javascript端加密,然后发送到IOSapp移动端,移动端app应该解密数据。这就是我在 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)!
如果我们同时进行加密和解密并将加密的字节数组传递给解密,这就可以正常工作。但是当我尝试将加密文本转换为字节数组并将其传递给它时,会发生异常。还有我转换的那个(例如:buf)和加密后的 testCrypt returns(例如:encryptedData)不相似。请任何人详细说明并提供解决方案将不胜感激。
好的,我发现了问题。在将其转换为 UInt8 数组之前,您需要将其转换为数据对象,然后将其转换为 UInt8 数组以进行馈送。所以 swift 中的代码应该是这样的,
let str = "SJeOvypKWad9GzUD2GHRig=="
let data = Data(base64Encoded: str);
let buf: [UInt8] = Array(data!)
我正在构建一个 IOS 应用程序,它与 JS 通信。所以两端之间的通信必须加密。所以我的主要意图是从Javascript端加密,然后发送到IOSapp移动端,移动端app应该解密数据。这就是我在 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)!
如果我们同时进行加密和解密并将加密的字节数组传递给解密,这就可以正常工作。但是当我尝试将加密文本转换为字节数组并将其传递给它时,会发生异常。还有我转换的那个(例如:buf)和加密后的 testCrypt returns(例如:encryptedData)不相似。请任何人详细说明并提供解决方案将不胜感激。
好的,我发现了问题。在将其转换为 UInt8 数组之前,您需要将其转换为数据对象,然后将其转换为 UInt8 数组以进行馈送。所以 swift 中的代码应该是这样的,
let str = "SJeOvypKWad9GzUD2GHRig=="
let data = Data(base64Encoded: str);
let buf: [UInt8] = Array(data!)