我使用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.function不支持错误。我做了一些研究,我发现的解释似乎暗示着我正在使用的openSC库文件(*.so)不支持这个函数(encrypt)。然而,我觉得很难相信签名功能工作得很好。在
为了确保我可以在会话上下文之外使用这个特定的公钥,我使用加密包尝试了以下代码:
^{pr2}$
所以,似乎使用我的独立公钥可以加密数据。但是为什么我不能在pkcs11令牌会话的上下文中执行呢?在
然后,我尝试使用pkcs11 Object decrypt函数对上面使用Crypto module生成的数据进行解密:decrypted = private.decrypt(encr_data) # It fails!
上述结果因pkcs11的pkcs11而失败。异常。机械无效错误。我尝试使用不同的机制,但所有这些都导致了相同的错误。有趣的是,pkcs11对象至少允许我调用decrypt函数,而不会抱怨它不受支持。在
还有一件事我应该提一下。我检查了我的证书,在Extension->;certificate Key Usage下,它显示:Critical
Signing
Key Encipherment
我读到了密钥加密和数据加密的区别,发现密钥加密是用来加密秘密(对称)密钥而不是数据。这是我不能在这个令牌会话中使用加密函数的原因吗?在
如有任何反馈,我们将不胜感激!在