Java';s Node.js中的RSA/ECB/OAEPWithSHA-256和mgf1填充等效项

Java';s Node.js中的RSA/ECB/OAEPWithSHA-256和mgf1填充等效项,java,node.js,encryption,cryptojs,Java,Node.js,Encryption,Cryptojs,数据解密将使用RSA/ECB/OAEPTHESHA-256和mgf1padding算法在JAVA中运行。因此,我必须使用与node.js中的RSA/ECB/OAEPWithSHA-256和mgf1padding相当的算法对数据进行公钥加密 我尝试了crypto.publicEncrypt(key,buffer),它使用crypto.constants.RSA\u PKCS1\u OAEP\u填充,与上述算法不同。 所以我需要与“RSA/ECB/OAEPWITHHA-256和MGF1PADDING

数据解密将使用
RSA/ECB/OAEPTHESHA-256和mgf1padding
算法在JAVA中运行。因此,我必须使用与
node.js
中的
RSA/ECB/OAEPWithSHA-256和mgf1padding
相当的算法对数据进行公钥加密

我尝试了
crypto.publicEncrypt(key,buffer)
,它使用crypto.constants.RSA\u PKCS1\u OAEP\u填充,与上述算法不同。
所以我需要与“RSA/ECB/OAEPWITHHA-256和MGF1PADDING”等效的算法,或者如何在node.js中实现相同的算法首先,您不应该使用“ECB”模式密码,因为:

  • ECB是一种分组密码模式,RSA不是基于这种操作模式的算法
  • 如果使用基于该操作模式的算法(例如AES),则不应使用ECB,因为它没有IV(初始化向量),因此不安全,密码分析器可能会破解密码。如果您想与外部系统共享敏感信息并防止Oracle填充,可以使用CBC,它有IV或GCM。我建议您访问以下链接:
  • 因此,在这种情况下,您只需要将OAEP用于RSA加密,因为它是一种填充方案,有助于防止Oracle对不对称算法进行填充,然后将代码更改为:
    RSA/None/OAEPWithSHA-256和mgf1 padding
    。也许,您可以获得与Node.js的兼容性。此外,我建议您访问官方网站:

    我希望这些信息对你有帮助


    祝你好运。

    我终于找到了答案。 可以通过node forge npm模块实现与“RSA/ECB/OAEPWithSHA-256和MGF1padding”等效的功能


    谢谢

    您的问题是什么?我没有找到任何关于node用于OAEP的哈希函数的文档。这意味着它1)可能对MGF1哈希和常量哈希都使用SHA1,2)无法更改它。您必须修改Java以使用SHA1。@JamesKPolk+根据,node forge(而不是node crypto)可以选择OAEP哈希。OP:您在Java中使用的是什么提供程序,还是使用的是
    OAEPParameterSpec
    ?IIRC Suncle/Open提供程序和BouncyCastle提供程序的默认值“MGF1with$hash”有所不同。@dave_thompson_085:谢谢,这是一个很好的信息。作为回答,我的结论是Bouncycastle将转换字符串中指定的哈希alg用于两个哈希,而Suncle将指定的哈希用于常量,并始终将SHA1用于MGF1哈希。正如您链接的JCA页面(以及其非过时版本)所述,Java/JCA使用语法
    algorithm/mode/padding
    进行加密,即使算法不使用模式,如RSA(正如您正确地说的),因此Suncle提供程序(SunJCE)需要“ECB”作为占位符,这实际上意味着“无模式”。BouncyCastle允许“ECB”或“NONE”(不区分大小写,就像JCA中的大多数名称一样)。谢谢。这很有帮助,谢谢!!。对于
    RSA/ECB/OAEPWithSHA-1和mgf1 padding
    我在没有
    md
    mgf1
    的情况下尝试了它,效果很好!。这里没有打字错误吗?
    mgf1
    md
    不应该是
    forge.md.sha1.create()
    以符合上面的注释吗?
        // 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()
      }
    });