Cryptography 如何获取散列的公钥值(PyKCS11)

Cryptography 如何获取散列的公钥值(PyKCS11),cryptography,smartcard,hashlib,Cryptography,Smartcard,Hashlib,在使用PyKCS11时,我从智能卡中提取了一个公钥。现在,我需要用sha256散列该键。但是,公钥对象包含许多值: CKA_ALWAYS_SENSITIVE: True CKA_CLASS: CKO_PUBLIC_KEY CKA_DECRYPT: False CKA_DERIVE: False CKA_ENCRYPT: False (...) CKA_KEY_TYPE: CKK_RSA CKA_MODIFIABLE: False CKA_MODULUS: (200, 163, 157, 146,

在使用PyKCS11时,我从智能卡中提取了一个公钥。现在,我需要用sha256散列该键。但是,公钥对象包含许多值:

CKA_ALWAYS_SENSITIVE: True
CKA_CLASS: CKO_PUBLIC_KEY
CKA_DECRYPT: False
CKA_DERIVE: False
CKA_ENCRYPT: False
(...)
CKA_KEY_TYPE: CKK_RSA
CKA_MODIFIABLE: False
CKA_MODULUS: (200, 163, 157, 146, 3, (...))
要使用hashlib散列密钥,只需要它不接受iterables的一个属性

我应该使用什么属性?我考虑的是CK_值或CK_模,但PyKCS11的文档并没有明确说明哪一个是正确的


谢谢

您需要散列什么取决于您需要什么

通常,模数是散列的,而不是整个密钥的编码。对模数进行散列运算将导致公钥和私钥的值相同,以便您可以将两者标识为来自同一对。结果或结果最左边的字节通常用作键检查值或KCV


每个密钥对的模数应该是唯一的。如果不是这样,您的随机数生成器可能已损坏或没有良好的种子,如果生成多个密钥,则检查此项不会有什么坏处。因此,模上的散列将唯一标识您的公钥,即使指数没有散列。

在这种情况下,我想与服务器交换消息。我将把我智能卡的散列公钥发送到该服务器,私钥将保留在智能卡中。考虑到这一点,我真的需要一种方法来唯一地标识每个密钥,所以,根据您刚才写的,也许我不应该散列模,因为它在私钥和公钥中产生相同的结果。另外,我发现PyKCS11上有一个函数session.digest,它允许我用sha256散列密钥,所以我不需要使用hashlib。但是问题仍然存在。您是否担心您错误地发送了私钥?向服务器发送公钥散列有什么意义?您无法使用公钥的散列进行验证或解密-仅发送公钥本身就更有意义-当然最好是以某种可信的方式。散列公钥摘要用作smartcardWell所有者用户的ID,正如我所说,因为模数标识公钥,所以使用它没有什么错。如果您想包含公共指数(通常只是0x010001),那么请随意使用,但1您必须决定编码,2它不会添加任何额外的标识信息。