【问题标题】:Android - AES decryption failing with strange content lengthsAndroid - AES 解密失败,内容长度奇怪
【发布时间】:2011-09-29 11:49:48
【问题描述】:

我正在尝试解码从 Web 服务获得的 AES 加密数据。 加密长度为:4256字节 解密后长度为:4247字节

Bascally 我认为这会是好的,因为有一些填充或其他东西...... 但。数据实际上可以很好地解密为纯文本。除了最后缺少一些字符。

什么可能导致最后缺少字符?

我的解密代码来了:

public static byte[] decrypt(byte[] input) throws Exception {
    byte[] rawKey = getKey("bla".getBytes());
    SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    AlgorithmParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
    return cipher.doFinal(input);
}

【问题讨论】:

  • 您(或实际上是网络服务)是否使用相同的模式(特别是填充)进行加密?
  • 另请注意:具有恒定初始化向量的 CBC 不是安全模式。您想为每条消息使用一个新的随机生成的初始化向量(并与消息一起传输)。
  • 我知道,但不幸的是我无权访问服务器端代码,这是用于服务器端 (.NET) 进行加密的配置。而且它似乎有效,因为 90% 的文本都被正确解密了......
  • 面临的问题是它不能解密前 16 或 19 个字符,知道为什么吗?在我的情况下,你如何克服你的问题内容长度是一样的任何想法?

标签: android encryption aes


【解决方案1】:

将其发布为答案,因为评论太长了:(

问题已解决,导致错误的绝不是解密。解密没问题。

实际的问题是我,试图将字符串转换为 json 对象,而它是一个 json 数组。

结合 4k 字符的 logcat 限制被实际 json 错误消息屏蔽并切断我的调试消息(因此永远不会丢失任何字符)...

【讨论】:

    【解决方案2】:

    正如 Paŭlo 所说,问题几乎肯定出在填充中。设置没有填充的测试decrypt() 方法:“AES/CBC/NoPadding”IIRC。解密相同的密文并查看已添加到消息末尾的实际填充字节。这应该会告诉您消息中实际添加了哪些填充(如果有)。

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多