2016-10-01 172 views
4

我有以下的PHP程序加密我与客户沟通:PHP和Java加密和解密例程

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 rotuine解密用服务器我的沟通:

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异常:坏基64

编辑:硬编码字符串转换成我得到一个BadPaddingException代码后。

我输入解密功能:

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

http://stackoverflow.com/questions/23241257/bad-base-64-error – USKMobility

+0

@USKMobility,尝试单独使用URL_SAFE,它不起作用,尝试现在建议的答案。 – Keddy1201

+0

尝试观察你的输入字符串有非base64字符 – USKMobility

回答

1

这可能是你需要使用:

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

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

它也取决于你如何获得base64字符串。有时,如果从网址或其他在线来源转移“+”,则会将其转换为“(空格)”。

+0

我还是得到了bad-base64,我在php脚本中加密的字符串是常量,它是一个包含javascript的字符串,它不会改变。 – Keddy1201

+0

没有看到base64字符串或完全知道你如何传输base64字符串,我只能猜测。我猜这可能不是你想分享的东西,但也许你可以做一个测试用例,也会产生错误,你可以分享。 – Tigger

+0

我得到通常的base64字符串没有不好的字符,这是没有道理的。 – Keddy1201