【问题标题】:AES decryption AndroidAES解密安卓
【发布时间】:2015-06-13 01:06:30
【问题描述】:

我正在 Android 中进行 AES 加密和解密,我使用下面的 Android 代码 sn-p 发布请求。

请求发帖

   String urlParameters = "username=abc&password=abc";
            String request = "http://abcd.co.uk/data_abc.php?";
            String passkey = "mysecretkey";

   URL url;
    HttpURLConnection connection = null;
    try {
        //Create connection
        url = new URL(request);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded");

        connection.setRequestProperty("Content-Length", "" +
                Integer.toString(urlParameters.getBytes().length));
        connection.setRequestProperty("Content-Language", "en-US");

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //Send request
        DataOutputStream wr = new DataOutputStream(
                connection.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        //Get Response
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }
        rd.close();
        return response.toString();

    } catch (Exception e) {

        e.printStackTrace();
        return null;

    } finally {

        if (connection != null) {
            connection.disconnect();
        }
    }

我从上述请求中成功获得了 Base64 加密响应字符串,但是当我尝试使用以下代码 sn-p 解密响应字符串时,它返回不可读的字符串,如字符和框。

解密

  String strDecriptedValue = decrypt(passkey, responseBase64);

public static String decrypt(String seed, String encrypted)
            throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = Base64.decode(encrypted.getBytes(), Base64.DEFAULT);
        byte[] result = decrypt(rawKey, enc);
        return new String(result);
    }

private static byte[] getRawKey(byte[] seed) throws Exception {
        KeyGenerator keygen = KeyGenerator.getInstance("AES");
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(seed);
        keygen.init(128, random); 
        SecretKey key = keygen.generateKey();
        byte[] raw = key.getEncoded();
        return raw;
    }

private static byte[] decrypt(byte[] raw, byte[] encrypted)
            throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }

解密输出

��]ة*�]��O��Z���Q2�_

响应应为 JSON 格式,但实际输出如上。

请分享使用 AES 256 位解密数据的 sn-p,使用 Base 64 的安全密钥。

我还尝试使用 AES/CBC/NoPadding 、 AES/CBC/PKCS5Padding 等,但它没有工作。

【问题讨论】:

  • 你在用Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files吗?
  • 不,我用的是AES256解密
  • 使用 256 位加密你应该有Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
  • 感谢您的快速回复,如果您分享教程/代码sn-p或任何其他参考以在android中实现AES256解密,将非常感激。

标签: java c# android encryption cryptography


【解决方案1】:

您正在使用 SecureRandom 随机使用传递的种子值生成密钥。 但是服务器上 SecureRandom 的实际实现和你的 Android 代码使用的不同(你似乎在使用一些 PHP 代码)所以生成的键值会不同。

您还提到了 256 位密钥,但您的代码使用的是 128:keygen.init(128, random);

因此,请确保您在两侧使用相同的键。您应该首先使用两侧的“固定”密钥尝试您的代码并检查它是否有效,否则您的解密/加密过程中可能仍然存在错误。您的问题中只包含了一半的流程代码。

【讨论】:

  • 感谢您的回复,正如您所说,我的代码 sn-p 是为 128 位制作的。所以我尝试使用 256 位,但它不起作用。我仍在寻找正确的 AES 256 解密代码。你能分享一下AES 256位的正确代码sn-p吗?
  • keygen.init(256, 随机);您是否遇到异常或您的解码值不正确?
  • 没有得到任何异常,我的解码值是这样的([-83, -7, 42, -51, -87, 76, -70, -71, -25, etc., )。是否正确解码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2016-09-22
  • 2021-02-11
  • 2012-02-24
相关资源
最近更新 更多