生成、签名和验证数字签名
Generating, Signing and Verifying Digital Signature
这是我项目中的一个问题。
In this task, we will use OpenSSL to generate digital signatures. Please prepare a file (example.txt) of any size. Also prepare an RSA public/private key pair. Then do the following:
- Sign the SHA256 hash of example.txt; save the output in example.sha256.
- Verify the digital signature in example.sha256.
- Slightly modify example.txt, and verify the digital signature again.
Please describe how you performed the above three operations (e.g., the exact commands that you used, etc.). Describe what you observed and explain your observations. Please also explain why digital signatures are useful in general.
所以,我执行以下操作。
1.Create private/public 密钥对
openssl genrsa -out private.pem 1024
2。正在提取 Public 密钥。
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
3。创建数据的哈希值。
echo 'data to sign' > example.txt
openssl dgst -sha256 < example.txt > hash
4。使用私钥将哈希签名到名为 example.sha256
的文件
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > example.sha256
5.验证文件(example.txt)和数字签名(example.sha256)
openssl dgst -sha256 -verify public.pem -signature example.sha256 example.txt
完成所有这些操作后,我收到一条错误消息“验证失败”
如有错误请指正
不要为此使用 rsautl
。
根据 PKCS1.5,签署进入 RSA 操作的数据格式如下所示:
<padding><metadata><hash of input>
(元数据指定使用了哪个哈希函数。)
当您尝试验证签名时,openssl dgst -verify
正在寻找这种格式。然而,这不是您在步骤中创建的内容。
首先,openssl dgst
的默认输出是结果散列的 十六进制编码 ,而不是原始字节。
其次,rsautl
相当“低级”,签名时不会添加 openssl dgst -verify
期望的元数据,尽管它确实添加了填充。
这两件事加在一起意味着您正在使用的数据如下所示:
<padding><hex digits of hash of input>
显然这与 openssl dgst -verify
的预期不符,因此验证失败。
可以为 rsautl
创建格式正确的输入,但这会很尴尬并且涉及处理 ASN.1 细节。您也可以使用 rsautl -verify
而不是 dgst -verify
,但这还需要更多详细信息,并且意味着您使用的是非标准签名格式。
最简单的解决方案是使用 openssl dgst
来创建和验证签名。将步骤 3 和 4(创建 example.txt
文件除外)替换为单个命令:
$ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt
这会散列数据,正确地格式化散列并对其执行 RSA 操作。生成的文件应使用 openssl dgst -verify
命令正确验证。
感谢马特提供解决方案。小尼特:
OP 似乎想要签署散列而不是实际的整个数据(也是我想要做的事情)。所以使用下面生成签名:
openssl dgst -sha256 -sign private.pem -out hash.sig hash
及下方验证签名
openssl dgst -sha256 -verify public.pem -signature hash.sig hash
最后像下面这样验证负载的完整性:
echo "`hash` example.txt" | sha256sum -c --strict
这是我项目中的一个问题。
In this task, we will use OpenSSL to generate digital signatures. Please prepare a file (example.txt) of any size. Also prepare an RSA public/private key pair. Then do the following:
- Sign the SHA256 hash of example.txt; save the output in example.sha256.
- Verify the digital signature in example.sha256.
- Slightly modify example.txt, and verify the digital signature again.
Please describe how you performed the above three operations (e.g., the exact commands that you used, etc.). Describe what you observed and explain your observations. Please also explain why digital signatures are useful in general.
所以,我执行以下操作。
1.Create private/public 密钥对
openssl genrsa -out private.pem 1024
2。正在提取 Public 密钥。
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
3。创建数据的哈希值。
echo 'data to sign' > example.txt
openssl dgst -sha256 < example.txt > hash
4。使用私钥将哈希签名到名为 example.sha256
的文件openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > example.sha256
5.验证文件(example.txt)和数字签名(example.sha256)
openssl dgst -sha256 -verify public.pem -signature example.sha256 example.txt
完成所有这些操作后,我收到一条错误消息“验证失败”
如有错误请指正
不要为此使用 rsautl
。
根据 PKCS1.5,签署进入 RSA 操作的数据格式如下所示:
<padding><metadata><hash of input>
(元数据指定使用了哪个哈希函数。)
当您尝试验证签名时,openssl dgst -verify
正在寻找这种格式。然而,这不是您在步骤中创建的内容。
首先,openssl dgst
的默认输出是结果散列的 十六进制编码 ,而不是原始字节。
其次,rsautl
相当“低级”,签名时不会添加 openssl dgst -verify
期望的元数据,尽管它确实添加了填充。
这两件事加在一起意味着您正在使用的数据如下所示:
<padding><hex digits of hash of input>
显然这与 openssl dgst -verify
的预期不符,因此验证失败。
可以为 rsautl
创建格式正确的输入,但这会很尴尬并且涉及处理 ASN.1 细节。您也可以使用 rsautl -verify
而不是 dgst -verify
,但这还需要更多详细信息,并且意味着您使用的是非标准签名格式。
最简单的解决方案是使用 openssl dgst
来创建和验证签名。将步骤 3 和 4(创建 example.txt
文件除外)替换为单个命令:
$ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt
这会散列数据,正确地格式化散列并对其执行 RSA 操作。生成的文件应使用 openssl dgst -verify
命令正确验证。
感谢马特提供解决方案。小尼特: OP 似乎想要签署散列而不是实际的整个数据(也是我想要做的事情)。所以使用下面生成签名:
openssl dgst -sha256 -sign private.pem -out hash.sig hash
及下方验证签名
openssl dgst -sha256 -verify public.pem -signature hash.sig hash
最后像下面这样验证负载的完整性:
echo "`hash` example.txt" | sha256sum -c --strict