-1

我想使用 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)
4

1 回答 1

0

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

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

但随后使用 TripleDES 初始化密钥生成器:

Kg.Initialize("DESede")

根据此文档,只需将“DESede”更改为“AES”:

Kg.Initialize("AES")

此外,我不建议将 AES 与 ECB 一起使用且不使用填充。这是不安全的,尤其是当它同样容易使用 CBC 或 CTR 模式时。请参阅此 wikipedia 文章,了解它实际上有多不安全的示例。

于 2013-01-08T07:50:14.007 回答