使用 CryptoSwift 和 CryptoJS 的 AES 加密
AES encryption using CryptoSwift and CryptoJS
我想尝试使用 CryptoSwift 为 ios 应用程序加密文本,并为 Web 应用程序使用 CryptoJS,它必须在 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 为 ios 应用程序加密文本,并为 Web 应用程序使用 CryptoJS,它必须在 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 将显着改进该系统,而且成本很小。