【问题标题】:java openssl X509_SIG structure and encode / decode functionsjava openssl X509_SIG 结构和编码/解码功能
【发布时间】:2020-09-03 15:19:00
【问题描述】:

我正在尝试在 java 中执行我在 C 中使用 openssl C API RSA_sign 函数制作的签名算法。 该函数不对数据进行加密,而是将数据放入带有一些元数据的X509_SIG 结构中,使用i2d_X509_SIG openssl 函数对该结构进行编码,最后加密该编码的结果。 有没有办法重现这种用 Java 签署数据的方式? X509_SIG 结构和编码/解码函数是否存在于某些 java 库中? 码

【问题讨论】:

    标签: java openssl cryptography x509


    【解决方案1】:

    您错误地描述(或误解了)RSA_sign 的作用。

    忽略此处不适用的一些特殊情况,它实现了最初在 PKCS1 v1 中定义为“类型 1”的 RSA 签名方案,现在在 PKCS1 v2 中保留为 RSASSA-PKCS1-v1_5(即带有附录的 RSA 签名方案 v1 .5 PKCS1);参见 rfc8017 的 section 8.2section 9.2,以及 section 5.2 中的相关原语。要签名(或按照 RFC 更正式的说法,生成签名),这将有效地执行以下操作:

    E1。散列消息

    E2。将哈希值加上哈希算法的算法标识符编码为DER中的ASN.1结构DigestInfo;由于 DER 的工作方式,这相当于添加一个固定前缀,如第 9.2 节注释中所述。

    E3-5。填充 00 01 FF...(根据需要,但至少 8 个)00

    G2。将八位字节字符串转换为数字,应用原始 RSASP1,它使用私有指数进行模幂运算,并将(新)数字转换回正确大小的八位字节字符串。从历史上看,在一代人之前,这有时被描述为“使用私钥加密”,而 RSAVP1 类似于“使用公钥解密”,尽管这在语义上是错误的,因为signing is not encryption,并且很快发现这种混淆导致易受攻击和破坏的糟糕系统设计,因此在本世纪我们称之为签名和验证。

    RSA_sign 要求调用者执行散列步骤 (E1)。然后它调用encode_pkcs1 执行步骤E2,使用名称X509_SIG 来表示标准称为DigestInfo 的结构。然后它调用RSA_private_encrypt,它执行 E3-5 和 G2;这个命名是因为 OpenSSL 源于几十年前编写的 SSLeay,当时“签名是向后加密”的混淆仍然很普遍。

    此签名方案是 (1) 标准和 (2) 非常普遍,并且在 Java 加密中实现 -- 包括标准要求的散列步骤与 OpenSSL RSA_sign 不同, DigestInfo 步骤相同。在https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#signature-algorithms 中查看java.security.Signature 算法名称(方案){SHA1,SHA256,etc}withRSA

    【讨论】:

    • 非常感谢 Dave 的完整回答。它将帮助我前进
    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多