【问题标题】:Unable to Decrypt String in angular which is Encrypted in java无法解密在java中加密的角度字符串
【发布时间】:2021-09-11 17:05:45
【问题描述】:

我尝试在 java 中加密一些消息,但是当我尝试将其解密为 Angular 时,它没有给出任何正确的输出。

需要在 Angular 中进行哪些更改才能解密消息?

这是我的 Java 代码:

public class AesBase64Wrapper{
    
    private static char[] password = "EF737CC29DAE7C80644A5B01544CBA61".toCharArray();
    private static byte iv[];
    static {
        try {             
            iv = getBytes("79994A6EF73DA76C");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static String encryptAndEncode(String raw,String salt)
    {
        try
        {
            Cipher c = getCipher(1,salt);
            byte[] encryptedVal = c.doFinal(getBytes(raw));
            return Base64.getEncoder().encodeToString(encryptedVal);
        }
        catch (Throwable t)
        {
            throw new RuntimeException(t);
        }
    }
  
    public static String decodeAndDecrypt(String encrypted,String salt) throws Exception
    {
        byte[] decodedValue = Base64.getDecoder().decode(encrypted);
        Cipher c = getCipher(2,salt);
        byte[] decValue = c.doFinal(decodedValue);
        return new String(decValue);
    }
  
    private static byte[] getBytes(String str) throws UnsupportedEncodingException
    {
        return str.getBytes("UTF-8");
    }
    
    private static Cipher getCipher(int mode,String salt)throws Exception
    {

        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(mode, generateKey(salt), new IvParameterSpec(iv));
        return c;
    }
  
  
    private static Key generateKey(String salt) throws Exception
    {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

        byte[] saltb = getBytes(salt);
    
        KeySpec spec = new PBEKeySpec(password, saltb, 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        return new SecretKeySpec(tmp.getEncoded(), "AES");
    }
  
    
    
}

这个是有棱角的:

export class PrepaidCryptoService {

  Key_IV = "79994A6EF73DA76C";
  PASSWORD = "EF737CC29DAE7C80644A5B01544CBA61";
  SALT = "12345";
  finalEncryption;
  constructor() {
  }

  encoder(str) {
    let encoder = new TextEncoder();
    let byteArray = encoder.encode(str)
    return CryptoJS.enc.Utf8.parse(str)
  }

  toWordArray(str) {
    return CryptoJS.enc.Utf8.parse(str);
  }

  encrypt(value) {

      var key = CryptoJS.PBKDF2(this.PASSWORD, this.SALT, {
        keySize : 256, 
        iterations: 65536
      })
      var iv = CryptoJS.enc.Hex.parse(this.Key_IV);
      var encrypted = CryptoJS.AES.encrypt(this.encoder(value), key, {
        iv: this.toWordArray(iv),
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC
      })

      return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    }


  decrypt(value) {
 
    var key = CryptoJS.PBKDF2(this.PASSWORD, this.SALT, {
       keySize : 256,
      iterations: 65536
    })
     var iv =  CryptoJS.enc.Utf8.parse(this.Key_IV)
    var decrypted = CryptoJS.AES.decrypt(value, key, {
      iv: this.toWordArray(iv),
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.CBC
    })

    return decrypted.toString(CryptoJS.enc.Utf8);

  }

}

我尝试了几种不同的方法,但这个问题仍然存在。

【问题讨论】:

  • 在 Java 代码中,IV 是 Utf8 编码的,在 JavaScript 代码中,它是 Utf8 编码的两次(但仅在 decrypt() 中;在 encrypt() 中,它先是十六进制解码,然后是 Utf8 编码)。此外,在 CryptoJS 代码中,PBKDF2 期望密钥大小为 words 而不是 bits(这可能会生成错误的密钥)。
  • @user9014097 您能否建议如何处理 PBKDF2 密钥大小?
  • 申请keySize: 256/32,而不是keySize: 256
  • @user9014097 感谢您的帮助,它现在对我有用

标签: java angular encryption aes salt


【解决方案1】:

我只是在我的角度代码中更新以下方法,它对我有用:

encrypt(value) {
    var key = CryptoJS.PBKDF2(this.PASSWORD, this.SALT, {
      keySize: 256 / 32,
      iterations: 65536
    })
    var encrypted = CryptoJS.AES.encrypt(this.encoder(value), key, {
      iv: this.toWordArray(this.Key_IV),
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.CBC
    })
    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
  }

  decrypt(value) {
    var key = CryptoJS.PBKDF2(this.PASSWORD, this.SALT, {
      keySize: 256 / 32,
      iterations: 65536
    })
    var decrypted = CryptoJS.AES.decrypt(value, key, {
      iv: this.toWordArray(this.Key_IV),
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.CBC
    })
    return decrypted.toString(CryptoJS.enc.Utf8);
  }
}

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2019-02-07
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多