C 通过openssl函数使用SHA1 WithRSA检查文件是否正确 嗨,我有文件数据(xml格式)和文件签名(ASN1 DER),还有证书(X509 ASN1 DER)。我想检查文件\u数据是否正确,但我有一些问题。我在做什么:

C 通过openssl函数使用SHA1 WithRSA检查文件是否正确 嗨,我有文件数据(xml格式)和文件签名(ASN1 DER),还有证书(X509 ASN1 DER)。我想检查文件\u数据是否正确,但我有一些问题。我在做什么:,c,cryptography,openssl,x509,C,Cryptography,Openssl,X509,主要思想:某公司A创建文件\u数据,然后使用SHA1获取文件\u数据的散列,并使用RSA私钥加密该散列并获取文件\u签名。然后,A公司向我发送文件数据、文件签名和证书。我从证书获取公钥获取文件\签名,并使用公钥解密文件\签名并获取哈希值\ 1。然后我得到文件\ u数据并使用SHA1得到散列\ u 2。若hash_1和hash_2相等,我可以信任文件_数据的内容,对吗 实施: 加载证书:d2i\u X509\u fp()函数。现在我有证书了 获取证书的公钥:X509\u extract\u key

主要思想:某公司A创建文件\u数据,然后使用SHA1获取文件\u数据的散列,并使用RSA私钥加密该散列并获取文件\u签名。然后,A公司向我发送文件数据、文件签名和证书。我从证书获取公钥获取文件\签名,并使用公钥解密文件\签名并获取哈希值\ 1。然后我得到文件\ u数据并使用SHA1得到散列\ u 2。若hash_1和hash_2相等,我可以信任文件_数据的内容,对吗

实施:

  • 加载证书:
    d2i\u X509\u fp()
    函数。现在我有证书了
  • 获取证书的公钥:
    X509\u extract\u key
    ,现在我有了公钥
  • 现在我想加载文件\u签名以使用公钥对其进行解密,但文件\u签名具有ASN1 DER格式如何加载,我应该在OpenSSl中使用什么函数?
  • 假设我读取了文件的签名,现在我必须使用我的公钥对其进行解密,是否有用于此目的的API
  • 假设我解密文件签名并得到哈希值1
  • 现在我必须加载文件_数据并使用SHA1函数hash_2获取其哈希值,我必须使用什么函数<代码>SHA1(),或
    SHA1_初始化、SHA1_更新、SHA1_完成
  • 假设我得到hash_1和hash_2,我必须如何比较它们,使用
    memcmp
  • 假设我比较它们,如果它们相等,我可以使用file_数据
  • 另一个问题是,文件\u签名是128字节len,当我解密它时,我得到128字节的哈希值\u 1(正确吗),但当我得到文件\u数据哈希值\u 2的哈希值时,它的长度只有20字节,所以我如何比较它们,或者我误解了什么

    谢谢你的帮助!
    p、 对不起,我的英语不好

    如果您得到一个128字节的文件\u签名,那么它可能不是ASN.1编码的。128位正好是1024位密钥的密钥长度(现在,在低端,请查看keylegth.com)。如果使用RSA,则哈希不会直接加密:首先将其包装在ASN.1结构中,然后对其进行填充,所有这些都符合PKCS#1v1.5(Google it)的要求

    通常,您不会将散列与RSA加密分开执行。像openssl这样的库将包含一些函数,用于执行自动计算哈希的验证(毫无疑问,这将是openssl_verify()。这些函数也将为您进行比较


    请注意,您需要为公钥建立信任,否则攻击者可能只会生成一个随机密钥对,并将不同的公钥与攻击者签名的数据一起发送给您。通常,使用直接通信或使用PKI基础设施(证书链)信任公钥。

    ASN1 DER不是签名格式。ASN.1是用于描述数据结构的标准。DER(区分编码规则)是ASN.1结构编码的规范。你有关于签名格式(原始RSA/PKCS 1,CMS…)的其他信息吗?PS你的英语很好-使用大写字母“I”看起来更专业。