使用CryptoSwift和CryptoJS进行AES加密

时间:2018-10-13 18:58:14

标签: swift encryption cryptojs cryptoswift

我正尝试使用ios应用程序的CryptoSwift和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())

请帮助我完成这项工作。

1 个答案:

答案 0 :(得分:2)

此行:

var salt = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");

与此行不同:

let salt: [UInt8] = Array("0000000000000000".utf8)

utf8编码的“ 0000000000000000”以十六进制表示30303030303030030303030303030303030(0x30是字符“ 0”的UTF-8编码)。

您打算在这里使用Array(repeating: UInt8(0), count: 16)

您还将在JavaScript中输出Base64字符串,在Swift中输出十六进制字符串,

不相关的旁注:

此实现非常努力以获取很少的安全性。如果您的密码是静态的,则可以使用随机密钥(即32个完全随机的字节0-255,而不是字符串)来做得更好。 PKBDF2除了在降低系统速度(不降低攻击者的速度;只是降低您的应用程序的速度)之外,在这里并没有给您带来太多好处。添加随机IV可以显着改善该系统,而且成本低。