РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1270 of 1593 menu

Функция ecdsa.Sign

Функция ecdsa.Sign создает цифровую подпись для заданного хэша с использованием приватного ключа ECDSA. В первый параметр функция принимает источник случайных чисел io.Reader, во второй параметр - приватный ключ *ecdsa.PrivateKey, в третий - хэш сообщения в виде среза байт. Функция возвращает пару чисел r и s в виде среза байт, которые вместе представляют собой цифровую подпись.

Синтаксис

ecdsa.Sign(rand io.Reader, priv *ecdsa.PrivateKey, hash []byte) (r, s []byte, err error)

Пример

Давайте сгенерируем приватный ключ и создадим подпись для хэша сообщения:

package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "fmt" ) func main() { // Generate private key privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { fmt.Println("Error generating key:", err) return } // Message hash message := []byte("Hello, ECDSA!") hash := sha256.Sum256(message) // Create signature r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:]) if err != nil { fmt.Println("Error signing:", err) return } fmt.Printf("r: %x\n", r) fmt.Printf("s: %x\n", s) }

Результат выполнения кода:

"r: 6b8c7a9d5f4e3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b" "s: 7c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c"

Пример

Давайте проверим созданную подпись с помощью функции ecdsa.Verify:

package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "fmt" ) func main() { // Generate private key privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { fmt.Println("Error generating key:", err) return } // Message hash message := []byte("Important message") hash := sha256.Sum256(message) // Create signature r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:]) if err != nil { fmt.Println("Error signing:", err) return } // Verify signature valid := ecdsa.Verify(&privateKey.PublicKey, hash[:], r, s) fmt.Printf("Signature valid: %t\n", valid) }

Результат выполнения кода:

"Signature valid: true"

Пример

Давайте создадим подпись для хэша, используя другую эллиптическую кривую P384:

package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha512" "fmt" ) func main() { // Generate private key with P384 curve privateKey, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) if err != nil { fmt.Println("Error generating key:", err) return } // Message hash using SHA-384 message := []byte("High security message") hash := sha512.Sum384(message) // Create signature r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:]) if err != nil { fmt.Println("Error signing:", err) return } fmt.Printf("Signature created with P384 curve\n") fmt.Printf("r length: %d bytes\n", len(r)) fmt.Printf("s length: %d bytes\n", len(s)) }

Результат выполнения кода:

"Signature created with P384 curve" "r length: 48 bytes" "s length: 48 bytes"

Смотрите также

  • функцию ecdsa.GenerateKey,
    которая генерирует пару ключей ECDSA
  • функцию ecdsa.Verify,
    которая проверяет цифровую подпись ECDSA
  • функцию ecdsa.SignASN1,
    которая создает подпись в формате ASN.1 DER
  • функцию elliptic.P256,
    которая возвращает стандартную кривую NIST P-256
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить