RSA decryption of AES Session key fails with 'AttributeError: 'bytes' object has no attribute 'n'
RSA decryption of AES Session key fails with 'AttributeError: 'bytes' object has no attribute 'n'
我正在 Python 3.6 上从 PyCryptodome 实现 public 密钥加密。当我尝试创建对称加密密钥和 encrypt/decrypt 变量时,一切正常。但是在我引入 RSA(和 PKCS1_OAEP)的那一刻,一切都失败了——session_key
加密很好,但是当我尝试解密它时,我得到以下错误:
Traceback (most recent call last):
File "enctest.py", line 109, in <module>
deckey = decrypt_val(enckey)
File "enctest.py", line 77, in decrypt_val
session_key = cipher.decrypt(ciphertext)
File "/usr/lib/python3.6/site-packages/Crypto/Cipher/PKCS1_OAEP.py", line 187, in decrypt
modBits = Crypto.Util.number.size(self._key.n)
AttributeError: 'bytes' object has no attribute 'n'
我的代码如下。任何人都可以看看并告诉我我做错了什么吗?
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Random import get_random_bytes
random_generator = Random.new().read
keys = RSA.generate(1024, random_generator)
pubkey = keys.publickey()
privkey = keys.exportKey()
pubcipher = PKCS1_OAEP.new(pubkey) # ciphertext = cipher.encrypt(message)
privcipher = PKCS1_OAEP.new(privkey) # message = cipher.decrypt(ciphertext)
privkeystr = keys.exportKey(format='PEM', passphrase=None, pkcs=1)
pubkeystr = keys.publickey().exportKey(format='PEM', passphrase=None, pkcs=1)
def encrypt_val(session_key, cipher = pubcipher):
try:
session_key = session_key.encode('utf8')
except:
pass
ciphertext = cipher.encrypt(session_key)
print("encrypted key : %s \n" % ciphertext)
return ciphertext
def decrypt_val(ciphertext, cipher = privcipher):
session_key = cipher.decrypt(ciphertext)
try:
session_key = session_key.decode('utf8')
except:
pass
return session_key
def aesenc(data):
try:
data = data.encode('utf8')
except:
pass
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data)
aesencdict = {'aesdict' : {'ciphertext' : ciphertext, 'tag' : tag, 'nonce' : cipher.nonce} , 'key' : key}
return(aesencdict)
def aesdec(aesdict, key):
cipher = AES.new(key, AES.MODE_EAX, aesdict['nonce'])
data = cipher.decrypt_and_verify(aesdict['ciphertext'], aesdict['tag'])
try:
data = data.decode('utf8')
except:
pass
return data
val = "hello"
encval = aesenc(val)
enckey = encrypt_val(encval['key'])
print(enckey)
deckey = decrypt_val(enckey)
print(deckey)
if deckey == encval['key']:
outval = aesdec(encval['aesdict'], encval['key'])
print(val, outval)
else:
print("oops\n")
您似乎进行了虚假导出,将密钥转换为密钥的编码:
privkey = keys.exportKey()
....
privcipher = PKCS1_OAEP.new(privkey) # message = cipher.decrypt(ciphertext)
之后它会尝试从编码密钥而不是从包含成员 n
.
的对象实例中找到模数 n
尝试:
privcipher = PKCS1_OAEP.new(keys)
相反。
我正在 Python 3.6 上从 PyCryptodome 实现 public 密钥加密。当我尝试创建对称加密密钥和 encrypt/decrypt 变量时,一切正常。但是在我引入 RSA(和 PKCS1_OAEP)的那一刻,一切都失败了——session_key
加密很好,但是当我尝试解密它时,我得到以下错误:
Traceback (most recent call last):
File "enctest.py", line 109, in <module>
deckey = decrypt_val(enckey)
File "enctest.py", line 77, in decrypt_val
session_key = cipher.decrypt(ciphertext)
File "/usr/lib/python3.6/site-packages/Crypto/Cipher/PKCS1_OAEP.py", line 187, in decrypt
modBits = Crypto.Util.number.size(self._key.n)
AttributeError: 'bytes' object has no attribute 'n'
我的代码如下。任何人都可以看看并告诉我我做错了什么吗?
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Random import get_random_bytes
random_generator = Random.new().read
keys = RSA.generate(1024, random_generator)
pubkey = keys.publickey()
privkey = keys.exportKey()
pubcipher = PKCS1_OAEP.new(pubkey) # ciphertext = cipher.encrypt(message)
privcipher = PKCS1_OAEP.new(privkey) # message = cipher.decrypt(ciphertext)
privkeystr = keys.exportKey(format='PEM', passphrase=None, pkcs=1)
pubkeystr = keys.publickey().exportKey(format='PEM', passphrase=None, pkcs=1)
def encrypt_val(session_key, cipher = pubcipher):
try:
session_key = session_key.encode('utf8')
except:
pass
ciphertext = cipher.encrypt(session_key)
print("encrypted key : %s \n" % ciphertext)
return ciphertext
def decrypt_val(ciphertext, cipher = privcipher):
session_key = cipher.decrypt(ciphertext)
try:
session_key = session_key.decode('utf8')
except:
pass
return session_key
def aesenc(data):
try:
data = data.encode('utf8')
except:
pass
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data)
aesencdict = {'aesdict' : {'ciphertext' : ciphertext, 'tag' : tag, 'nonce' : cipher.nonce} , 'key' : key}
return(aesencdict)
def aesdec(aesdict, key):
cipher = AES.new(key, AES.MODE_EAX, aesdict['nonce'])
data = cipher.decrypt_and_verify(aesdict['ciphertext'], aesdict['tag'])
try:
data = data.decode('utf8')
except:
pass
return data
val = "hello"
encval = aesenc(val)
enckey = encrypt_val(encval['key'])
print(enckey)
deckey = decrypt_val(enckey)
print(deckey)
if deckey == encval['key']:
outval = aesdec(encval['aesdict'], encval['key'])
print(val, outval)
else:
print("oops\n")
您似乎进行了虚假导出,将密钥转换为密钥的编码:
privkey = keys.exportKey()
....
privcipher = PKCS1_OAEP.new(privkey) # message = cipher.decrypt(ciphertext)
之后它会尝试从编码密钥而不是从包含成员 n
.
n
尝试:
privcipher = PKCS1_OAEP.new(keys)
相反。