#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