2012-08-23 39 views
2

我需要使用密钥在android中加密某些文本。在PHP中的加密代码看起来像这样Android中的base64和mcrypt_encrypt

$this->securekey = hash('sha256',$textkey,TRUE); 
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM); 
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB, $this->iv)); 

对于Base64的加我从apache.org(公地编解码器1.6.jar)NetBeans中的公共编解码器,我的Android应用程序。代码中没有错误。但是当我运行应用程序并调用使用编解码器的函数时,应用程序会停止并需要关闭。

在logcat的说:

Android Runtime: java.lang.NoSuchMethodError: 
org.apache.commons.codec.binary.Base64.decodeBase64 

这里是我的代码:

public static String crypt(String input, String key){ 
      byte[] crypted = null; 
      try{ 
       SecretKeySpec skey = new SecretKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(key), "AES"); 
       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
       cipher.init(Cipher.ENCRYPT_MODE, skey); 
       crypted = cipher.doFinal(input.getBytes()); 
      }catch(Exception e){ 
      } 
      return org.apache.commons.codec.binary.Base64.encodeBase64String(crypted); 
     } 

我不知道如果我的代码做同样的加密作为PHP代码。我发现Android和PHP之间的链接为http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php,但它不使用Base64,仅用于mcrypt_encrypt。任何人都可以帮助我获得与PHP服务器相同的加密。

在此先感谢。

+0

首先,如果我的生活依赖于密码相关的信息,我不会相信“android snippets”。可怕的东西。 –

回答

-1

您的错误仅仅是因为您忘记将Apache编解码器库添加到运行时环境中。只是编纂它是不够的;图书馆需要在Android设备上实际上目前

您无法使用默认Java库在Android上获得相同的加密,您可能需要Bouncy Castle库。您示例中的PHP代码使用Rijndael,块大小为32个字节。 AES是Rijndael的一个子集,块大小为16字节。这在PHP mcrypt中被称为MCRYPT_RIJNDAEL_128

其他一些实施细节:

  • 欧洲央行不使用IV(到现在为止我已经换成更好的东西默认mcrypt_encrypt样品);
  • mcrypt_encrypt不执行PKCS5Padding,我认为它使用空格;
  • input.getBytes()不可移植,它使用平台默认编码,这可能与PHP编码不同;

最后一些安全警告:

  • 只使用SHA-256的密码上被认为是不安全的,使用PBKDF2;
  • ECB被认为不安全,使用CBC;
  • MCRYPT_DEV_URANDOM不安全(这基本上意味着PHP加密是毫无价值的,你最好使用PHP openssl包装);

祝你好运!

+0

这个答案不帮你Gabrielle吗?你需要更多信息? –

+0

我突然收到了-1这个答案。我不介意低估 - 即使是我不同意的低估 - 只要我清楚为什么会发生downvote。 –