【问题标题】:Java - Encrypting with RSA keyJava - 使用 RSA 密钥加密
【发布时间】: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


【解决方案1】:

报告具体错误是因为破折号和BEGIN 语句之间不应有空格。我不知道其他问题,但您似乎还有一些工作要满足确切的输入要求。请确保您准确了解预期的内容,否则您可能不得不尝试不同的格式“令人作呕”。

【讨论】:

  • 你一针见血。我已经设法在这方面取得了一些进展,我现在正在与预期的回车作斗争。有什么方法可以在不考虑实际系统配置的情况下手动插入这些?正如我目前正在尝试使用 \n 和 \r,但在实际输出中,我没有插入额外的输出。我知道系统对 \n 和 \r 的制作方式有一些影响。
  • 系统不应插入回车/换行。您的应用程序代码中更有可能出现问题。继续调试,你最终会到达那里:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多