【问题标题】:Cryptojs Scala to JS encryption doesn't work, but the other way works wellCryptojs Scala 到 JS 加密不起作用,但另一种方式效果很好
【发布时间】:2015-08-04 04:34:56
【问题描述】:

Scala 到 Scala 运行良好,JS 到 Scala 运行良好。但它不适用于 Scala 到 JS。但是,如果我在 Scala 中加密了一个简单的 Json,例如:{"name": "dung"},它会运行良好。

Scala 代码:

  def encryptData(data: String) = {
    val saltBytes = Array[Int](0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x78, 0x90, 0x12, 0x34, 0x90, 0x12, 0x34, 0x56) map {_.asInstanceOf[Byte]}
    val ivBytes = Array[Int](0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56) map {_.asInstanceOf[Byte]}
    val ivParamSpec = new IvParameterSpec(ivBytes)
    val secretKey = genSecretKey("somekey", saltBytes)
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParamSpec)
    val encryptedData = cipher.doFinal(data.getBytes("UTF-8"))
    val encodedData = (new BASE64Encoder()) encodeBuffer(encryptedData)
    Json.obj(
              "salt" -> DatatypeConverter.printHexBinary(saltBytes),
              "iv" -> DatatypeConverter.printHexBinary(ivBytes),
              "data" -> encodedData
            )
  }

  def decryptData(encryptedData: EncryptedData) = {
    val saltBytes = DatatypeConverter.parseHexBinary(encryptedData.salt)
    val ivBytes = DatatypeConverter.parseHexBinary(encryptedData.iv)
    val ivParamSpec = new IvParameterSpec(ivBytes)
    val secretKey = genSecretKey("somekey", saltBytes)
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParamSpec)
    val decodedValue = (new BASE64Decoder()) decodeBuffer(encryptedData.data)
    val decryptedData = new String(cipher.doFinal(decodedValue))
    decryptedData
  }

Javascript 代码:

function encrypt(data) {
  var salt = CryptoJS.lib.WordArray.random(128/8);
  var iv = CryptoJS.lib.WordArray.random(128/8);
  var secretKey = "somekey";
  var key128Bits100Iterations = CryptoJS.PBKDF2(secretKey, salt, { keySize: 128/32, iterations: 100 });
  var encrypted = CryptoJS.AES.encrypt(JSON.stringify(data), key128Bits100Iterations, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7  });

  return {
      salt: String(salt),
      iv: String(iv),
      data: String(encrypted)
  };
}

function decrypt(obj) { 
    var salt = CryptoJS.enc.Hex.parse(obj.salt);
    var iv = CryptoJS.enc.Hex.parse(obj.iv);
    var encrypted = obj.data;
    var key = CryptoJS.PBKDF2("somekey", salt, { keySize: 128/32, iterations: 100 });
    var decrypt = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    return decrypt.toString(CryptoJS.enc.Utf8);
}

【问题讨论】:

    标签: javascript scala encryption cryptography cryptojs


    【解决方案1】:

    问题是编码的字符串有一个由这个问题引起的换行符。 Carriage return issue decoding Base64 from Java and sending to browsersun的Base64Encoder切换到org.apache.commons.codec.binary.Base64后,问题就没有了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多