当前位置: 首页 > 面试题库 >

Bouncy Castle与带有OAEP的Java默认RSA

麻昌翰
2023-03-14
问题内容

有人可以向我解释为什么javax.crypto.BadPaddingException: Decryptionerror解密密钥时此代码会出现在最后一行吗?

// Given an RSA key pair...
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();

// ... and an AES key:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey aesKey = keyGenerator.generateKey();

// When I encrypt the key with this Bouncy Castle cipher:
Cipher encryptionCipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding", "BC");
encryptionCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedKey = encryptionCipher.doFinal(aesKey.getEncoded());

// Then trying to decrypt the key with this cipher...
Cipher decryptionCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
decryptionCipher.init(Cipher.DECRYPT_MODE, privateKey);
// ... throws `javax.crypto.BadPaddingException: Decryption error` here:
decryptionCipher.doFinal(encryptedKey);

来自OAEP的RSA的http://codingdict.com/questions/131368中的以下声明也适用吗?

实际上,“ RSA / ECB / PKCS1Padding”未实现ECB模式加密。它应该被称为“ RSA / None /
PKCS1Padding”,因为它只能用于加密单个明文块(或者实际上是一个秘密密钥)。这只是Sun / Oracle的命名错误。

如果是这样,我希望这些转换是等效的,并且我的上述测试能够通过。两者中都指定了相同的填充,为什么BadPaddingException

无论哪种方式,我都会感谢外行对差异的解释。


问题答案:

对于更多信息,类似的问题#1,请参阅马腾Bodewes答案,这个和这个。

转换字符串的“模式”部分无效。问题是不同提供商使用的默认值不同。这是不幸的,而且绝对是次优的。我们应该责怪Sun /
Oracle吗?除了对结果不满意之外,我没有其他意见。

OAEP是一个相当复杂的构造,具有两个不同的哈希函数作为参数。使用Cipher转换字符串可以指定其中之一,并将其​​指定为SHA-256。但是,MGF1函数也由哈希函数参数化,您无法在密码转换字符串中指定哈希函数。Oracle提供程序默认为SHA1,而BouncyCastle提供程序默认为SHA-256。因此,实际上,存在一个对互操作性至关重要的隐藏参数。

解决方案是通过向方法提供,更完整地指定这些隐藏参数是什么OAEPParameterSpecCipher.init(...)如以下示例所示:

Cipher encryptionCipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding", "BC");
OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1",
                MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
encryptionCipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParameterSpec);
// ...
// ...
// ...
Cipher decryptionCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1",
                MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
decryptionCipher.init(Cipher.DECRYPT_MODE, privateKey, oaepParameterSpec);

第一个实际上是不操作的,因为这些已经是Bouncycastle的默认设置。



 类似资料:
  • 有人能解释一下为什么这段代码在解密密钥时会在最后一行抛出吗? 以下是来自https://stackoverflow.com/a/27886397/66722对于使用OAEP的RSA也是如此? “RSA/ECB/PKCS1Padding”实际上没有实现ECB模式加密。它应该被称为“RSA/None/PKCS1Padding”,因为它只能用于加密单个明文块(或者实际上是一个密钥)。这只是Sun/Ora

  • 伙计们!我正在开发一个web应用程序,我决定使用Jackson作为JSON处理框架。 我愿意发送请求数据;假设POJO看起来像这样: 将其序列化如下: 但是我需要向该对象添加一些元数据,比如字段和。我以为会解决我的问题,但是我正在使用Jackson和泽西一起使用,所以我没有手动序列化对象,所以我不能使用。 我知道这个线程,但是没有一个答案可以满足我的需求,因为我认为,编写一个自定义序列化程序是有点

  • 问题内容: 我只是从angularjs开始,并且正在努力将一些旧的JQuery插件转换为Angular指令。我想为我的(元素)指令定义一组默认选项,可以通过在属性中指定选项值来覆盖这些默认选项。 我一直在寻找其他人这样做的方式,并且在angular-ui库中ui.bootstrap.pagination似乎做了类似的事情。 首先,所有默认选项都在一个常量对象中定义: 然后,将实用程序功能附加到指令

  • 我使用SpringBoot(V2.3.0.Release)、JPA和Hibernate(带有MySQL数据库)。总的来说,我需要努力提高表演。 是否需要手动配置(同时添加依赖项)连接池?

  • 我在我的项目中包含了2个BC JAR:bcpkix-jdk15on-1.47.jar和bcprov-jdk15on-157.jar。 作为代码中的第一行,我添加了: 行发生异常: 有没有什么方法可以让我定期包括这两个BouncyCastle罐子?

  • 问题内容: 我需要为一个表创建一个timestamp字段,该表的行在一定时间后需要过期。如果我使用以下内容: 它以一种人类可读的格式显示时间,如果我可以将时间设置为纪元时间,则可以轻松得多,这样我就可以用几秒钟的时间进行计算。有没有一种方法可以创建一个字段,当默认情况下以纪元时间创建行时,该字段将显示当前时间?谢谢! 问题答案: 您可能希望在语句中使用该函数,如以下示例所示: