1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 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("атака на метод диффи-хеллмана провалена: ключ найти не удалось")
- }
|