使用CryptoSwift和CryptoJS进行AES加密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CryptoSwift和CryptoJS进行AES加密相关的知识,希望对你有一定的参考价值。
我是尝试使用CryptoSwift for ios应用程序加密文本,使用CryptoJS加载Web应用程序,必须在Java平台上解密。我可以使用以下代码在javascript中成功加密。
var message = "Hello"
var password = "samplepasswordky"
function encrypt(message, password) {
var salt = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
var key = CryptoJS.PBKDF2(pass, salt, {
keySize: keySize/32,
iterations: iterations
});
var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
var encrypted = CryptoJS.AES.encrypt(msg, key, {
iv: iv
});
var encryptedMessage = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
return encryptedMessage;
}
对于CryptoSwift中的相同,我正在执行以下操作,但我无法解密Java中的文本。
let salt: [UInt8] = Array("0000000000000000".utf8)
let password: [UInt8] = Array("samplepasswordky".utf8)
let iv: [UInt8] = Array("0000000000000000".utf8)
let derivedKey = try! PKCS5.PBKDF2(password: password, salt: salt , iterations: 100, keyLength: 16, variant: .sha1).calculate()
let encrypted = try! AES(key: derivedKey, blockMode: CBC(iv: iv), padding: .pkcs5).encrypt(input)
print(encrypted.toHexString())
请帮助我完成这项工作。
这一行:
var salt = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
与此行不同:
let salt: [UInt8] = Array("0000000000000000".utf8)
“0000000000000000”的utf8编码为十六进制,30303030303030303030303030303030(0x30是字符“0”的UTF-8编码)。
你在这里使用的是Array(repeating: UInt8(0), count: 16)
。
您还在JavaScript中输出Base64字符串,在Swift中输出十六进制字符串,这些字符串不同。
不相关的附注:
这种实现非常难以获得很少的安全性。如果您的密码是静态的,您可以通过使用随机密钥(即32个完全随机的字节0-255,而不是字符串)来做得更好。除了减慢系统速度(不会减慢攻击者的速度;只是你的应用程序)之外,PKBDF2在这里并没有真正为你买多少。添加随机IV将显着改善该系统,并且成本很低。
以上是关于使用CryptoSwift和CryptoJS进行AES加密的主要内容,如果未能解决你的问题,请参考以下文章
php中的AES加密,然后用Javascript(cryptojs)解密
致命错误:“试试!”表达式意外引发错误:CryptoSwift.AES.Error.BlockSizeExceeded: