java - 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>
解决方案
我找到了解决方案,正在使用 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);
}
推荐阅读
- rally - App-debug.html 在 eu1.rallydev.com 上不起作用
- django - 反应 django 渲染相同的内容
- python-3.x - 将 putty 终端与 tkinter 一起嵌入
- android - 根据 id 从 Firebase 获取单个值
- java - 在 Hibernate 中加密特定列:如何处理现有数据以及如何正确实现 @ColumnTransformer?
- c# - 过程间污点分析
- mysql - MySQL 查询以选择仅选择一个类别的用户
- python - Python:将字典转换为字节
- php - 即使在链接之后 SQL 也不会更新(使用 PHP)
- ssl - 如何配置在 erlang OTP 21.3 上运行的 rabbitmq3.7.11 以使用 ssl 连接 python 2.7.5 应用程序客户端