java openssl x509\ u sig结构和编码/解码函数

bbuxkriu  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(374)

我正在尝试用java做一个签名算法,我用c做的,使用openssl c api RSA_sign 功能。此函数不加密数据,而是将数据放入 X509_SIG 使用一些元数据对结构进行编码 i2d_X509_SIG openssl函数,然后最终加密此编码的结果。有没有一种方法可以重现这种用java对数据签名的方法?做 X509_SIG 一些java库中是否存在struct和编解码函数?码

ccrfmcuu

ccrfmcuu1#

你误会了什么 RSA_sign 做。
它忽略了一些不适用的特殊情况,实现了最初在pkcs1 v1中定义为“type 1”的rsa签名方案,现在在pkcs1 v2中保留为rsassa-pkcs1-v15(即pkcs1 v1.5中带有附录的rsa签名方案);参见rfc8017的第8.2节和第9.2节,以及第5.2节中的相关原语。要签名(或者如rfc更正式地声明的那样,生成签名),这将有效地按顺序执行以下操作:
e1。散列消息
e2。将哈希值加上哈希算法的算法标识符编码为asn.1结构digestinfo in der;由于der的工作方式,这相当于添加一个固定前缀,如第9.2节的注解所述。
图e3-5。带00 01 ff的衬垫(根据需要,但至少8)00
g2级。将八位字节字符串转换为一个数字,应用原语rsasp1对私有指数进行模幂运算,然后将(新的)数字转换回正确大小的八位字节字符串。历史上,一代人以前,这有时被描述为“用私钥加密”,rsavp1类似于“用公钥解密”,尽管这在语义上是错误的,因为签名不是加密,而且很快发现这种混淆导致了易受攻击和破坏的坏系统设计,所以在这个世纪我们称之为签名和验证。 RSA_sign 要求调用者执行散列步骤(e1)。然后它会呼叫 encode_pkcs1 要执行步骤e2,请使用 X509_SIG 对于标准称为 DigestInfo . 然后它会呼叫 RSA_private_encrypt e3-5和g2是哪个;这种命名是因为openssl是ssleay的后代,ssleay是几十年前写的,当时关于“签名是反向加密”的混淆仍然很普遍。
这个签名方案是(1)标准和(2)非常常见的,并且是用java加密实现的——包括标准所要求的散列步骤,它不同于openssl RSA_sign ,以及相同的digestinfo步骤。看到了吗 java.security.Signature 算法名称(方案) {SHA1,SHA256,etc}withRSA 在https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#signature-算法。

相关问题