Este grupo de redactores ha estado mucho tiempo investigando soluciones a tus interrogantes, te compartimos la resolución así que deseamos resultarte de gran ayuda.
import "crypto/ecdsa"
- Visión general
- Índice
- Ejemplos de
Visión general
El paquete ecdsa implementa el algoritmo de firma digital de curva elíptica, como se define en FIPS 186-3.
Esta implementación deriva el nonce de un AES-CTR CSPRNG codificado por:
SHA2-512 (priv.D || entropía || hash)[:32]
El CSPRNG key es indiferenciable de un oráculo aleatorio como se muestra en [Coron], el flujo AES-CTR es indiferenciable de un oráculo aleatorio bajo supuestos criptográficos estándar (ver [Larsson] por ejemplo).
Referencias:
[Coron] https://cs.nyu.edu/~dodis/ps/merkle.pdf [Larsson] https://www.nada.kth.se/kurser/kth/2D1441/semteo03/lecturenotes/assump.pdf
Ejemplo
package main import("crypto/ecdsa""crypto/elliptic""crypto/rand""crypto/sha256""fmt")funcmain() privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)if err !=nilpanic(err) msg :="hello, world" hash := sha256.Sum256([]byte(msg)) sig, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])if err !=nilpanic(err) fmt.Printf("signature: %xn", sig) valid := ecdsa.VerifyASN1(&privateKey.PublicKey, hash[:], sig) fmt.Println("signature verified:", valid)
Índice
- func Sign (rand io.Reader, priv * PrivateKey, hash []byte) (r, s * big.Int, err error)
- func SignASN1 (rand io.Reader, priv * PrivateKey, hash []byte) ([]byte, error)
- func Verify (pub * PublicKey, hash []byte, r, s * grande. bool
- func VerifyASN1 (pub * PublicKey, hash, sig []byte) bool
- tipo PrivateKey
- func GenerateKey (c elliptic.Curve, rand io.Reader) (* PrivateKey, error)
- func (priv * PrivateKey) Igual (x crypto.PrivateKey) bool
- func (priv * PrivateKey) Public () crypto.PublicKey
- func (priv * PrivateKey) Signo (rand io.Reader, digest []byte, opta por crypto.SignerOpts) ([]byte, error)
- tipo PublicKey
- func (pub * PublicKey) Igual (x crypto.PublicKey) bool
Ejemplos de
- Paquete
Archivos de paquete
func signoFuente
funcSign(rand io.Reader, priv *PrivateKey, hash []byte)(r, s *big.Int, err error)
Sign firma un hash (que debería ser el resultado de aplicar un hash a un mensaje más grande) usando el key, priv. Si el hash es más largo que la longitud de bits del privado keyEn el orden de la curva, el hash se truncará a esa longitud. Devuelve la firma como un par de números enteros. La seguridad de lo privado key depende de la entropía de rand.
func SignASN1Fuente1,15
funcSignASN1(rand io.Reader, priv *PrivateKey, hash []byte)([]byte,error)
SignASN1 firma un hash (que debería ser el resultado de aplicar un hash a un mensaje más grande) usando el key, priv. Si el hash es más largo que la longitud de bits del privado keyEn el orden de la curva, el hash se truncará a esa longitud. Devuelve la firma codificada ASN.1. La seguridad de lo privado key depende de la entropía de rand.
func VerificarFuente
funcVerify(pub *PublicKey, hash []byte, r, s *big.Int)bool
Verify verifica la firma en r, s de hash usando el público key, pub. Su valor de retorno registra si la firma es válida.
func VerifyASN1Fuente1,15
funcVerifyASN1(pub *PublicKey, hash, sig []byte)bool
VerifyASN1 verifica la firma codificada de ASN.1, sig, de hash utilizando el público key, pub. Su valor de retorno registra si la firma es válida.
tipo PrivateKeyFuente
PrivateKey representa un ECDSA privado key.
type PrivateKey struct PublicKey D *big.Int
func GenerateKeyFuente
funcGenerateKey(c elliptic.Curve, rand io.Reader)(*PrivateKey,error)
GenerateKey genera un público y un privado key par.
func (* PrivateKey) IgualFuente1,15
func(priv *PrivateKey)Equal(x crypto.PrivateKey)bool
Igual informa si priv y x tienen el mismo valor.
Consulte PublicKey.Equal para obtener detalles sobre cómo se compara Curve.
func (* PrivateKey) PúblicoFuente1.4
func(priv *PrivateKey)Public() crypto.PublicKey
Público devuelve el público key correspondiente a priv.
Func (* PrivateKey) FirmarFuente1.4
func(priv *PrivateKey)Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts)([]byte,error)
Los signos de los signos se digieren con priv, leyendo aleatoriedad de rand. El argumento opts no se usa actualmente pero, de acuerdo con la interfaz crypto.Signer, debería ser la función hash utilizada para digerir el mensaje.
Este método implementa crypto.Signer, que es una interfaz para admitir keys donde la parte privada se guarda, por ejemplo, en un módulo de hardware. Los usos comunes deben usar la función Firmar en este paquete directamente.
tipo PublicKeyFuente
PublicKey representa un público ECDSA key.
type PublicKey struct elliptic.Curve X, Y *big.Int
func (* PublicKey) IgualFuente1,15
func(pub *PublicKey)Equal(x crypto.PublicKey)bool
Igual informa si pub y x tienen el mismo valor.
Dos keys solo se considera que tienen el mismo valor si tienen el mismo valor de Curva. Tenga en cuenta que, por ejemplo, elliptic.P256 () y elliptic.P256 (). Params () son valores diferentes, ya que este último es una implementación de tiempo genérico no constante.
Si te ha resultado de provecho este artículo, te agradeceríamos que lo compartas con el resto desarrolladores de esta manera contrubuyes a difundir nuestra información.