package elgamal import ( "context" "errors" "math/big" "git.ali33.ru/fcg-xvii/curve/v2" "git.ali33.ru/fcg-xvii/curve/v2/tools" "git.ali33.ru/fcg-xvii/go-tools/json" ) type KeyPublic struct { curve *Curve e1 *tools.Point e2 *tools.Point } func (s *KeyPublic) Map() json.Map { return json.Map{ "e1": s.e1, "e2": s.e2, } } func (s *KeyPublic) MarshalJSON() ([]byte, error) { return s.Map().JSON(), nil } func (s *KeyPublic) Attack(ctx context.Context) (curve.KeyPair, error) { return s.attack(ctx) } /* func (s *Curve) ELKeyPair() (*ELKeyPair, error) { e1, _, err := s.searhClosePoints(Random(big.NewInt(1), Sub64(s.p, 1))) if err != nil { return nil, err } d := Random(big.NewInt(1), Sub64(s.n, 1)) e2, err := e1.Mul(d) if err != nil { return nil, err } res := &ELKeyPair{ curve: s, priv: &ELKeyPriv{ d: d, }, pub: &ELKeyPub{ e1: e1, e2: e2, }, } return res, res.setupDataTable() } */ func (s *KeyPublic) attack(ctx context.Context) (*KeyPair, error) { c := s.curve tmp := big.NewInt(1) for { if tmp.Cmp(tools.Add64(c.P(), -1)) == 0 { break } //log.Println(tmp) //e2, _ := s.e1.Mul(tmp) //log.Println(e2, s.e2) if e2, err := s.e1.Mul(tmp); err == nil && s.e2.IsEqual(e2) { pair := &KeyPair{ curve: s.curve, priv: &KeyPrivate{ d: tmp, }, pub: &KeyPublic{ e1: s.e1.Copy(), e2: s.e2.Copy(), }, } return pair, nil } select { case <-ctx.Done(): return nil, errors.New("атака на метод диффи-хеллмана провалена: время вышло") default: tmp = tools.Add64(tmp, 1) } } return nil, errors.New("атака на метод диффи-хеллмана провалена: ключ найти не удалось") }