android - 如何使用 crypto-js 以与在 Angular 中相同的方式在 android 中加密数据

标签 android angular encryption aes cryptojs

使用 crypto-js 的 Angular 代码:

let key = '12345123451234512345123451234509';// actual keys are different and has same length of 32 char
let iv = '12345123451234512345123451234509';

let secret_key = CryptoJS.enc.Hex.parse(key);
let secret_iv = CryptoJS.enc.Hex.parse(iv);
let encryptedString = CryptoJS.AES.encrypt(
    JSON.stringify(data),
    secret_key,
    {
      iv: secret_iv,
      padding: CryptoJS.pad.ZeroPadding
    }
 ).toString();

let requestObj = {
    input: encryptedString.trim()
  }

我无法在 android 中进行相同的加密。 安卓代码

String key32Char = "12345123451234512345123451234509";
String iv32Char = "12345123451234512345123451234509";
byte[] srcBuff = jsonString.getBytes("UTF-8");

//SecretKeySpec secretKeySpec = new SecretKeySpec(key32Char.getBytes(), "AES");
//IvParameterSpec ivParameterSpec = new IvParameterSpec(iv32Char.getBytes());

SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.decode(key32Char, Base64.NO_WRAP), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.decode(iv32Char, Base64.NO_WRAP));

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] dstBuff = cipher.doFinal(srcBuff);
String encryptedString = Base64.encodeToString(dstBuff, Base64.NO_WRAP);

JSONObject requestObj = new JSONObject();
requestObj.put("input", encryptedString);
  1. CryptoJS.enc.Hex.parse(key) 行的作用是什么?
  2. 如何做同样的加密?

最佳答案

  1. IV 和 Key:要匹配 key 和 IV 部分都必须使用 base64 或 hex 解码。

    在十六进制编码的字符串中,有 32 个十六进制字符组成 128 位。但是,base64 解码可能会拒绝相同的字符串,如果不拒绝,输出将不是 128 位。你需要使用

    byte[] bytes = new BigInteger("7F" + str, 16).toByteArray();
    SecretKeySpec key = new SecretKeySpec(bytes, 1, bytes.length-1, "AES");
    

    转换hex string into byte array .

  2. padding:CryptoJS.pad.ZeroPadding 如果你的数据大小是 128 的整数倍,那么很有用。否则,你需要使用这个参数来表示我将使用它来测试我的新填充方案。您需要更好地使用默认的 Pkcs7

    在 Java 中你需要 getInstance("AES/CBC/PKCS5Padding");

  3. 操作方式:JS中默认为CBC,因此Java中需要相同,如上getInstance("AES/CBC/PKCS5Padding");

  4. 输出:要比较您需要看到相同结果的输出。在 Java 中,您将输出转换为 base64,因此您需要 same for JS .

如您所见,您必须为两者执行相同的步骤和参数。

请注意:CBC 模式是过时的,您应该更喜欢经过身份验证的加密模式,例如 AES-GCM 或 ChaCha20-Poly1305。它们不仅提供 secret 性,还提供完整性和身份验证。不幸的是,crypto-js 没有 have them .但是你可以使用一些 other JS libraries为此。

关于android - 如何使用 crypto-js 以与在 Angular 中相同的方式在 android 中加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59088908/

相关文章:

android - Android Studio 1.5.1 Gradle构建缓慢

java - Android - ProgressBar setProgress() 方法不更新进度条可绘制对象

android - java中int字节转字符串

javascript - 在单个结果页面上显示 JSON 索引时出错

javascript - 为什么文本在使用 toEqual 时不匹配 Angular ?

java - httpd和tomcat之间的通信安全吗?

java - Eclipse和intelliJ android SDK问题

angular - 基类解析器的组件继承和 DI

java - 同一类设计的加密/解密版本

java - 相当于java中的OpenSSL命令