【发布时间】:2021-10-19 06:07:33
【问题描述】:
我正在构建一个 IOS 应用程序,它与 JS 通信。所以两端的通信必须加密。所以我的主要意图是从Javascript端加密并将其发送到IOS 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 快速解密这些加密数据。由于这是纯 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在加密后返回的那个(例如:encryptedData)也不相似。请任何人详细说明这一点并提供解决方案将不胜感激。
【问题讨论】:
标签: javascript swift react-native aes commoncrypto