【发布时间】:2015-03-25 04:36:07
【问题描述】:
我有一些 JDK 1.6 代码要移植到 Android,它的行为有所不同。
// decode public key
pubk = KeyFactory.getInstance("RSA").generatePublic(
new X509EncodedKeySpec(X)
);
// decode symmetric key
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.UNWRAP_MODE, pubk);
skey = (SecretKey)cipher.unwrap(key1, "AES", Cipher.SECRET_KEY);
pubk 是 2048 位 RSA 密钥,但表示形式不同(Sun 或 OpenSSL)。key1 是 2048 位字节数组。
问题是:我对@987654324@ 有不同的结果。在 Sun JRE 上它是 128 位 AES 密钥,在 Android 上它是 2048 位数组,包含以下字节:
[1, -1, -1 ... ,-1, 0,(此处为实际关键字节)]
原始包装是通过以下方式完成的:
// generate symmetric key
kgen = KeyGenerator.getInstance("AES");
kgen.init(128, SecureRandom.getInstance("SHA1PRNG"));
skey = kgen.generateKey();
// create Cipher
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
// decode private key
privk = KeyFactory.getInstance("RSA").generatePrivate(
new PKCS8EncodedKeySpec(X)
);
// wrap symmetric key
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, privk);
skey_buffer = cipher.wrap(skey);
在包装期间(在 Sun JRE 中)skey 是 128 位,结果 skey_buffer 是 2048 位
我想这与 Sun 将密钥长度限制为 128 位有关。 现在我想它与填充有关。但是如何将这些限制应用于 BouncyCastle 实现,以获得相同的未包装密钥输出?当然我可以硬编码在解码数组的开头删除-1,但也许有一些(填充)参数可以获得原始的128位文本?
更新:我没有专心,并错过了解包 skey 不是 256 位,而是 2048 位的事实。更新问题。
【问题讨论】:
-
我目前没有时间,所以我只是硬编码数组转换,但我会回到这个问题并尝试正确解决它。 RSA 填充规范似乎很有希望......
标签: java android encryption