По замыслу цифровая криптографическая подпись должна удовлетворять только следующему условию
Должен быть проверен соответствующим открытым ключом.
Если вы посмотрите на алгоритм генерации подписи Шаг 3, он говорит: Select a cryptographically secure random integer k from [1,n-1].
, где n
- это порядок кривой (вы можете пока игнорировать этот факт).
Затем вычислите (x1, y1) = k * G
, где G
- точка генератора эллиптической кривой. Тогда r = x1 mod n
. Этот г является частью подписи. Таким образом, при изменении k
, r
также изменится, следовательно, сигнатура изменится.
Таким образом, для каждого генерирования подписи алгоритм выбирает другой параметр и затем использует его для вычисления подписи.
например:
>>> from ecc import curves
>>> curve = curves.P256()
>>> pkey = 0x00c3f7c39a9be2418cd89a732e40d648b09fa0af9e909a4fb6864910144b5cbcdf
>>> s1 = c.sign(b'Hello', pkey)
(37527198291707833181859423619289327687028014812888685671525882103189540525356,7717531609084222009133798505588038563850333231389727023073200992747312618427)
>>> s2 = c.sign(b'Hello', pkey)
(55880701658034823360120047989457771316451459626784083177171213563603884569397,88917360761747520665103257272757357544674490240888454865713640275762122369837)
>>> s1 == s2
False
Каждый раз, когда подпись отличается.
ref: