【问题标题】:DES Encryption on Blackberry gone wrong黑莓上的 DES 加密出错了
【发布时间】:2013-07-08 07:14:27
【问题描述】:

我有一个在 BlackBerry JDE 5.0.0 上开发的应用程序,它使用 DES 算法和 ECB 模式加密字符串。加密后,结果采用base64编码。但是,每当我将我的加密方法得到的结果与我在在线加密引擎上得到的结果进行比较时,它总是在最后几个字符上给出不同的结果。我试图解密我使用在线加密器引擎从我的加密方法中获得的结果,看起来结果不是有效的。那么如何解决最后几个字符的不同结果呢?

这里是我的加密方法代码:

public String encryptDESECB(String text) throws MessageTooLongException
{
    byte[] input = text.getBytes();
    byte[] output = new byte[8];
    byte[] uid = null;
    uid = "431654625bd37673e3b00359676154074a04666a".getBytes();
    DESKey key = new DESKey(uid);
    try {
            DESEncryptorEngine engine = new DESEncryptorEngine(key);
            engine.encrypt(input, 0, output, 0);
            String x= BasicAuth.encode(new String(output));
            System.out.println("AFTER ENCODE"+x);
            return new String(x);
    } catch (CryptoTokenException e) {
        return "NULL";
    } catch (CryptoUnsupportedOperationException e) {
        return "NULL";
    }
}

我要加密的字符串是“00123456” 我从我的加密方法得到的结果是:YnF2BWFV/8w= 我从在线加密引擎 (http://www.tools4noobs.com/online_tools/encrypt/) 得到的结果:YnF2BWFV9sw= 我从 android 得到的结果(使用相同的加密算法和方法):YnF2BWFV9sw=

这是 Android 上的代码:

public static String encryptDesECB(String data) {
    try {
        DESKeySpec keySpec = newDESKeySpec("431654625bd37673e3b00359676154074a04666a".getBytes("UTF8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(keySpec);

        // ENCODE plainTextPassword String
        byte[] cleartext = data.getBytes("UTF8");

        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        Logger.log(Log.INFO, new String(cipher.doFinal(cleartext)));

        String encrypedPwd = Base64.encodeToString(cipher.doFinal(cleartext), Base64.DEFAULT);

        Logger.log(Log.INFO, encrypedPwd);

        return encrypedPwd;

    } catch (Exception e) {
        Logger.log(e);
        return null;
    }
}

谁能帮我解决这个问题?

【问题讨论】:

  • 我不太确定。我认为上面的代码没有使用任何填充。实际上我之前尝试添加 PKCS5FormatterEngine 和 PKCS7FormatterEngine 但我得到的字符串结果(来自 PKCS5 或 PKCS7)与上面的代码相同。
  • 这就是我的意思:DES 加密需要填充到某个倍数(如果我没记错的话)
  • ECB 模式不安全。请改用 CBC 或 CTR 模式。维基百科上有一个很好的说明(字面意思)ECD 的故障:en.wikipedia.org/wiki/…

标签: java encryption blackberry-jde des ecb


【解决方案1】:

这很可能是由填充引起的,因为 DES 使用 8 字节块。

欲了解更多信息,请查看此链接:

http://www.tero.co.uk/des/explain.php#Padding

只要你能正确解密内容就可以了。

【讨论】:

  • 感谢您的回答。我已经能够在黑莓 JDE 5.0.0 上正确解密内容,但问题是我需要将它产生的字符串(首先使用 base64 编码)作为 PIN 传递给服务器。我认为服务器无法正确解密加密的字符串,因为它总是拒绝我提供的 PIN。所以我认为这可能与我在将黑莓 JDE 与 Android 和在线加密引擎进行比较后得到的不同结果有关。那么,有什么建议吗?
【解决方案2】:

我发现了我的错误。事实证明,我的 BasicAuth 类不是对加密字符串进行编码的正确类。现在我使用正确的 Base64 类进行编码,结果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多