key_public.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package elgamal
  2. import (
  3. "context"
  4. "errors"
  5. "math/big"
  6. "git.ali33.ru/fcg-xvii/curve/v2"
  7. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  8. "git.ali33.ru/fcg-xvii/go-tools/json"
  9. )
  10. type KeyPublic struct {
  11. curve *Curve
  12. e1 *tools.Point
  13. e2 *tools.Point
  14. }
  15. func (s *KeyPublic) Map() json.Map {
  16. return json.Map{
  17. "e1": s.e1,
  18. "e2": s.e2,
  19. }
  20. }
  21. func (s *KeyPublic) MarshalJSON() ([]byte, error) {
  22. return s.Map().JSON(), nil
  23. }
  24. func (s *KeyPublic) Attack(ctx context.Context) (curve.KeyPair, error) {
  25. return s.attack(ctx)
  26. }
  27. /*
  28. func (s *Curve) ELKeyPair() (*ELKeyPair, error) {
  29. e1, _, err := s.searhClosePoints(Random(big.NewInt(1), Sub64(s.p, 1)))
  30. if err != nil {
  31. return nil, err
  32. }
  33. d := Random(big.NewInt(1), Sub64(s.n, 1))
  34. e2, err := e1.Mul(d)
  35. if err != nil {
  36. return nil, err
  37. }
  38. res := &ELKeyPair{
  39. curve: s,
  40. priv: &ELKeyPriv{
  41. d: d,
  42. },
  43. pub: &ELKeyPub{
  44. e1: e1,
  45. e2: e2,
  46. },
  47. }
  48. return res, res.setupDataTable()
  49. }
  50. */
  51. func (s *KeyPublic) attack(ctx context.Context) (*KeyPair, error) {
  52. c := s.curve
  53. tmp := big.NewInt(1)
  54. for {
  55. if tmp.Cmp(tools.Add64(c.P(), -1)) == 0 {
  56. break
  57. }
  58. //log.Println(tmp)
  59. //e2, _ := s.e1.Mul(tmp)
  60. //log.Println(e2, s.e2)
  61. if e2, err := s.e1.Mul(tmp); err == nil && s.e2.IsEqual(e2) {
  62. pair := &KeyPair{
  63. curve: s.curve,
  64. priv: &KeyPrivate{
  65. d: tmp,
  66. },
  67. pub: &KeyPublic{
  68. e1: s.e1.Copy(),
  69. e2: s.e2.Copy(),
  70. },
  71. }
  72. return pair, nil
  73. }
  74. select {
  75. case <-ctx.Done():
  76. return nil, errors.New("атака на метод диффи-хеллмана провалена: время вышло")
  77. default:
  78. tmp = tools.Add64(tmp, 1)
  79. }
  80. }
  81. return nil, errors.New("атака на метод диффи-хеллмана провалена: ключ найти не удалось")
  82. }