key_pair.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. func randomKeyPair(c *Curve, ctx context.Context) (*KeyPair, error) {
  11. e1, _, err := c.SearchClosePoints(
  12. tools.Random(big.NewInt(1), tools.Sub64(c.P(), 1)),
  13. ctx,
  14. )
  15. if err != nil {
  16. return nil, err
  17. }
  18. d := tools.Random(big.NewInt(1), tools.Sub64(c.P(), 1))
  19. e2, err := e1.Mul(d)
  20. if err != nil {
  21. return nil, err
  22. }
  23. res := &KeyPair{
  24. curve: c,
  25. priv: &KeyPrivate{
  26. d: d,
  27. },
  28. pub: &KeyPublic{
  29. curve: c,
  30. e1: e1,
  31. e2: e2,
  32. },
  33. }
  34. return res, nil
  35. }
  36. type KeyPair struct {
  37. curve *Curve
  38. priv *KeyPrivate
  39. pub *KeyPublic
  40. }
  41. func (s *KeyPair) Map() json.Map {
  42. return json.Map{
  43. "private": s.priv.Map(),
  44. "public": s.pub.Map(),
  45. }
  46. }
  47. func (s *KeyPair) MarshalJSON() ([]byte, error) {
  48. return s.Map().JSON(), nil
  49. }
  50. func (s *KeyPair) KeyPrivate() curve.KeyPrivate {
  51. return s.priv
  52. }
  53. func (s *KeyPair) KeyPublic() curve.KeyPublic {
  54. return s.pub
  55. }
  56. func (s *KeyPair) MessageEncode(data []byte, args ...any) (curve.Message, error) {
  57. if len(args) == 0 {
  58. return nil, errors.New("Не найден публичный ключ принимающей стороны")
  59. }
  60. pub, check := args[0].(*KeyPublic)
  61. if !check {
  62. return nil, errors.New("Неверный тип аргумента - публичный ключ принимающей стороны")
  63. }
  64. return s.messageEncode(data, pub)
  65. }
  66. func (s *KeyPair) MessageDecode(mes curve.Message, args ...any) ([]byte, error) {
  67. dMes, check := mes.(*Message)
  68. if !check {
  69. return nil, errors.New("Ожидается сообщение, зашифрованное методом эльгамаля")
  70. }
  71. return s.messageDecode(dMes)
  72. }
  73. // c1 = r x e1
  74. // c2 = P + r x e2
  75. func (s *KeyPair) messageEncode(data []byte, pub *KeyPublic) (mes *Message, err error) {
  76. r := tools.Random(big.NewInt(1), tools.Sub64(s.curve.P(), 1))
  77. c1, err := pub.e1.Mul(r)
  78. if err != nil {
  79. return nil, err
  80. }
  81. mes = &Message{
  82. c1: c1,
  83. cd: make([]*tools.Point, len(data)),
  84. }
  85. for i, d := range data {
  86. p := s.curve.dTable[d]
  87. c2, err := pub.e2.Mul(r)
  88. if err != nil {
  89. return nil, err
  90. }
  91. cd, err := p.Add(c2)
  92. if err != nil {
  93. return nil, err
  94. }
  95. mes.cd[i] = cd
  96. }
  97. return mes, nil
  98. }
  99. // p = c2 – (d x c1)
  100. func (s *KeyPair) messageDecode(mes *Message) ([]byte, error) {
  101. res := make([]byte, len(mes.cd))
  102. part, err := mes.c1.Mul(s.priv.d)
  103. if err != nil {
  104. return nil, err
  105. }
  106. part, _ = part.Neg()
  107. for i, c2 := range mes.cd {
  108. p, err := c2.Add(part)
  109. if err != nil {
  110. return nil, err
  111. }
  112. b, err := s.curve.bytePoint(p)
  113. if err != nil {
  114. return nil, err
  115. }
  116. res[i] = b
  117. }
  118. return res, nil
  119. }
  120. /*
  121. type ELKeyPriv struct {
  122. d *big.Int
  123. }
  124. type ELKeyPub struct {
  125. e1 *Point
  126. e2 *Point
  127. }
  128. type ELKeyPair struct {
  129. curve *Curve
  130. priv *ELKeyPriv
  131. pub *ELKeyPub
  132. dTable map[byte]*Point
  133. }
  134. type ELMessage struct {
  135. c1 *Point
  136. cd []*Point
  137. }
  138. // c1 = r x e1
  139. // c2 = P + r x e2
  140. func (s *ELKeyPair) EncodeMessage(data []byte) (mes *ELMessage, err error) {
  141. r := Random(big.NewInt(1), Sub64(s.curve.p, 1))
  142. c1, err := s.pub.e1.Mul(r)
  143. if err != nil {
  144. return nil, err
  145. }
  146. mes = &ELMessage{
  147. c1: c1,
  148. cd: make([]*Point, len(data)),
  149. }
  150. for i, d := range data {
  151. p := s.dTable[d]
  152. c2, err := s.pub.e2.Mul(r)
  153. if err != nil {
  154. return nil, err
  155. }
  156. cd, err := p.Add(c2)
  157. if err != nil {
  158. return nil, err
  159. }
  160. mes.cd[i] = cd
  161. }
  162. return mes, nil
  163. }
  164. // p = c2 – (d x c1)
  165. func (s *ELKeyPair) DecodeMessage(mes *ELMessage) ([]byte, error) {
  166. res := make([]byte, len(mes.cd))
  167. part, err := mes.c1.Mul(s.priv.d)
  168. if err != nil {
  169. return nil, err
  170. }
  171. part, _ = part.Neg()
  172. for _, c2 := range mes.cd {
  173. p, err := c2.Add(part)
  174. if err != nil {
  175. return nil, err
  176. }
  177. log.Println(p)
  178. }
  179. return res, nil
  180. }
  181. func (s *Curve) ELKeyPair() (*ELKeyPair, error) {
  182. e1, _, err := s.searhClosePoints(Random(big.NewInt(1), Sub64(s.p, 1)))
  183. if err != nil {
  184. return nil, err
  185. }
  186. d := Random(big.NewInt(1), Sub64(s.n, 1))
  187. e2, err := e1.Mul(d)
  188. if err != nil {
  189. return nil, err
  190. }
  191. res := &ELKeyPair{
  192. curve: s,
  193. priv: &ELKeyPriv{
  194. d: d,
  195. },
  196. pub: &ELKeyPub{
  197. e1: e1,
  198. e2: e2,
  199. },
  200. }
  201. return res, res.setupDataTable()
  202. }
  203. */