hypercurve

package module
v0.0.0-...-bd6befe Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 21, 2025 License: ISC Imports: 8 Imported by: 0

README

Hyper

Hyperelliptic Curve (Under construction)

Especificação da Curva Pseudo-Hiperelíptica

Estrutura baseada em divisores sobre uma curva algébrica abstrata. Este sistema não implementa uma curva hiperelíptica tradicional, mas sim um grupo abstrato de divisores que emula suas propriedades.

Corpo finito:

  • $\mathbb{F}_p$ com $p = \mathtt{0xFBB88A...39211F}$ (primo 768-bit)

Divisor base:

  • $u(x) = x^2 + U_1 x + U_0$ (U = [U₀, U₁])
  • $v(x) = V_1 x + V_0$ (V = [V₀, V₁])

Relação fundamental:

  • $v(x)^2 \equiv \Phi(x) \mod u(x)$, onde $\Phi(x)$ é um polinômio implícito de grau 5, nunca computado (os divisores base já foram pré-selecionados para satisfazer $v^2 \equiv \Phi \mod u$).

Forma expandida:

  • $(V_1x + V_0)^2 \equiv \Phi(x) \mod (x^2 + U_1x + U_0)$

Equação característica:

  • $V_1^2x^2 + 2V_1V_0x + V_0^2 = \Phi(x) - Q(x)(x^2 + U_1x + U_0)$ (para algum polinômio quociente $Q(x)$ de grau 3).

O sistema implementa divisores da forma:

  • $D = (u(x), v(x)) \in \text{Jac}(C)$

E aplica operações com base no fato de que essas tuplas satisfazem a condição fundamental:

  • $v(x)^2 \equiv \Phi(x) \mod u(x)$

Operações:

  1. Adição: $D_1 \oplus D_2 = \langle u_{\text{novo}}, v_{\text{novo}} \rangle$, onde $\oplus$ simboliza adição em grupos abelianos
  2. Multiplicação escalar: $[k]D = \text{Double-and-Add}$
  3. Assinatura: $s = k + H(R|M) \cdot d \mod p$

Segurança:

  • Clássica: $\mathcal{O}(p^{4/5})$
  • Quântica: Teoricamente Imune a Shor (gênero 2)
TODO
  • Aritmética de Polinômios e Redução de Divisores
  • Algoritmo de Mumford Simplificado
  • Schnorr-based Signatures
  • ElGamal-based Encryption
  • Diffie-Hellman Function
  • ANS.1 and PKCS#8 Support
Examples
package main

import (
	"fmt"

	hypercurve "github.com/pedroalbanese/hyper"
)

func main() {
	// Inicializa a curva
	curve := hypercurve.NewCurve()

	// Gera par de chaves (privada e pública)
	priv, pub, err := curve.GenerateKeyPair()
	if err != nil {
		panic(err)
	}

	// Mensagem a ser criptografada e assinada
	message := []byte("Mensagem Secreta!")

	// --- Criptografia assimétrica ---
	cipher, err := curve.Encrypt(pub, message)
	if err != nil {
		panic(err)
	}

	// Decifra a mensagem
	plain, err := curve.Decrypt(priv, cipher)
	if err != nil {
		panic(err)
	}

	fmt.Println("Mensagem original:  ", string(message))
	fmt.Println("Mensagem decifrada: ", string(plain))

	// --- Assinatura digital ---
	sig, err := curve.SignMessage(priv, message)
	if err != nil {
		panic(err)
	}

	ok, err := curve.VerifySignature(pub, message, sig)
	if err != nil {
		panic(err)
	}

	fmt.Println("Assinatura válida?", ok)
}
Diffie-Hellman Function
package main

import (
	"crypto/subtle"
	"fmt"

	hypercurve "github.com/pedroalbanese/hyper"
)

func main() {
	// Inicializa a curva
	curve := hypercurve.NewCurve()

	// Gera par de chaves (privada e pública) para Alice
	privA, pubA, err := curve.GenerateKeyPair()
	if err != nil {
		panic(err)
	}

	// Gera par de chaves para Bob
	privB, pubB, err := curve.GenerateKeyPair()
	if err != nil {
		panic(err)
	}

	// --- Diffie-Hellman com curva hiperelíptica ---
	keyA, err := curve.DiffieHellman(privA, pubB)
	if err != nil {
		panic(err)
	}

	keyB, err := curve.DiffieHellman(privB, pubA)
	if err != nil {
		panic(err)
	}

	if subtle.ConstantTimeCompare(keyA, keyB) == 1 {
		fmt.Printf("✅ Chave compartilhada derivada com sucesso: %x\n", keyA)
	} else {
		fmt.Println("❌ Falha na troca de chaves.")
	}
}

License

This project is licensed under the ISC License.

Todos os direitos de propriedade intelectual sobre este software pertencem ao autor, Pedro F. Albanese. Vide Lei 9.610/98, Art. 7º, inciso XII.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func MarshalDivisor

func MarshalDivisor(d Divisor) ([]byte, error)

MarshalDivisor serializa um divisor

func MarshalPrivateKey

func MarshalPrivateKey(curve *HyperellipticCurve, privateKey *big.Int, publicKey Divisor) ([]byte, error)

MarshalPrivateKey converte chave privada para PKCS#8

func MarshalPublicKey

func MarshalPublicKey(curve *HyperellipticCurve, publicKey Divisor) ([]byte, error)

MarshalPublicKey converte chave pública para PKIX

Types

type CipherTextASN

type CipherTextASN struct {
	C1U0, C1U1 []byte // Coordenadas U do divisor C1
	C1V0, C1V1 []byte // Coordenadas V do divisor C1
	C2         []byte // Hash
	C3         []byte // Ciphertext
}

Estrutura ASN.1 para o criptograma

type Divisor

type Divisor struct {
	U [2]*big.Int // Polinômio u(x) = x² + U[1]x + U[0]
	V [2]*big.Int // Polinômio v(x) = V[1]x + V[0]
}

Divisor representa um par ordenado de polinômios (u(x), v(x)) conforme a forma de Mumford. u(x) é um polinômio monico de grau 2: u(x) = x² + U[1]x + U[0] v(x) é um polinômio de grau < grau(u), com coeficientes derivados da chave ou do protocolo: v(x) = V[1]x + V[0]

func ParsePrivateKey

func ParsePrivateKey(curve *HyperellipticCurve, der []byte) (*big.Int, Divisor, error)

ParsePrivateKey extrai chave privada de PKCS#8

func ParsePublicKey

func ParsePublicKey(curve *HyperellipticCurve, der []byte) (Divisor, error)

ParsePublicKey extrai chave pública de PKIX

func UnmarshalDivisor

func UnmarshalDivisor(data []byte) (Divisor, error)

UnmarshalDivisor desserializa um divisor

type HyperellipticCurve

type HyperellipticCurve struct {
	// contains filtered or unexported fields
}

HyperellipticCurve define os parâmetros da curva

func NewCurve

func NewCurve() *HyperellipticCurve

NewCurve inicializa a curva com um divisor base válido

func (*HyperellipticCurve) AddDivisors

func (c *HyperellipticCurve) AddDivisors(D1, D2 Divisor) Divisor

Atualize sua função AddDivisors para usar a redução

func (*HyperellipticCurve) Decrypt

func (c *HyperellipticCurve) Decrypt(privateKey *big.Int, ciphertextASN []byte) ([]byte, error)

Decrypt decifra uma mensagem usando a chave privada

func (*HyperellipticCurve) DiffieHellman

func (c *HyperellipticCurve) DiffieHellman(privKey *big.Int, pubKey Divisor) ([]byte, error)

DiffieHellman realiza troca de chaves DH com curva hiperelíptica

func (*HyperellipticCurve) Encrypt

func (c *HyperellipticCurve) Encrypt(pubKey Divisor, message []byte) ([]byte, error)

Encrypt cifra uma mensagem usando a chave pública

func (*HyperellipticCurve) GenerateKeyPair

func (c *HyperellipticCurve) GenerateKeyPair() (*big.Int, Divisor, error)

GenerateKeyPair gera pares de chaves únicos

func (*HyperellipticCurve) ReduceDivisor

func (c *HyperellipticCurve) ReduceDivisor(D Divisor) Divisor

ReduceDivisor reduz um divisor para a forma normalizada

func (*HyperellipticCurve) ScalarMult

func (c *HyperellipticCurve) ScalarMult(k *big.Int, D Divisor) Divisor

ScalarMult multiplica um divisor por um escalar

func (*HyperellipticCurve) SignMessage

func (c *HyperellipticCurve) SignMessage(privateKey *big.Int, message []byte) ([]byte, error)

SignMessage assina uma mensagem com a chave privada

func (*HyperellipticCurve) VerifySignature

func (c *HyperellipticCurve) VerifySignature(pubKey Divisor, message []byte, sigBytes []byte) (bool, error)

VerifySignature verifica a assinatura usando a chave pública

type SignatureASN

type SignatureASN struct {
	RU0, RU1 []byte // R divisor - parte U
	RV0, RV1 []byte // R divisor - parte V
	S        []byte // Escalar s
}

SignatureASN define a estrutura ASN.1 da assinatura digital

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL