【问题标题】:BlackBerry Encryption AES 256 - No PaddingBlackBerry 加密 AES 256 - 无填充
【发布时间】:2013-01-08 07:25:18
【问题描述】:

我想使用 AES 256 加密方法加密 BlackBerry 中的数据。要求是使用无填充加密; “AES/ECB/NoPadding”。我正在传递一个 16 字节数组,返回的加密数据是一个长度为 32 的十六进制值。我尝试了以下方法,但它没有产生正确的结果。返回值与预期的加密值不同;在安卓中测试。 Android 和黑莓之间的结果并不相符。我使用了以下方法:

public static String EncryptData(byte[] keyData, byte[] data) throws Exception {      
          String encryptedData = "";        
          AESKey key = new AESKey(keyData);
          NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream();
          AESEncryptorEngine engine = new AESEncryptorEngine(key);
          BlockEncryptor encryptor = new BlockEncryptor(engine, out);
          encryptor.write(data, 0, data.length);
          int finalLength = out.size();
          byte[] cbytes = new byte[finalLength];
          System.arraycopy(out.getByteArray(), 0, cbytes, 0, finalLength);
          encryptedData = getHexString(cbytes);
          return encryptedData;
      }

谁能指导一下?

编辑:下面是等效的 Android 代码:

Dim Kg As KeyGenerator
    Dim c As Cipher
    c.Initialize("AES/ECB/NoPadding") ' just "DES" actually performs "DES/ECB/PKCS5Padding". 
    Kg.Initialize("DESede")
    Kg.KeyFromBytes(key)
    bytes = Kg.KeyToBytes
    msg_data = c.Encrypt(msg_data, Kg.key, False)
    Return Bconv.HexFromBytes(msg_data)

【问题讨论】:

  • 这是BB码吗?显示安卓系统。此外,欧洲央行通常是个坏主意。
  • 也许this question 会有所启发。一般来说,我认为您必须将输入数据填充到分组密码中。在那个问题中,他们使用PKCS5FormatterEngine 填充。
  • @NikolayElenkov 我已经用添加的 Android 代码更新了我的答案。
  • 第二个代码块有错误。您使用 AES 调用 c.Initialize(),然后为 DES 初始化 KeyGenerator。
  • 不熟悉 BB API,但您确定 AESEncryptorEngine 实际上使用的是 ECB 并且没有填充?它似乎确实在添加填充。

标签: android blackberry encryption aes


【解决方案1】:

您的 Basic4Android 代码中有错误。您使用 AES 初始化密码:

c.Initialize("AES/ECB/NoPadding")

然后用 TripleDES 初始化密钥生成器:

Kg.Initialize("DESede")

根据this documentation,只需将“DESede”改为“AES”即可:

Kg.Initialize("AES")

另外,我不建议使用带有 ECB 且没有填充的 AES。这是不安全的,尤其是当它同样容易使用 CBC 或 CTR 模式时。请参阅this wikipedia article 以了解它实际上有多不安全的示例。

【讨论】:

  • 要求是带有 ECB 的 AES 并且没有填充。服务器正在解密这些值,并且它已经为 Android 和 iphone 实现了。考虑到我想继续进行此加密,您能否建议如何在黑莓中进行此操作?我一直无法没有填充..
  • Android 使用 BouncyCastle 作为加密提供程序。这个库还有一个 JavaME 版本。看看吧,也许你可以为Android和BB重用你的加密类。Bouncy Castle Java Releases
  • @Sarah:我会回去找给你这个要求的人,告诉他们这很糟糕。这是不安全的,并且不被安全社区中的一个人推荐。您是否在此答案中进行了更改?您是否验证过密钥字节和输入字节是否相同? IE。比较 keyData 和 bytes = Kg.KeyToBytes
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2020-12-28
相关资源
最近更新 更多