Java - 使用RSA密钥加密

时间:2012-12-05 17:49:10

标签: java cryptography jce

我一直在与这个问题作斗争一段时间了。问题是我必须将PEM字符串发送到服务器,该服务器需要以下最后一步:

  • 3DES o AES-256类型的加密密钥。
  • 该密钥,使用RSA密钥加密。
  • 该输出,以Base64和PEM格式编码。

这是我到目前为止所得到的:

  • 根据我从服务器获得的RSA密钥,我创建了一个密码:

     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:错误:0906D06C:PEM例程:PEM_read_bio:无起始行:。\ crypto \ pem \ pem_lib.c:698:

我没有更多的错误可见性,但我想检查在这个过程中我可能做的是否有什么问题,因为似乎错误与PEM的无法识别有关。

如果您有任何问题,请与我们联系。

谢谢!

1 个答案:

答案 0 :(得分:2)

报告了特定错误,因为短划线和BEGIN语句之间不应有空格。我不知道其他问题,但似乎你有一些工作要提前确定输入要求。确保您理解正好期望的内容,或者您​​可能必须尝试不同的格式“ad adause”。