Найти - Пользователи
Полная версия: RSA Sign/Verify
Начало » Python для экспертов » RSA Sign/Verify
1
wiz
Никак не могу подобрать правильный способ проверки подписей с использованием ключей и RSA в M2Crypto.

Имеется: мои priv & pub ключи и pub клиента.

Подпись формируется правильно
private_key = RSA.load_key('./my_rsa.priv')
private_key.sign(sha(data).digest())
и успешно съедается на другой стороне.

Но когда моя очередь проверять - RSAError: bad signature.

their_public = RSA.load_pub_key('./their_rsa.pub')
their_public.verify(data, sig)
При этом сам openssl подтверждает правильность:
openssl dgst -sha1 -verify their_rsa.pub -signature /tmp/sig /tmp/data
upd:
При чём bad signature выскакивает даже при проверке своей же подписи.

mysig = priv.sign(sha(data).digest())
pub.verify(data, mysig)
-> M2Crypto.RSA.RSAError: bad signature

При проверке вручную - через расшифровку подписи, обнаружил, что в расшифрованом хэше оказалось “лишних” 15 байт перед, собственно, хэшом, который совпадает с правильным.

Кому писать? Кого пинать?
Ferroman
Стандартная практика, - сделано для того, что бы противостоять “blinding”-атакам.
Просто заберите “лишние” байты в расшифрованном хеше.
wiz
Тоесть метод verify у ключа m2crypto фактически нерабочий и надо делать свой?
Ferroman
А разве не так должно быть?
private_key = RSA.load_key('./my_rsa.priv')
private_key.sign(data)?
Просто я метод посмотрел, а он там:
def sign(self, digest, algo='sha1'):
        """
        Signs a digest with the private key
        @type digest: str
        @param digest: A digest created by using the digest method
        @type algo: str
        @param algo: The method that created the digest.
        Legal values are 'sha1','sha224', 'sha256', 'ripemd160', 
        and 'md5'.
        
        @return: a string which is the signature
        """
        digest_type = getattr(m2, 'NID_' + algo, None) 
        if digest_type is None:
            raise ValueError, ('unknown algorithm', algo)
Правда я не пробовал, сегодня попробую, скажу.
wiz
Неа. Подписывать надо хэш. Я тоже сначала данные пытался подписать. Тип хэша там указывается чтобы при верификации проверять, что хэшировалось именно этим алгоритмом. Он рычит, если сигн был на мд5, а для проверки ша1.

Подпись работает правильно.
llolla
Ferroman
Просто заберите “лишние” байты в расшифрованном хеше.
каким образом можно это сделать?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB