通过 openssl 函数使用 sha1withRsa 检查文件是否正确
你好,我有file_data(xml格式)和file_signature(ASN1 DER),还有证书(X509 ASN1 DER)。我想检查 file_data 是否正确,但我有一些问题。我正在做什么:
主要想法:某个公司 A 创建 file_data,然后使用 SHA1 获取 file_data 的哈希值,并使用 RSA 私钥加密该哈希值并获取 file_signature。然后A公司向我发送了file_data和file_signature以及证书。我从证书 get file_signature 获取公钥,并使用公钥解密 file_signature 并获取 hash_1。然后我获取 file_data 并使用 SHA1 获取 hash_2。如果 hash_1 和 hash_2 相等,我可以信任 file_data 的内容,对吗?
实现:
- 加载证书:
d2i_X509_fp()
函数。现在我有证书了。 - 获取证书的公钥:
X509_extract_key
,现在我有了公钥。 - 现在我想加载 file_signature 以使用公钥对其进行解密,但是 file_signature 具有 ASN1 DER 格式,我如何加载它,我应该使用 OpenSSl 中的什么函数?
- 假设我读取了 file_signature,现在我必须解密它使用我的公钥,是否有用于此目的的 API?
- 假设我解密 file_signature 并得到 hash_1。
- 现在我必须加载 file_data 并使用 SHA1 函数 hash_2 获取它的哈希值,我必须使用什么函数?
SHA1()
,还是SHA1_Init、SHA1_Update、SHA1_Finish
? - 假设我得到 hash_1 和 hash_2,我必须如何使用 memcmp 比较它们?
- 假设我比较它们,如果它们相等,我可以使用 file_data。
另一个问题是 file_signature 是 128 字节 len,当我解密它时,我得到 128 字节 hash_1(我是吗),但是当我得到 file_data hash_2 的哈希时,它的长度只有 20 个字节,所以我如何比较它们,或者我误解了什么?
感谢您的帮助! PS 对不起我的英语;)。
Hi, i have file_data(xml format) and file_signature(ASN1 DER), and also have certificate(X509 ASN1 DER). I want to check if file_data is correct, but I have some problems. what I'm doing:
Main Idea: Some company A creates file_data, then using SHA1 gets hash of the file_data, and encrypts this hash using RSA private key and gets file_signature. Then company A sends me file_data and file_signature and certificate. I get public key from certificate get file_signature and decrypt file_signature using public key and get hash_1. Then i get file_data and use SHA1 to get hash_2. If hash_1 and hash_2 is equal, i can trust to content of the file_data, am I right?
Implementation:
- Load certificate:
d2i_X509_fp()
function. Now I have certificate. - Get public key of the certificate:
X509_extract_key
, now i have public key. - Now i want to load file_signature to decrypt it using public key, BUT file_signature has ASN1 DER format how I can load it, what function in OpenSSl should I use?
- Suppose I read file_signature, now I must decrypt it using my public key, is there any API for this purpose?
- Suppose I decrypt file_signature and get hash_1.
- Now I must load file_data and get hash of it using SHA1 function hash_2, what function I must use?
SHA1()
, orSHA1_Init, SHA1_Update, SHA1_Finish
? - Suppose I get hash_1 and hash_2, how i must compare them, using
memcmp
? - Suppose I compare them, if they are equal, i can use file_data.
another question is that file_signature is 128 byte len and when i decrypt it i get 128 byte hash_1(Am I rigth) , but when i get hash of the file_data hash_2 it's length is only 20 bytes, so how I can compare them, or I misunderstand something?
Thanks for your help!
p.s. sorry for my english;).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您获得 128 字节的 file_signature,则它可能不是 ASN.1 编码的。 128 位正好是 1024 位密钥的密钥长度(现在偏低,请检查 keylength.com)。如果使用 RSA,哈希值不会直接加密:首先将其包装在 ASN.1 结构中,然后进行填充,所有操作均根据 PKCS#1 v1.5(Google it)。
通常,您不会将散列与 RSA 加密分开执行。像 openssl 这样的库将包含执行验证的函数,其中自动计算哈希值(毫无疑问,这将是 openssl_verify())。这些功能也会为您进行比较。
请注意,您需要建立对公钥的信任,否则攻击者可能会生成随机密钥对并向您发送不同的公钥以及攻击者签名的数据。通常,预先使用直接通信或使用 PKI 基础设施(证书链)来信任公钥。
If you get a file_signature of 128 bytes, then it is probably not ASN.1 encoded. 128 bits is exactly the key length of a 1024 bit key (on the low side nowadays, check keylength.com). Hashes are not directly encrypted if RSA is used: first it is wrapped within an ASN.1 structure, and then it is padded, all according to PKCS#1 v1.5 (Google it).
Normally you don't perform the hashing separately from the RSA encrypt. Libraries like openssl will contain functions to perform verification where the hash is automatically calculated (no doubt this would be openssl_verify()). Those functions will also do the compare for you.
Note that you will need to establish trust for the public key, otherwise an attacker could just generate a random key pair and send you a different public key together with the attackers signed data. Normally public keys are trusted using direct communication beforehand, or using a PKI infrastructure (certificate chains).