【问题标题】:Garbage value at the beginning of decrypted text (AES 128 bit) when encrypting from angular 8从角度 8 加密时,解密文本(AES 128 位)开头的垃圾值
【发布时间】:2020-03-26 19:55:10
【问题描述】:

我的后端 AES-128 解密逻辑是正确的,因为当我在 java 中进行 AES-128 加密时,它会正确解密。现在我尝试在 Angular 8 中复制加密逻辑,然后解密的文本现在在初始字节处包含垃圾值,并且剩下的一半字符串是正确的(类似于这个 ��da%:����mL����͔1", "add":"uk","com":"wow"})。

下面是我的加密角度代码

encryptData(value: any) {
    var iv = CryptoJS.enc.Base64.parse(this.generateIV());
    var key = CryptoJS.enc.Hex.parse('0123456789abcdef0123456789abcdef');
    var aesEncrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(value.toString()), key,{
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });

    console.log(JSON.stringify({
                        payloadToken: this.getRSAEncryption("0123456789abcdef0123456789abcdef"), 
                        payloadVariable: aesEncrypted.iv.toString() , 
                        payloadText: aesEncrypted.toString()}
                ));
    return aesEncrypted.toString();

  }

generateIV() {
    var key = "";
    var hex = "0123456789abcdef";

    for (var i = 0; i < 15; i++) {
      key += hex.charAt(Math.floor(Math.random() * 15));
    }
    return key;
  }

以下是我在java中的解密逻辑

public static String packetDecryption(String requestPacket){
      DecryptedTokenPacket decryptedTokenPacket = GSON.fromJson(requestPacket, 
      DecryptedTokenPacket.class);
      SecretKey key2 = new SecretKeySpec(decryptedTokenPacket.getDecData(), 0, 
      decryptedTokenPacket.getDecData().length, EncConstants.ENC_ALGO);
      // Instantiate the cipher
     Cipher cipher = Cipher.getInstance(EncConstants.CBC_ALGO);
     byte[] ivBytes = new Base64().decode(decryptedTokenPacket.getPayloadVariable());
     cipher.init(Cipher.DECRYPT_MODE, key2, new IvParameterSpec(ivBytes));
     byte[] encryptedTextBytes = new Base64().decode(decryptedTokenPacket.getPayloadText());
     byte[] decryptedTextBytes;
     decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
     return new String(decryptedTextBytes);
}

//this function is used in the gateway for decrypting the secret key and then pass through
public DecryptedTokenPacket decryptKeyUsingRSA(EncryptedPacket encryptedPacket){
                Cipher cipher = Cipher.getInstance(RSA_ALGO);
                cipher.init(Cipher.DECRYPT_MODE, privateKey);
                byte[] decData = cipher.doFinal(new Base64().decode(encryptedPacket.getPayloadToken()));
                decryptedTokenPacket.setPayloadText(encryptedPacket.getPayloadText());
                decryptedTokenPacket.setPayloadVariable(encryptedPacket.getPayloadVariable());
                decryptedTokenPacket.setDecData(decData);
return decryptedTokenPacket;
}

豆子

public class DecryptedTokenPacket {
    private String payloadVariable;
    private String payloadText;
    private byte[] decData;
}

public class EncryptedPacket {
    private String payloadVariable;
    private String payloadText;
    private String payloadToken;
}

不确定是什么导致了这个垃圾值的开始。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的 Java 解密代码要求有效负载变量和有效负载文本均为 base64。在您的 Angular 代码中,我看不到任何执行 base64 编码的内容。相反,你只是打电话给toString()。您是否期望它执行 base64 编码,并且它是否记录在案?
  • 我还注意到您正在生成一个 15 个字符的 IV,其中的每个字符都不能是 f。我希望在您的 generateIV 函数中出现的 15 都是 16。也许这就是问题所在?
  • @JonSkeet 感谢您的建议,我尝试删除 toString() 函数,但结果相同。当我在 generateIV 函数中替换所有出现的 15 到 16 时。我收到以下异常“java.security.InvalidAlgorithmParameterException:IV 长度错误:必须为 16 个字节长”。现在我记得这就是我做到 15 岁的原因
  • 我刚刚注意到您正在尝试将 generateIV 的输出视为 base64,但您正在生成十六进制。这是非常错误的。

标签: java angular encryption aes cryptojs


【解决方案1】:

const iv = CryptoJS.lib.WordArray.random(128/8);

【讨论】:

  • 我们希望 iv 采用 base64 编码。 WordArray 是一种不同的格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2015-04-10
  • 2019-08-17
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多