c++ - 带有 RSA 加密的 SHA-256
问题描述
我正在尝试手动验证自签名证书的数字签名。SHA-256 RSA 认证。
据我了解,数字签名是使用公式验证的s^e mod m
。在输出中,我得到一个 2048 位的数字,而哈希本身是 256 位的。我读到它需要完成到 2048 位。这是怎么做到的?
PS据我了解,我需要在哈希和上使用I2OSP函数或在解码后的数字上使用OS2IP。我无法理解这些函数的算法。我的数字存储为字节数组:数字:0x123456789A 数据:[0] = 9A | [1] = 78 | [2] = 56 ... 你能写 C 代码或者至少是伪代码吗?
解决方案
X.509 在进行模幂运算之前签名员工填充。https://www.rfc-editor.org/rfc/rfc8017#section-8.2.2描述了流程,但最相关的部分可能是:
Steps:
1. Apply the hash function to the message M to produce a hash
value H:
H = Hash(M).
If the hash function outputs "message too long", output
"message too long" and stop.
2. Encode the algorithm ID for the hash function and the hash
value into an ASN.1 value of type DigestInfo (see
Appendix A.2.4) with the DER, where the type DigestInfo has
the syntax
DigestInfo ::= SEQUENCE {
digestAlgorithm AlgorithmIdentifier,
digest OCTET STRING
}
The first field identifies the hash function and the second
contains the hash value. Let T be the DER encoding of the
DigestInfo value (see the notes below), and let tLen be the
length in octets of T.
3. If emLen < tLen + 11, output "intended encoded message length
too short" and stop.
4. Generate an octet string PS consisting of emLen - tLen - 3
octets with hexadecimal value 0xff. The length of PS will be
at least 8 octets.
5. Concatenate PS, the DER encoding T, and other padding to form
the encoded message EM as
EM = 0x00 || 0x01 || PS || 0x00 || T.
6. Output EM.
从 X.509 证书中提取相关位也不是最简单的事情。
推荐阅读
- python - 如何在 Gremlin-python 中向现有顶点添加边?
- node.js - 你能在 Jenkins 电子邮件正文中添加 mocha 报告吗
- c# - 如何在 c# selenium 中获取用于 div 可见条件的值
- flutter - 从firebase颤振中的已知文档中获取字段值
- c++ - 如何在 std unordered_set 中使用 boost hash_value?
- javascript - 如何防止 React 应用程序中出现 Prettier 错误?
- reactjs - React - Firebase 身份验证和 useContext
- c++ - TGA 颜色映射颜色转换为 RGB 或 RGBA
- visual-studio - Xamarin.Forms:当我尝试通过 Visual Studio 迁移到 AndroidX 时没有任何反应
- artificial-intelligence - 一次性学习与其他面部识别算法