【问题标题】:Android AES DecryptAndroid AES 解密
【发布时间】:2018-05-17 08:18:52
【问题描述】:

我是一名尝试编写 Android 应用程序的 PHP 程序员。到目前为止,我做得很好......现在我被卡住了......

我在下面调用这个类来解密以前在 php 中加密的字符串。 该类可以正常发送和接收字符串,但由于未知原因,解密函数始终返回 null。

例子:

未加密文本:测试

加密密钥:SeoavcVARXhWKdQ5

加密 iv:TeoavcVARXhWKdQ5

加密文本:NnUDIfVXvtamcrYWvs9HWw==

当调用decrypt(key, iv, text) 我得到null ...

有什么帮助吗?!

import android.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AESCipher {

    private static String CIPHER_NAME = "AES/CBC/PKCS5PADDING";
    private static int CIPHER_KEY_LEN = 16; //128 bits

    public static String decrypt(String key, String initVector, String data) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            Cipher c = Cipher.getInstance(AESCipher.CIPHER_NAME);
            SecretKeySpec k = new SecretKeySpec(Base64.decode(key, Base64.DEFAULT), "AES");
            c.init(Cipher.DECRYPT_MODE, k, iv);


            byte[] decodedEncryptedData = Base64.decode(data, Base64.DEFAULT);
            byte[] original = c.doFinal(decodedEncryptedData);
            return new String(original);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

乐: PHP 代码加密

class AESCipher {
    private static $OPENSSL_CIPHER_NAME = "aes-128-cbc";
    private static $CIPHER_KEY_LEN = 16;
    static function encrypt2($key, $iv, $data) {
        if (strlen($key) < AESCipher::$CIPHER_KEY_LEN) {
            $key = str_pad("$key", AESCipher::$CIPHER_KEY_LEN, "0");
        } else if (strlen($key) > AESCipher::$CIPHER_KEY_LEN) {
            $key = substr($str, 0, AESCipher::$CIPHER_KEY_LEN);
        }
        $encodedEncryptedData = base64_encode(openssl_encrypt($data, AESCipher::$OPENSSL_CIPHER_NAME, $key, OPENSSL_RAW_DATA, $iv));
        return $encodedEncryptedData;

    }
}

【问题讨论】:

  • 发布 PHP 代码...
  • php 代码有效。我已经在 php 中编码/解码,一切正常。问题出在 Android 代码上
  • @HardikVasani 使用另一种加密...我正在尝试解决这个问题...无论如何...我还在 android 上加密一些东西并发送到 php...工作......问题是当我在php中加密并发送到android时,android不解密..(并且php端没问题)
  • PHP 代码仍然会有所帮助,因此我们可以看到您是如何对其进行加密的。比如你的key和你的iv看起来很相似,但是在iv上调用getBytes(),base64解码key,这就很可疑了。

标签: android


【解决方案1】:

密钥不是 base64 编码的(对于 16 字节的密钥,它的长度为 16 个字符)。请改用getBytes

SecretKeySpec k = new SecretKeySpec(key.getBytes(), "AES");

这会产生解码后的文本“test”。

【讨论】:

  • 这是一个很好的评论并更改了代码,但我仍然得到空返回:(
  • 这很奇怪,使用完全相同的代码我得到结果“测试”。错误和堆栈跟踪是什么? (你应该在 logcat 中找到它)
  • 非常感谢您!最后一部分是我的错。当我从 php 发送字符串时,我对字符串进行了 url 编码,但在 Android 中解密之前忘记对其进行解码。有用 !!!再次感谢!
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2011-10-10
相关资源
最近更新 更多