首页 > 解决方案 > Datapower加密文本CBC算法的解密值由java中的输入和不需要的字符组成

问题描述

我正在尝试使用以下代码从 Java 中的数据功率中解密加密文本。我正在使用对称密钥机制。下面的代码能够解密数据,但给我一个带有不需要字符的数据,后跟纯文本。我试图对 16 个字符的响应进行子串化,但我发现并非所有解密的文本都具有相同的不需要的字符。你能帮我解决这个问题吗?感谢您的回复。


public String decrypt(String encryptedText, String basekey){

byte[] encryptedTextByte = DatatypeConverter.parseBase64Binary(encrypted text);

byte[] key = Base64.getDecoder().decode(base64Key.getBytes());

byte[] IV = new byte[16];

IvParameterSpec ivSpec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding);

 SecretKeySpec secret = new SecretKeySpec(key, "AES");

cipher.init(Cipher.DECRYPT_MODE, secret, ivSpec);

return new String(cipher.doFinal(encryptedTextByte));

}

datapower 中的加密逻辑

<xsl:variable name="ciphertext">
  <xsl:value-of select="dp:encrypt-data($algorithm,$session-key,$node)"/>
</xsl:variable>

标签: javaaesencryption-symmetriccbc-mode

解决方案


我找到了解决方案,正在使用 16 的子字符串来删除填充。但理想情况下,我应该删除字节。因此,在转换为字符串之前,我将删除多余的字节,然后将其转换为字符串。所以,我只有纯文本。

public String decrypt(String encryptedText, String basekey){

byte[] encryptedTextByte = DatatypeConverter.parseBase64Binary(encrypted text);

byte[] key = Base64.getDecoder().decode(base64Key.getBytes());

byte[] IV = new byte[16];

IvParameterSpec ivSpec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding);

 SecretKeySpec secret = new SecretKeySpec(key, "AES");

cipher.init(Cipher.DECRYPT_MODE, secret, ivSpec);

byte[] decryptedBytes = cipher.doFinal(encryptedTextByte);

// Removing extra characters here

byte[] plainBytes = Arrays.copyOfRange(decryptedBytes, 16, decryptedBytes.length);

return new String(plainBytes);

}

推荐阅读