使用pkcs11模块使用公共密钥加密数据失败

原始乌克

我正在使用Python的pkcs11程序包访问存储在Yubikey 5中的X.509证书。使用pkcs11对象访问证书,公钥和私钥与签名和签名验证一样正常。但是,对于我的一生,我无法弄清楚为什么使用公钥加密无法正常工作。这是我的代码:

import pkcs11
from pkcs11 import Attribute, ObjectClass, KeyType, util
lib = pkcs11.lib('/usr/lib/x86_64-linux-gnu/pkcs11/onepin-opensc-pkcs11.so')
token = lib.get_token(token_label='PIV Card Holder pin (PIV_II)'
session = token.open(user_pin=pin)
# Getting a private and a public key as pkcs11 Object
private = next(session.get_objects({
    Attribute.CLASS: ObjectClass.PRIVATE_KEY, 
}))
public = next(session.get_objects({
    Attribute.CLASS: ObjectClass.PUBLIC_KEY, 
}))
data = 'Hello, world!'
sig = private.sign(data) # Works!
sig_verif = public.verify(data, sig) # Works!
print("Signature is valid? "+str(sig_verif)) # True
# So far, everything above worked fine.
# ----------
# Now, this is the part that does not work
encrypt_data = public.encrypt(data) # Fails!

上面的最后一行因pkcs11.exceptions.FunctionNotSupported错误而失败我做了一些研究,发现的解释似乎暗示我使用的openSC库文件(* .so)不支持此功能(加密)。但是,我很难相信考虑到签名功能就可以正常工作。

为了确保可以在会话上下文之外使用此特定的公钥,我使用Crypto包尝试了以下代码:

from Crypto.Cipher import PKCS1_OAEP
public_key = RSA.importKey(public[Attribute.VALUE]) # The content of pkcs11 public key as DER
cipher = PKCS1_OAEP.new(public_key)
encr_data = cipher.encrypt(data) # This works!

因此,似乎使用我的独立公共密钥可以使我加密数据。但是,为什么不能在pkcs11令牌会话的上下文中执行此操作?

然后,我尝试使用pkcs11对象解密函数来尝试解密使用上述Crypto模块生成的数据:

decrypted = private.decrypt(encr_data) # It fails!

上面的操作因pkcs11.exceptions.MechanismInvalid错误而失败我尝试使用不同的机制,但所有机制均导致相同的错误。有趣的是-似乎pkcs11对象使我至少可以调用解密函数而不会抱怨它不受支持。

我还要提一件事。我检查了证书,发现在扩展->证书密钥用法下,它说:

Critical
Signing
Key Encipherment

我阅读了密钥加密数据加密之间的区别,并了解到密钥加密用于加密秘密(对称)密钥而不是数据。这可能是我无法在此令牌会话中使用加密功能的原因吗?

任何反馈将不胜感激!

马丁·波德威斯

抱歉,但这只是API的一个缺点。由于使用公钥加密不需要任何安全性,因此在Yubikey上实现它没有任何意义。导出公钥值并在主机上执行加密要快得多。

公平地说,Yubikey可能很好,并且可以在Ubikey PKCS#11库中的软件中实现该功能。如果确实需要,那么您可以创建一个新的PKCS#11“包装器”库,确实包含软件中缺少的功能。Yubikey确实实现的所有其他命令都可以转发到原始的Yubikey PKCS#11库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

使用Java keytool的PKCS11格式密钥

来自分类Dev

如何在 Firefox 中使用 pkcs11 模块

来自分类Dev

智能卡PKCS11 AES密钥生成失败

来自分类Dev

PKCS11:导出不敏感的可提取密钥

来自分类Dev

PKCS11:导出不敏感且可提取的密钥

来自分类Dev

在使用公共密钥在php中加密后,如何使用私有密钥在c#中的块中解密数据?

来自分类Dev

在JAVA中使用pkcs11包装器对XML进行签名

来自分类Dev

配置WPA请求者以使用tpm2 pkcs11工具

来自分类Dev

使用 pkcs11 USB 令牌解密 pdf 时出现 Itextpdf 错误

来自分类Dev

使用jsrsasign使用加密的RSA密钥签名失败

来自分类Dev

PKCS11命令流

来自分类Dev

PKCS11,对象针

来自分类Dev

Android +加密:导出公共密钥,使用openssl加密,然后回读

来自分类Dev

使用密钥加密消息

来自分类Dev

PKCS11将私有RSA密钥解包到eToken HSM

来自分类Dev

在java.security.KeyStore PKCS11中设置并获取DES密钥

来自分类Dev

无法使用pkcs#11模块登录ubuntu

来自分类Dev

无法使用pkcs#11模块登录ubuntu

来自分类Dev

使用Mcrypt使用密码而不是密钥来加密数据

来自分类Dev

无法使用 PyAsn1 Python 从 pkcs7 信封中获取加密密钥

来自分类Dev

使用本地密钥MONGODB启用数据加密时出错

来自分类Dev

使用其他密钥加密写入LVM快照的数据

来自分类Dev

未能使用错误消息“权限被拒绝(公共密钥)”来加密远程主机

来自分类Dev

如何使用NodeJS中的公共密钥仅加密JSON有效负载的选定值?

来自分类Dev

如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?

来自分类Dev

PKCS11 Python FindObjects in available slots

来自分类Dev

如何使用加密密钥加密消息

Related 相关文章

  1. 1

    使用openssl的PKCS11密钥包装

  2. 2

    使用openssl的PKCS11密钥包装

  3. 3

    使用Java keytool的PKCS11格式密钥

  4. 4

    如何在 Firefox 中使用 pkcs11 模块

  5. 5

    智能卡PKCS11 AES密钥生成失败

  6. 6

    PKCS11:导出不敏感的可提取密钥

  7. 7

    PKCS11:导出不敏感且可提取的密钥

  8. 8

    在使用公共密钥在php中加密后,如何使用私有密钥在c#中的块中解密数据?

  9. 9

    在JAVA中使用pkcs11包装器对XML进行签名

  10. 10

    配置WPA请求者以使用tpm2 pkcs11工具

  11. 11

    使用 pkcs11 USB 令牌解密 pdf 时出现 Itextpdf 错误

  12. 12

    使用jsrsasign使用加密的RSA密钥签名失败

  13. 13

    PKCS11命令流

  14. 14

    PKCS11,对象针

  15. 15

    Android +加密:导出公共密钥,使用openssl加密,然后回读

  16. 16

    使用密钥加密消息

  17. 17

    PKCS11将私有RSA密钥解包到eToken HSM

  18. 18

    在java.security.KeyStore PKCS11中设置并获取DES密钥

  19. 19

    无法使用pkcs#11模块登录ubuntu

  20. 20

    无法使用pkcs#11模块登录ubuntu

  21. 21

    使用Mcrypt使用密码而不是密钥来加密数据

  22. 22

    无法使用 PyAsn1 Python 从 pkcs7 信封中获取加密密钥

  23. 23

    使用本地密钥MONGODB启用数据加密时出错

  24. 24

    使用其他密钥加密写入LVM快照的数据

  25. 25

    未能使用错误消息“权限被拒绝(公共密钥)”来加密远程主机

  26. 26

    如何使用NodeJS中的公共密钥仅加密JSON有效负载的选定值?

  27. 27

    如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?

  28. 28

    PKCS11 Python FindObjects in available slots

  29. 29

    如何使用加密密钥加密消息

热门标签

归档