【发布时间】: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