【发布时间】:2012-12-06 06:16:07
【问题描述】:
我一直在与这个问题作斗争一段时间。问题是我必须将 PEM 字符串发送到服务器,这需要以下最后一步:
- 3DES o AES-256 类型的加密密钥。
- 该密钥使用 RSA 密钥加密。
- 以 Base64 和 PEM 格式编码的输出。
这是我目前得到的:
-
根据我从服务器获得的 RSA 密钥,我创建了一个 Cipher:
Cipher rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, (RSAPublicKey) obj); -
稍后,我创建了一个 AES 密钥:
//IV. byte[] bytes = new byte[16]; SecureRandom random = new SecureRandom(); random.nextBytes(bytes); Map<String, byte[]> aes = new HashMap<String, byte[]>(); aes.put("IV", ConversionUtil.toHex(bytes, 8).getBytes()); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); Key encryptionKey = keyGen.generateKey(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new IvParameterSpec(ConversionUtil.toHex(bytes, 8).getBytes())); aes.put("key", cipher.doFinal(encryptionKey.getEncoded()));
使用所有这些来创建 PEM 字符串:
StringBuilder sb = new StringBuilder();
sb.append(StringUtils.repeat("-", 5));
sb.append("BEGIN PEM file");
sb.append(StringUtils.repeat("-", 5));
sb.append("\n");
sb.append("Proc-Type: 4,ENCRYPTED\n");
sb.append("DEK-Info: " + "AES-256-CBC" + "," + new String(aes.get("IV")) + "\n");
sb.append("");
sb.append(Base64.encode(rsa.doFinal(aes.get("key"))));
sb.append("\n");
sb.append(StringUtils.repeat("-", 5));
sb.append("END PEM file");
sb.append(StringUtils.repeat("-", 5));
然后将其发送到服务器,这会引发以下错误:
3936:error:0906D06C:PEM 例程:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:698:
我对错误没有更多的了解,但我想检查我在此过程中是否有任何错误,因为似乎错误与无法识别 PEM 相关。
如果您有任何问题,请告诉我。
谢谢!
【问题讨论】:
-
您应该使用
RSA加密,而您正在使用AES加密密钥 -
嗯,你可能是对的,我现在正在尝试向 RSA Cipher 提供 IV,但我收到了这个错误:cipher.init(Cipher.ENCRYPT_MODE, (RSAPublicKey) obj,新的 IvParameterSpec(iv)); java.security.InvalidAlgorithmParameterException:不支持参数
-
检查样本here你需要
RSA键。 -
是的,我确实有,但我还需要提供 IV,因为服务器将使用它提供的 RSA 密钥来解密我制作的 AES/3DES 密钥。
-
这不是提供 IV 的方式。 IV 不需要加密它也可以公开分享
标签: java cryptography jce