使用 OAEP 密钥加密的 S/MIME 封装邮件解密失败?

2023-12-28

使用 Java 和 BouncyCastle,我能够解密大量 S/MIME 封装的消息。

但当密钥加密算法为1.2.840.113549.1.1.7(id-RSAES-OAEP),解密失败(堆栈跟踪在这个问题的末尾)。

发生这种情况的行:

content = messageRecipientInfo.getContent(new JceKeyTransEnvelopedRecipient(pc).setProvider("BC"));

以前我用该行来解密:

content = messageRecipientInfo.getContent(givenCertRecipient);

全部都是一样。

有什么猜测吗?

  • EDIT *

我现在尝试使用 OAEP 加密数据。因此,我直接在文件 cms/test/NewEnvelopedDataTest.java 中的 BouncyCastle 内找到了代码 即使这样也行不通! 同样的错误:

String BC = BouncyCastleProvider.PROVIDER_NAME;

KeyPair _reciKP = CMSTestUtil.makeKeyPair();
String _reciDN = "CN=Doug, OU=Sales, O=Bouncy Castle, C=AU";
KeyPair _signKP = CMSTestUtil.makeKeyPair();
String _signDN = "O=Bouncy Castle, C=AU";
X509Certificate _reciCertOaep = CMSTestUtil.makeOaepCertificate(_reciKP, _reciDN, _signKP, _signDN);

byte[] data = "WallaWallaWashington".getBytes();

CMSEnvelopedDataGenerator edGen = new CMSEnvelopedDataGenerator();

JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter();

edGen.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator(_reciCertOaep).setProvider(BC));

edGen.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator(ASN1OctetString.getInstance(ASN1OctetString.getInstance(_reciCertOaep.getExtensionValue(Extension.subjectKeyIdentifier.getId())).getOctets()).getOctets(), _reciCertOaep.getPublicKey()).setProvider(BC));

在最后一步中它崩溃了:“无法初始化算法参数:不支持操作”

CMSEnvelopedData edd = edGen.generate(
                new CMSProcessableByteArray(data),
                new JceCMSContentEncryptorBuilder(CMSAlgorithm.DES_EDE3_CBC).setProvider(BC).build());

问题是什么?我看不到它...

org.bouncycastle.cms.CMSException:异常解包键:不能 初始化算法参数:不支持操作 org.bouncycastle.cms.jcajce.JceKeyTransRecipient.extractSecretKey(JceKeyTransRecipient.java:169) 在 org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient.getRecipientOperator(JceKeyTransEnvelopedRecipient.java:26) 在 org.bouncycastle.cms.KeyTransRecipientInformation.getRecipientOperator(KeyTransRecipientInformation.java:48) 在 org.bouncycastle.cms.RecipientInformation.getContentStream(RecipientInformation.java:169) 在 org.bouncycastle.cms.RecipientInformation.getContent(RecipientInformation.java:150) 在 CryptoTools.decryptAndVerifyFile(CryptoTools.java:1030) 处 FormMain$2.actionPerformed(FormMain.java:403) 在 javax.swing.AbstractButton.fireActionPerformed(来源未知)位于 javax.swing.AbstractButton$Handler.actionPerformed(来源未知)位于 javax.swing.DefaultButtonModel.fireActionPerformed(来源未知) javax.swing.DefaultButtonModel.setPressed(来源未知) javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 来源)位于 java.awt.Component.processMouseEvent(来源未知) javax.swing.JComponent.processMouseEvent(来源未知)位于 java.awt.Component.processEvent(来源未知)位于 java.awt.Container.processEvent(来源未知)位于 java.awt.Component.dispatchEventImpl(来源未知)位于 java.awt.Container.dispatchEventImpl(来源未知)位于 java.awt.Component.dispatchEvent(来源未知)位于 java.awt.LightweightDispatcher.retargetMouseEvent(来源未知)位于 java.awt.LightweightDispatcher.processMouseEvent(来源未知)位于 java.awt.LightweightDispatcher.dispatchEvent(来源未知)位于 java.awt.Container.dispatchEventImpl(来源未知)位于 java.awt.Window.dispatchEventImpl(来源未知)位于 java.awt.Component.dispatchEvent(来源未知)位于 java.awt.EventQueue.dispatchEventImpl(来源未知)位于 java.awt.EventQueue.access$500(来源不明)位于 java.awt.EventQueue$3.run(来源未知)位于 java.awt.EventQueue$3.run(来源未知)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 来源)位于 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 来源)位于 java.awt.EventQueue$4.run(来源未知) java.awt.EventQueue$4.run(来源未知)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)位于 java.awt.EventQueue.dispatchEvent(未知源)位于 java.awt.EventDispatchThread.pumpOneEventForFilters(来源未知) 在 java.awt.EventDispatchThread.pumpEventsForFilter(来源未知) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)位于 java.awt.EventDispatchThread.pumpEvents(来源未知) 在 java.awt.EventDispatchThread.pumpEvents(来源未知) java.awt.EventDispatchThread.run(来源不明) 原因: org.bouncycastle.operator.OperatorCreationException:无法初始化 算法参数:不支持的操作 org.bouncycastle.operator.jcajce.OperatorHelper.createAlgorithmParameters(OperatorHelper.java:254) 在 org.bouncycastle.operator.jcajce.JceAmetryKeyUnwrapper.generateUnwrappedKey(JceAmetryKeyUnwrapper.java:100) 在 org.bouncycastle.cms.jcajce.JceKeyTransRecipient.extractSecretKey(JceKeyTransRecipient.java:158) ... 42 更多 引起:java.io.IOException:不支持操作 在 org.bouncycastle.jcajce.provider.asymmetry.rsa.AlgorithmParametersSpi$OAEP.engineInit(AlgorithmParametersSpi.java:83) 在 java.security.AlgorithmParameters.init(来源未知)处 org.bouncycastle.operator.jcajce.OperatorHelper.createAlgorithmParameters(OperatorHelper.java:250) ... 44 更多


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OAEP 密钥加密的 S/MIME 封装邮件解密失败? 的相关文章

  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • 警告:无法更改每个人的权限:

    当运行 Java 快速入门示例时https developers google com drive web quickstart java hl hu https developers google com drive web quicks
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis

随机推荐