Проверка всегда будет детерминированным алгоритмом.
Метод generateKeys должен быть рандомизированным, потому что он должен генерировать разные ключи для разных людей.
И подписи также должны отличаться для разных сообщений.
Подписи должны удовлетворять следующим двум требованиям.
Прежде всего, действительные подписи должны пройти проверку.
Если подпись действительна, т. е. если я подпишу сообщение с моим секретным ключом, и, если кто-то затем позже попытается проверить ее, используя мой открытый ключ и то же самое сообщение, подпись будет корректно проверяться.
Второе требование, это то, что невозможно подделать подписи.
То есть, злоумышленник, который знает ваш открытый ключ, ключ проверки, и может видеть подписи на некоторых других сообщениях, не сможет подделать вашу подпись на каком-либо другом сообщении.
На практике существует ограничение на размер сообщения, который вы можете подписать, поскольку реальные схемы работают с битовыми строками ограниченной длины.
Поэтому используется хэш сообщения, а не сам текст сообщения.
Таким образом, сообщение может быть действительно большим, но хэш будет только 256 бит.
И поскольку функции хэша не имеют коллизий, хэш сообщения безопасно использовать в качестве входного сигнала для схемы цифровой подписи, а не само сообщение.
И, кстати, забавный трюк, который мы будем использовать позже, заключается в том, что вы можете подписать хэш-указатель.
И если вы подписываете хэш-указатель, то подпись покрывает или защищает всю структуру, а не только сам указатель хеширования, но и все, на что он указывает.
Например, если вы подписываете хеш-указатель, который был в конце цепочки блоков, результатом будет то, что вы эффективно подписываете весь контент этой цепочки блоков.
Это пример цифровой подписи с использованием алгоритма RSA.
Биткойн использует определенную схему цифровой подписи, которая называется ECDSA.
Это алгоритм эллиптической кривой Elliptic Curve Digital Signature Algorithm.
И это стандарт правительства США.
Мы не будем вдаваться во все детали того, как работает ECDSA.
Он полагается на сложную математику.
И поверьте мне, вы не хотите видеть все детали того, как это работает. Поэтому мы это пропустим.
Одна вещь, которую я хочу заметить, это то, что для ECDSA важна хорошая рандомизация. Хорошая случайность особенно важна для ECDSA.