在Node.js中Java的RSA/ECB/OAEPWithSHA-256AndMGF1Padding等效的内容是什么?

6
数据解密将在JAVA中使用“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”算法运行。因此,我必须使用与“node.js”中的“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”等效的算法使用公钥加密数据。
我尝试了使用crypto.publicEncrypt(key, buffer)进行加密,但它使用的是crypto.constants.RSA_PKCS1_OAEP_PADDING,这与上述算法不相似。因此,我需要与“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”等效的算法或如何在node.js中实现相同的算法。

你有什么问题? - LLJ97
我没有找到有关node在OAEP中使用的哈希函数的任何文档。这意味着它1)很可能对MGF1哈希和常量哈希都使用SHA1,而且2)没有办法更改它。你将不得不修改你的Java代码以使用SHA1。 - President James K. Polk
根据https://stackoverflow.com/questions/35544547/encrypting-using-node-forge-and-decrypting-using-python-with-rsa-oaep和https://stackoverflow.com/questions/33532091/rsa-crypto-between-node-js-and-webcrypto,node-forge(而不是node-crypto)可以选择OAEP哈希。 OP:您在Java中使用哪个提供程序,或者使用'OAEPParameterSpec'吗?如果我没记错,Suncle / Open提供程序和BouncyCastle提供程序默认使用不同的'MGF1with$hash'。 - dave_thompson_085
@dave_thompson_085:谢谢,这是很好的信息。在这个答案中,我的结论是Bouncycastle使用转换字符串中指定的哈希算法来计算两个哈希值,而Suncle则对常量使用指定的哈希算法,并始终使用SHA1来计算MGF1哈希值。 - President James K. Polk
2个回答

8

我终于找到了答案。可以通过node-forge npm模块实现与"RSA/ECB/OAEPWithSHA-256AndMGF1Padding"等效的加密。 https://www.npmjs.com/package/node-forge#rsa

    // encrypt data with a public key using RSAES-OAEP/SHA-256/MGF1-SHA-1
// compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha256.create()
  }
});

谢谢


1
谢谢!对于 RSA/ECB/OAEPWithSHA-1AndMGF1Padding,我尝试了不带 mdmgf1 的方式,它可以正常工作! - Alejandro Barone
2
这里有一个打字错误吗?根据上面的注释,mgf1md 不应该是 forge.md.sha1.create() 吗? - JHH

-3

首先,您不应使用“ECB”模式密码,因为:

  1. ECB是块密码模式,RSA不是基于该模式的算法。
  2. 如果您使用基于该模式的算法(例如AES),则不应使用ECB,因为它没有IV(初始化向量),因此它是不安全的,加密分析器可以破解密码。您可以使用CBC,它具有IV,或GCM,如果您想共享敏感信息到外部系统并防止Oracle Padding。我建议您访问以下链接:

MSC61-J. 不要使用不安全或弱的加密算法

因此,在这种情况下,您只需要使用OAEP进行RSA加密,因为它是填充方案,有助于防止用于非对称算法的Oracle Padding,然后更改您的代码为:RSA / None / OAEPWithSHA-256AndMGF1Padding。也许,您可以与Node.js兼容。 我还建议您访问官方网站:

JCA 参考指南

希望这些信息对你有所帮助。

祝你好运。


3
根据你提供的链接,Java/JCA在Cipher中使用算法/模式/填充格式,即使算法不使用模式,比如RSA(正如你所说),因此Suncle提供者(SunJCE)需要“ECB”作为一个占位符,实际上意味着“无模式”。BouncyCastle则允许使用“ECB”或“NONE”(大小写不敏感,像大多数JCA名称一样)。 - dave_thompson_085

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接