#python #rsa #digital-signature #pkcs#1
Вопрос:
Я хочу выполнить подпись SHA256withRSA шестнадцатеричной строки (0xDEADBEEF в этом примере) с помощью модуля PKCS1_PSS в Python:
import Crypto
from Crypto.Signature import PKCS1_PSS
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto import Random
import binascii
message = 'DEADBEEF'
message = binascii.unhexlify(message)
h = SHA256.new(message) # sha256 hashing the message
my_hash = binascii.hexlify(h.digest())
Я получаю следующий хэш :
b'5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953'
Затем я подписываю его, используя следующий закрытый ключ :
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDRFNU 93aEvz3cV8LSUP9ib3iUxT7SufdVXcgVFK9M3BYzvro
A1uO/parFOJABTkNhTPPP/6mjrU2CPEZJ1zIkpaSNJrrhpp/rNMO9nyLYPGs9Mfd
BiWUPmHW5mY1oD0ye4my0tEsHOlgHC8AhA8OtiHr6IY0agXmH/y5YmSWbwIDAQAB
AoGAAj/IH3pUI6FqqTrF /gYzCRsL4AXTLC8l8vwkR93GGPyRHJNjqtik8I3WrXJ
zUiBGZ0iNouIsL/ QQuNlGiw/c5i2X3nTntREDS9xs2M0x MWD/5qI1sn0Qk0HNP
BbDczlvO8wXNFGIHiTiPVEawoeNwhMqJDyGcbsEOZp2pLokCQQDvlMBU6dOeOP9a
jnENFSlrvzNR0nugFeoGmfq6s4Czz2QtUd9baKqBfEBSdJskwFVHgxbFA1Dc7iFu
rJkoQEeFAkEA32j9ibSVryxLvWUZngKNwo2xE wcYDAYVBMsYC3OBU3FXhVkFD06
ZVnJsY/4bd2VdQI bI2KV99aHutMJG2WYwJABMn2ZjweTMVa5VZ/kAFiSJMT1Yjd
i7 kY lkB6Na6T02BWnjixI2hkwThRJrn3pwufM2201Lqn7gEDRHA3T1eQJBAKZG
1RUNo6558HEo8vUIf4vCu33RaJkqkqDYmFmJHeISrQfGMfNiUrkmJ5iRR9w1ZExu
/Bj9C281XDTQ Z3PNnMCQQCan pvj0OZH6o0PAMJGBBwRECPpfZ6mUjwA2YD3g61
MHjtIYmKKGmn64Qs8zQ4mNEDboQqyaov3Ij/I6c0ZQlc
-----END RSA PRIVATE KEY-----
Команда подписи :
key = RSA.import_key(open('private_key.pem').read())
signature = PKCS1_PSS.new(key).sign(h)
print(binascii.hexlify(signature))
Результат :
b'67bcc8c0cd625a58272dc8808602beb630c0dc47622da153c6b3f7fcfdddd5e082beb9e73ed0e66f9751e68106b42ff71f8d291045ca7e9a5a265e885e19c016b6095e5f895801d3f735393e8cd3e4a18382a914487b46cf6c3ca3346c0b6f4bac923e491ca9933e12f826914b90955ce24d0203824dbb2c9cb7cb617af7cdef'
Когда я пытаюсь вычислить подпись самостоятельно, используя метод шифрования RSA (x = (m^d)%n), я получаю другое значение :
n = key.n
d = key.d
x = 0x5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953 # hash
calculated_signature = pow(x,d,n)
print (hex(calculated_signature))
Я понимаю это :
'0x4e3484dde9ca8987b77a52c696b6848e5980c858f635a62e10fe24d45bea52bac4873378b9612f47398cb73102243b73cfa2da87b487ec0d26f949e09e4edb299bd4acc4aa0eb43afa47b814b3430ff9b01b8e41bcf53ba310ae26c191cb516c07f3ebe272bcbb95acb9e7bbdc22f0c17997ba6c1884c177ba41d4e384184275'
Мне интересно, почему я получаю такую разницу? Мое понимание sign
ранее использованного метода заключается в том, что он шифрует входные данные (хэш) с помощью операции (x^d)%n.
Я что-то упускаю ? Может ли кто-нибудь подсказать мне причину этой разницы ? Связано ли это с какими-то плохими манипуляциями/пониманием с моей стороны ?
Комментарии:
1. datatracker.ietf.org/doc/html/rfc8017 действительно есть все подробности.
2. Спасибо @PresidentJamesK. Спасибо за обмен, но я не смог найти ответа, так как в разделе 5.2.1 объясняется метод подписи путем вычисления m^d mod n, который я использую сам
3. Это очень выборочное чтение, которое вы делаете, попробуйте 8.1.1 . Обратите внимание, что PSS рандомизирован, поэтому вы получите разные значения, даже если бы реализовали PSS самостоятельно.