java - 3DES 加密/解密在 Windows 中有效,在 Linux 中抛出 IllegalBlockSizeException

标签 java apache-flex encryption tripledes

我最近尝试将 Flex/Java 软件解决方案从 Windows 迁移到 Linux(CentOS6 64 位),但遇到了这个问题。

简而言之,我在 Flex/ActionScript(使用 com.hurlant 库)中加密短文本,算法是 TripleDES with ECB 和 PKCS5Padding。服务器为JBoss 5.1.0GA。

然后将此加密文本发送到 JMS 目的地。

在 JMS 的接收端有一个简单的 Java 应用程序(使用 BouncyCaSTLe)尝试解密文本。

所有这些在 Windows 上都非常有效。 在 Linux 上我得到这个:

javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA13*..)

我记录了 Java 应用程序收到的加密文本(以 Base64 编码),它在 Linux 和 Windows 上都是相同的。 key 显然是相同的。

我认为这可能是字符集编码问题,但即使使用 -Dfile.encoding=UTF8 或 -Dfile.encoding=windows-1252 选项启动 JBoss 和 Java 应用程序也不起作用。

这里是用于加密的代码(ActionScript):

var keyData:ByteArray = Hex.toArray(Hex.fromString("jgd8f3m8ybjhwlGhr4hihbp0"));
var pinData:ByteArray = Hex.toArray(Hex.fromString("12341234"));
var pad:IPad = new PKCS5;
var mode:ICipher = Crypto.getCipher("simple-3des-ecb", keyData, pad);
pad.setBlockSize(mode.getBlockSize());               
mode.encrypt(pinData);
var message:IMessage = new AsyncMessage();
message.body = Base64.encodeByteArray(pinData);

这里是用于解密的代码(Java):

String userPin3DESEncrypted = new String(Base64.decodeBase64(userPin3DESBase64Encrypted.getBytes()));
byte [] keyByte = "jgd8f3m8ybjhwlGhr4hihbp0".getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyByte, "DESEDE");
Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
String userPinDecrypted = new String(cipher.doFinal(userPin3DESEncrypted.getBytes()));

如前所述,userPin3DESBase64Encrypted 的内容在 Linux 和 Windows 上是相同的(相同的 Base64 字符串),因此问题不应该出在 Flex/JBoss 端...

有什么想法吗?

提前感谢所有将要用头敲 table 的人,就像我已经做过很多次一样...

干杯

卢卡

最佳答案

从 Base64 解码的加密(即二进制)数据创建字符串是错误的想法。 对所有二进制数据使用 byte[]。

关于java - 3DES 加密/解密在 Windows 中有效,在 Linux 中抛出 IllegalBlockSizeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15946259/

相关文章:

java - 如何使用 Flex 对数据网格中的 dd/mm/yy 日期格式进行排序?

delphi - 在Delphi中压缩和加密

C# <-> PHP 动态 AES key 交换

javascript - 如何使用 openpgp.js 加密字符串?

java.sql.BatchUpdateException : Unknown column 'xxx' in 'field list'

java - 如何使用 BeanUtils 转换器来列表?

java - Android Studio或Eclipse使用Maven/Gradle

apache-flex - 如何为 Flex Datagrid 制作可重复使用的 labelFunction?

php - 将 flex/php 连接到 Active Directory

java - 在 spring-boot 上没有带 jetty 的有效 keystore