Пакет ecdsa
Обзор
Пакет ecdsa реализует алгоритм цифровой подписи на эллиптических кривых, определённый в FIPS 186-5.
Подписи, создаваемые этим пакетом, не являются детерминированными, однако энтропия смешивается с закрытым ключом и сообщением, что обеспечивает тот же уровень безопасности в случае сбоя источника случайных данных.
Операции с закрытыми ключами реализованы с использованием алгоритмов с постоянным временем выполнения при условии, что используется elliptic.Curve, возвращаемый функциями elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521.
Пример
Код:
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
panic(err)
}
msg := "hello, world"
hash := sha256.Sum256([]byte(msg))
sig, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])
if err != nil {
panic(err)
}
fmt.Printf("signature: %x\n", sig)
valid := ecdsa.VerifyASN1(&privateKey.PublicKey, hash[:], sig)
fmt.Println("signature verified:", valid)
Указатель
Примеры
Файлы пакета
ecdsa.go ecdsa_legacy.go notboring.go
func Sign
func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
Sign подписывает хеш (который должен быть результатом хеширования более крупного сообщения) с помощью закрытого ключа priv. Если длина хеша превышает длину в битах порядка кривой закрытого ключа, хеш будет усечён до этой длины. Функция возвращает подпись в виде пары целых чисел. Большинству приложений следует использовать SignASN1, а не работать напрямую с r и s.
Подпись генерируется с использованием случайных данных. Начиная с Go 1.26 всегда используется безопасный источник случайных байтов, а Reader игнорируется, если не задано GODEBUG=cryptocustomrand=1. Этот параметр будет удалён в одной из будущих версий Go. Вместо него используйте testing/cryptotest.SetGlobalRandom.
func SignASN1 1.15
func SignASN1(r io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)
SignASN1 подписывает хеш (который должен быть результатом хеширования более крупного сообщения) с помощью закрытого ключа priv. Если длина хеша превышает длину в битах порядка кривой закрытого ключа, хеш будет усечён до этой длины. Функция возвращает подпись в кодировке ASN.1.
Подпись генерируется с использованием случайных данных. Начиная с Go 1.26 всегда используется безопасный источник случайных байтов, а Reader игнорируется, если не задано GODEBUG=cryptocustomrand=1. Этот параметр будет удалён в одной из будущих версий Go. Вместо него используйте testing/cryptotest.SetGlobalRandom.
func Verify
func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool
Verify проверяет подпись r, s для хеша с помощью открытого ключа pub. Возвращаемое значение указывает, действительна ли подпись. Большинству приложений следует использовать VerifyASN1, а не работать напрямую с r и s.
Входные данные не считаются конфиденциальными и могут утечь через побочные каналы по времени или в случае, если злоумышленник контролирует часть входных данных.
func VerifyASN1 1.15
func VerifyASN1(pub *PublicKey, hash, sig []byte) bool
VerifyASN1 проверяет подпись sig в кодировке ASN.1 для хеша с помощью открытого ключа pub. Возвращаемое значение указывает, действительна ли подпись.
Входные данные не считаются конфиденциальными и могут утечь через побочные каналы по времени или в случае, если злоумышленник контролирует часть входных данных.
type PrivateKey
PrivateKey представляет закрытый ключ ECDSA.
type PrivateKey struct {
PublicKey
// D is the private scalar value.
//
// Deprecated: modifying the raw value can produce invalid keys, and may
// invalidate internal optimizations; moreover, [big.Int] methods are not
// suitable for operating on cryptographic values. To encode and decode
// PrivateKey values, use [PrivateKey.Bytes] and [ParseRawPrivateKey] or
// [crypto/x509.MarshalPKCS8PrivateKey] and [crypto/x509.ParsePKCS8PrivateKey].
// For ECDH, use [crypto/ecdh].
D *big.Int
}
func GenerateKey
func GenerateKey(c elliptic.Curve, r io.Reader) (*PrivateKey, error)
GenerateKey создаёт новый закрытый ключ ECDSA для указанной кривой.
Начиная с Go 1.26 всегда используется безопасный источник случайных байтов, а Reader игнорируется, если не задано GODEBUG=cryptocustomrand=1. Этот параметр будет удалён в одной из будущих версий Go. Вместо него используйте testing/cryptotest.SetGlobalRandom.
func ParseRawPrivateKey 1.25
func ParseRawPrivateKey(curve elliptic.Curve, data []byte) (*PrivateKey, error)
ParseRawPrivateKey разбирает закрытый ключ, закодированный в виде целого числа фиксированной длины в порядке байтов от старшего к младшему, в соответствии с SEC 1, Version 2.0, Section 2.3.6 (иногда называемым необработанным форматом). Функция возвращает ошибку, если значение не приведено по модулю порядка кривой или равно нулю.
curve должна быть одной из elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521, иначе ParseRawPrivateKey возвращает ошибку.
ParseRawPrivateKey принимает тот же формат, что и ecdh.Curve.NewPrivateKey для кривых NIST, но возвращает PrivateKey, а не ecdh.PrivateKey.
Обратите внимание, что закрытые ключи чаще кодируются в формате ASN.1 или PKCS#8, которые можно разобрать с помощью crypto/x509.ParseECPrivateKey или crypto/x509.ParsePKCS8PrivateKey (и encoding/pem).
func (*PrivateKey) Bytes 1.25
func (priv *PrivateKey) Bytes() ([]byte, error)
Bytes кодирует закрытый ключ в виде целого числа фиксированной длины в порядке байтов от старшего к младшему в соответствии с SEC 1, Version 2.0, Section 2.3.6 (иногда называемым необработанным форматом). Функция возвращает ошибку, если закрытый ключ недействителен.
PrivateKey.Curve должна быть одной из elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521, иначе Bytes возвращает ошибку.
Bytes возвращает тот же формат, что и ecdh.PrivateKey.Bytes для кривых NIST.
Обратите внимание, что закрытые ключи чаще кодируются в формате ASN.1 или PKCS#8, которые можно создать с помощью crypto/x509.MarshalECPrivateKey или crypto/x509.MarshalPKCS8PrivateKey (и encoding/pem).
func (*PrivateKey) ECDH 1.20
func (priv *PrivateKey) ECDH() (*ecdh.PrivateKey, error)
ECDH возвращает k в виде ecdh.PrivateKey. Он возвращает ошибку, если ключ недействителен согласно определению ecdh.Curve.NewPrivateKey или если Curve не поддерживается пакетом crypto/ecdh.
func (*PrivateKey) Equal 1.15
func (priv *PrivateKey) Equal(x crypto.PrivateKey) bool
Equal сообщает, имеют ли priv и x одинаковое значение.
Подробные сведения о сравнении Curve см. в разделе PublicKey.Equal.
func (*PrivateKey) Public 1.4
func (priv *PrivateKey) Public() crypto.PublicKey
Public возвращает открытый ключ, соответствующий priv.
func (*PrivateKey) Sign 1.4
func (priv *PrivateKey) Sign(random io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
Sign подписывает хеш (который должен быть результатом хеширования более длинного сообщения с помощью opts.HashFunc()), используя закрытый ключ priv. Если длина хеша превышает разрядность порядка кривой закрытого ключа, хеш будет усечён до этой длины. Функция возвращает подпись в кодировке ASN.1, как и SignASN1.
Если random не равен nil, подпись рандомизируется. В большинстве приложений в качестве random следует использовать crypto/rand.Reader, однако, если не установлено GODEBUG=cryptocustomrand=1, всегда используется безопасный источник случайных байтов, а фактический Reader игнорируется. Настройка GODEBUG будет удалена в одном из будущих выпусков Go. Вместо неё используйте testing/cryptotest.SetGlobalRandom.
Если random равен nil, Sign создаёт детерминированную подпись согласно RFC 6979. При создании детерминированной подписи opts.HashFunc() должна быть функцией, использованной для получения digest, а priv.Curve должна быть одной из следующих: elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521.
type PublicKey
PublicKey представляет открытый ключ ECDSA.
type PublicKey struct {
elliptic.Curve
// X, Y are the coordinates of the public key point.
//
// Deprecated: modifying the raw coordinates can produce invalid keys, and may
// invalidate internal optimizations; moreover, [big.Int] methods are not
// suitable for operating on cryptographic values. To encode and decode
// PublicKey values, use [PublicKey.Bytes] and [ParseUncompressedPublicKey]
// or [crypto/x509.MarshalPKIXPublicKey] and [crypto/x509.ParsePKIXPublicKey].
// For ECDH, use [crypto/ecdh]. For lower-level elliptic curve operations,
// use a third-party module like filippo.io/nistec.
X, Y *big.Int
}
func ParseUncompressedPublicKey 1.25
func ParseUncompressedPublicKey(curve elliptic.Curve, data []byte) (*PublicKey, error)
ParseUncompressedPublicKey разбирает открытый ключ, закодированный в виде несжатой точки согласно SEC 1, Version 2.0, Section 2.3.3 (также известному как несжатый формат X9.62). Функция возвращает ошибку, если точка представлена не в несжатой форме, не принадлежит кривой или является бесконечно удалённой точкой.
curve должна быть одной из следующих: elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521; в противном случае ParseUncompressedPublicKey возвращает ошибку.
ParseUncompressedPublicKey принимает тот же формат, что и ecdh.Curve.NewPublicKey для кривых NIST, но возвращает PublicKey, а не ecdh.PublicKey.
Обратите внимание, что открытые ключи чаще кодируются в формате DER (или PEM); для их разбора можно использовать crypto/x509.ParsePKIXPublicKey (и encoding/pem).
func (*PublicKey) Bytes 1.25
func (pub *PublicKey) Bytes() ([]byte, error)
Bytes кодирует открытый ключ в виде несжатой точки согласно SEC 1, Version 2.0, Section 2.3.3 (также известному как несжатый формат X9.62). Функция возвращает ошибку, если открытый ключ недействителен.
PublicKey.Curve должна быть одной из следующих: elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521; в противном случае Bytes возвращает ошибку.
Bytes возвращает данные в том же формате, что и ecdh.PublicKey.Bytes для кривых NIST.
Обратите внимание, что открытые ключи чаще кодируются в формате DER (или PEM); создать их в этом формате можно с помощью crypto/x509.MarshalPKIXPublicKey (и encoding/pem).
func (*PublicKey) ECDH 1.20
func (pub *PublicKey) ECDH() (*ecdh.PublicKey, error)
ECDH возвращает k в виде ecdh.PublicKey. Он возвращает ошибку, если ключ недействителен согласно определению ecdh.Curve.NewPublicKey или если Curve не поддерживается crypto/ecdh.
func (*PublicKey) Equal 1.15
func (pub *PublicKey) Equal(x crypto.PublicKey) bool
Equal сообщает, имеют ли pub и x одинаковое значение.
Два ключа считаются имеющими одинаковое значение, только если у них одинаковое значение Curve. Обратите внимание, что, например, elliptic.P256 и elliptic.P256().Params() — разные значения, поскольку последнее представляет собой обобщённую реализацию, не гарантирующую постоянное время выполнения.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/crypto/ecdsa/