【问题标题】:Check if the file is correct using sha1withRsa via openssl functions通过 openssl 函数使用 sha1withRsa 检查文件是否正确
【发布时间】:2011-04-12 07:16:41
【问题描述】:

嗨,我有 file_data(xml 格式)和 file_signature(ASN1 DER),还有证书(X509 ASN1 DER)。我想检查 file_data 是否正确,但我有一些问题。我在做什么:

主要思想:某公司A创建file_data,然后使用SHA1获取file_data的hash,并使用RSA私钥加密此hash并获取file_signature。然后 A 公司向我发送 file_data 和 file_signature 和证书。我从证书获取文件签名中获取公钥并使用公钥解密文件签名并获取 hash_1。然后我得到 file_data 并使用 SHA1 得到 hash_2。如果 hash_1 和 hash_2 相等,我可以相信 file_data 的内容,对吗?

实施:

  1. 加载证书:d2i_X509_fp() 函数。现在我有证书了。
  2. 获取证书的公钥:X509_extract_key,现在我有公钥了。
  3. 现在我想加载 file_signature 以使用公钥对其进行解密,但 file_signature 具有 ASN1 DER 格式我如何加载它,我应该使用 OpenSSl 中的什么函数?
  4. 假设我读取了 file_signature,现在我必须使用我的公钥对其进行解密,是否有任何 API 可用于此目的?
  5. 假设我解密 file_signature 并获得 hash_1。
  6. 现在我必须加载 file_data 并使用 SHA1 函数 hash_2 获取它的哈希值,我必须使用什么函数? SHA1(),还是SHA1_Init, SHA1_Update, SHA1_Finish
  7. 假设我得到 hash_1 和 hash_2,我必须如何比较它们,使用 memcmp
  8. 假设我比较它们,如果它们相等,我可以使用 file_data。

另一个问题是 file_signature 是 128 字节 len,当我解密它时,我得到 128 字节 hash_1(Am I rigth),但是当我得到 file_data hash_2 的哈希时,它的长度只有 20 字节,所以我如何比较它们,还是我误会了什么?

感谢您的帮助! p.s.对不起我的英语不好;)。

【问题讨论】:

  • ASN1 DER 不是签名格式。 ASN.1 是用于描述数据结构的标准。 DER (Distinguished Encoding Rules) 是 ASN.1 结构编码的规范。您是否有关于签名格式(原始 RSA/PKCS 1、CMS...)的任何其他信息?

标签: c cryptography openssl x509


【解决方案1】:

如果你得到一个 128 字节的文件签名,那么它可能不是 ASN.1 编码的。 128 位恰好是 1024 位密钥的密钥长度(现在偏低,请查看 keylength.com)。如果使用 RSA,则不会直接加密哈希:首先将其包装在 ASN.1 结构中,然后对其进行填充,所有操作均根据 PKCS#1 v1.5(Google 搜索)。

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

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

【讨论】:

  • PS 你的英文很好 - 使用大写的“I”看起来更专业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多