【问题标题】:PHP and JAVA Encryption And Decryption RoutinesPHP和JAVA加解密例程
【发布时间】:2017-02-09 20:06:05
【问题描述】:

我有以下 PHP 例程来加密我与客户端的通信:

public static function encrypt($input, $key) {
        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); 
        $input = AES::pkcs5_pad($input, $size); 
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); 
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
        mcrypt_generic_init($td, $key, $iv); 
        $data = mcrypt_generic($td, $input); 
        mcrypt_generic_deinit($td); 
        mcrypt_module_close($td); 
        $data = base64_encode($data); 
        return $data; 
} 

以及以下 Java 例程来解密我与服务器的通信:

public static String decrypt(String input, String key) {
        byte[] output = null;
        try {
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skey);
            output = cipher.doFinal(Base64.decode(input,Base64.NO_WRAP));
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return new String(output);
}

为什么下面的解密例程会抛出异常?

java.lang.IllegalArgumentException:bad base-64

编辑:将字符串硬编码到代码中后,我得到了 BadPaddingException。

我对解密函数的输入:

wrmRa2hAoseNOev6/ascapxkLQRGX/GW3DQm3ETwBH7gJm1NetkgGFzgY4kZTE10Tv45YIcy/xoodq/GumSY5hsao1s4bkuKXZeim/IDTVr3elrqX13b81/XE5iB3iJrAqny2dQ5SsWso0lUcAZGS2Wls/lTeQiIKXEaOh7iZZ3xOtM6633iNcoiFxEnX5A0dMrdRNEOkmQ3UnQmuIGTSv0RLKuPv5r5dplGZ3N2LMMpoB0AMu3DSXFEdiD4XN49

【问题讨论】:

  • @USKMobility,尝试单独使用 URL_SAFE 并不起作用,尝试现在建议的答案。
  • 尝试观察您的输入字符串是否包含非 base64 字符
  • @USKMobility 我的输入字符串直接来自 PHP 函数,它会不会生成非 Base64 字符?
  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuseRNCryptor,它们提供了完整的解决方案并且正在维护并且是正确的。

标签: java php android encryption aes


【解决方案1】:

您可能需要使用:

Base64.decode(input,Base64.NO_WRAP|Base64.URL_SAFE)

您也可能需要不同的标志组合。

这还取决于您如何获取 base64 字符串。有时,如果从 URL 或其他在线来源传输,“+”会转换为“”(空格)。

【讨论】:

  • 我仍然得到bad-base64,我在php脚本上加密的字符串是不变的,它是一个包含不会改变的javascript的字符串。
  • 在没有看到 base64 字符串或确切知道如何传输 base64 字符串的情况下,我只能猜测。我猜这可能不是你想分享的东西,但也许你可以做一个同样产生错误的测试用例,你可以分享。
  • 我得到了通常的 base64 字符串,没有坏字符,这没有意义。
  • 这对我来说很有意义 - 这完全取决于传输方法。只是为了好玩/调试,您可以通过将 base64 字符串硬编码到您的 Java 中来进行测试,看看它是否有效。 Wikipedia article 也可能有帮助。
  • 我按照您的建议进行了硬编码,现在我得到了一个 BadPaddingException,还将 base64 字符串添加到线程并使用您的 Base64.NO_WRAP | Base64.URL_SAFE 导致 bad-base64 异常,有什么想法吗?
猜你喜欢
  • 2011-04-29
  • 2018-01-20
  • 2013-03-16
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多