2

我需要使用密钥在 android 中加密某个文本。在 PHP 中,加密代码如下所示

$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,我在 Netbeans 中为我的 Android 应用程序添加了来自 apache.org (commons-codec-1.6.jar) 的 commons 编解码器。代码中没有错误。但是当我运行应用程序并调用使用编解码器的函数时,应用程序停止并需要前关闭。

在 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 服务器相同的加密。

提前致谢。

4

1 回答 1

0

您的错误仅仅是因为您忘记将 Apache 编解码器库添加到您的运行时环境。仅仅针对它进行编译是不够的;该库需要实际存在于 Android 设备上。

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

其他一些实现细节:

  • ECB 不使用 IV(现在我已经用更好的东西替换了默认的 mcrypt_encrypt 样本);
  • mcrypt_encrypt 不执行 PKCS5Padding,我认为它使用空格;
  • input.getBytes()不可移植,使用平台默认编码,可能与PHP编码不同;

最后是一些安全警告:

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

祝你好运!

于 2012-08-23T17:58:13.790 回答