【问题标题】:Java decrypt email attachment (.p7m file)Java 解密电子邮件附件(.p7m 文件)
【发布时间】:2017-05-09 08:22:06
【问题描述】:

我有一个 .p7m 格式的电子邮件附件和一个包含私钥和证书的 .pem 文件。 使用 OpenSSL,我可以使用以下命令解密文件:

openssl smime -decrypt -inform DER -in fileToDecrypt.p7m -inkey privateKey.pem -out destinationFile

但是在 Java 中使用 bouncycastle,我无法解密它。 我用这段代码读取了私钥:

    PEMReader pemReader = new PEMReader(new InputStreamReader(new FileInputStream(privateKeyName)));
    Object obj;
    PrivateKey key = null;
    X509Certificate cert1 = null;
    X509Certificate cert2 = null;

    obj = pemReader.readObject();
    if (obj instanceof PrivateKey) {
        key = (PrivateKey) obj;
        System.out.println("Private Key found");
    }
    obj = pemReader.readObject();
    if(obj instanceof X509Certificate){
        cert1 = (X509Certificate) obj;
        System.out.println("cert found");
    }
    obj = pemReader.readObject();
    if(obj instanceof X509Certificate){
        cert2 = (X509Certificate) obj;
        System.out.println("cert found");
    }

打印出来:

Private Key Found
cert found
cert found

键的类型是:

 System.out.println(key.getAlgorithm());
 System.out.println(cert1.getSigAlgName());
 System.out.println(cert2.getSigAlgName());

RSA
SHA256WithRSAEncryption
SHA256WithRSAEncryption

如果我尝试这样解密:

 Cipher cipher = Cipher.getInstance("RSA");
 cipher.init(Cipher.DECRYPT_MODE, key);
 Path path = Paths.get("fileToDecrypt.p7m");
 byte[] data = Files.readAllBytes(path);
 byte[] decryptedData = cipher.doFinal(data);

我明白了:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes

我有这两个文件:

  1. fileToDecrypt.p7m
  2. privateKey.pem:包含 RSA 私钥和两个 X508 证书

我不知道从哪里开始用什么解密,以及如何解密?

【问题讨论】:

  • 你可以回答你自己的问题;)

标签: java encryption openssl cryptography smime


【解决方案1】:

问题的解决方法:

private static byte[] cmsDecrypt(byte[] message, PrivateKey key) throws
        Exception {
    CMSEnvelopedDataParser ep = new CMSEnvelopedDataParser(message);
    RecipientInformationStore recipients = ep.getRecipientInfos();
    Collection c = recipients.getRecipients();
    Iterator iter = c.iterator();
    RecipientInformation recipient = (RecipientInformation) iter.next();
    return recipient.getContent(key, new BouncyCastleProvider());
}

Path path = Paths.get("fileToDecrypt.p7m");
byte[] data = Files.readAllBytes(path);
try {
    System.out.println(new String(cmsDecrypt(data, key)));
} catch (Exception e) {
    e.printStackTrace();
}

【讨论】:

  • 不完整的答案,没有任何问题或解决方案的解释
猜你喜欢
  • 2012-03-13
  • 2012-10-05
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多