【问题标题】:3DES encryption/decryption works in Windows, throws IllegalBlockSizeException in Linux3DES 加密/解密在 Windows 中有效,在 Linux 中抛出 IllegalBlockSizeException
【发布时间】:2013-04-11 10:17:55
【问题描述】:

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

简单地说,我在 Flex/ActionScript 中加密一个短文本(使用 com.hurlant 库),算法是带有 ECB 和 PKCS5Padding 的 TripleDES。服务器是 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 上是相同的。关键显然是一样的。

我认为这可能是字符集编码问题,但即使使用 -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 端...

有什么想法吗?

提前感谢所有准备用头敲桌子的人,我已经做了很多次了......

干杯

卢卡

【问题讨论】:

  • "algorithm is TripleDES with ECB and PKCS5Padding" 有什么理由选择这种弱加密? ECB 很糟糕,对于小的 64 位块更是如此。
  • 是的,加密的消息只在一个小局域网内传播。如果需要,将使用更强大的东西。不过还是谢谢!

标签: java apache-flex encryption tripledes


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是功能齐全的 Java 代码:

    byte[] userPin3DESEncrypted = 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多