Ошибки проверки цифровой подписи

#python #digital-signature

#python #цифровая подпись

Вопрос:

Я шифрую элементы списка, создаю цифровые подписи и проверяю, что список был отправлен мной. Однако при попытке проверки я получаю сообщение об ошибке. Вот мой код. Пожалуйста, помогите

 from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256

###################### A Decryption Algorithm ##########################
def decrypt (counterPriv, encryptedVote, decrypt):
 length = len(encryptedVote)

 for index in range(length):
     cipher = PKCS1_OAEP.new(counterPriv)
     plaintext = cipher.decrypt(encryptedVote[index])
     decrypt.append(plaintext)
 

######################################################################


############### My Personal Digital Signature Function ##############

def sign (privateKey, dataList, emptySig, hashList):
 dataLength = len(dataList)

 for index in range(dataLength):
     h = SHA256.new()
     h.update(dataList[index])
     signature = pkcs1_15.new(privateKey).sign(h)
     emptySig.append(signature)
     hashList.append(h)

############################################################################

authen_key = RSA.generate(1024, e=65537)
authen_priv_key = authen_key.exportKey("PEM")
authen_public_key = authen_key.publickey().exportKey("PEM")

counter_key = RSA.generate(1024, e=65537)
counter_priv_key = counter_key.exportKey("PEM")
counter_public_key = counter_key.publickey().exportKey("PEM")

decrypt2 = []
myAnswer = ['Bob', 'Dylan', '12345']
myAnswerEncrypted = []

counterPublicKey = RSA.importKey(counter_public_key)

for index in range(3):
    cipher = PKCS1_OAEP.new(counterPublicKey)
    ciphertext = cipher.encrypt(myAnswer[index].encode("utf-8"))
    myAnswerEncrypted.append(ciphertext)

decrypt(RSA.importKey(counter_priv_key), myAnswerEncrypted, decrypt2)

hashList = []
Signature_List = []
sign(RSA.importKey(authen_priv_key), decrypt2, Signature_List, hashList)

for index in range(len(hashList)):
    try:
        pkcs1_15.new(authen_key.publickey()).verify(hashList[index], 
         Signature_List[index])
    except (ValueError, TypeError):
 

У меня возникли проблемы с функцией .verify(). Вывод компьютера сообщает мне, что «AttributeError: объект ‘bytes’ не имеет атрибута ‘n'»

Комментарии:

1. authen_public_key это сериализованная форма открытого ключа, подходящая для сохранения и совместного использования с другими. Ожидаемый аргумент — это .verify() объект python соответствующего типа, например authen_key.publickey() , должен работать.

2. @PresidentJamesK. Полк спасибо. Это работает! Я внесу правку

Ответ №1:

Существует два модуля шифрования. Pycrypto и pycryptodome. Я пытаюсь, и ваш код работает с двумя модулями.

С помощью pycrypto мне нужно переименовать pkcs1_15 в PKCS1_v1_5:

 from Crypto.Signature import PKCS1_v1_5 as pkcs1_15
 

Однако я полагаю, что у вас конфликт с двумя модулями, и я объясню почему.

В модуле pkcs1_15.new(privateKey).sign(h) pycrypto возвращает byte объект, а с помощью pycryptodome возвращает string объект. Таким образом, возможно, вы используете объединенный импорт. Попробуйте запустить в чистой среде.

Комментарии:

1. Ginklings Я изменил часть импорта своего кода, но все равно получаю сообщение об ошибке: AttributeError: объект ‘bytes’ не имеет атрибута ‘n’

2. Как вы это выполняете?? Потому что я запускаю его, и он работает. Попробуйте переустановить python или (лучше) использовать выделенную электронную среду (с виртуальной средой или conda)

3. Проблески, которые я использую Spyder