rsa.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package rsa
  2. /*
  3. RSA: RSA encryption, decryption and signing
  4. */
  5. import (
  6. "os"
  7. "fmt"
  8. "bufio"
  9. "config"
  10. "tools/common"
  11. "tools/rsa/keys"
  12. "tools/rsa/data"
  13. "tools/rsa/integer"
  14. )
  15. type RSA struct {
  16. *keys.Keys
  17. *data.Blob
  18. recv *os.File
  19. }
  20. func New() *RSA {
  21. r := new(RSA)
  22. r.Keys = keys.New(config.RSA_BASE_INIT, config.RSA_BASE, config.RSA_SIZE)
  23. r.Blob = data.New()
  24. return r
  25. }
  26. func (r *RSA) ReadRecvFile() (string, bool) {
  27. str := ""
  28. if f, err := os.Open(config.RSA_RECV_FILE); !common.IsError(err, fmt.Sprintf("%s", config.RSA_RECV_FILE)) {
  29. defer f.Close()
  30. scanner := bufio.NewScanner(f)
  31. for scanner.Scan() {
  32. str += scanner.Text()
  33. }
  34. return str, true
  35. }
  36. return str, false
  37. }
  38. func (r *RSA) Encrypt(msg string, n, e *integer.RSAInt) []*integer.RSAInt {
  39. l := r.Set(data.TXT, data.Data(msg)).AsNumbers().ToList()
  40. for i := 0; i < len(l); i++ {
  41. l[i].PowMod(e, n)
  42. }
  43. return l
  44. }
  45. func (r *RSA) Sign(msg string) []*integer.RSAInt {
  46. l := r.Set(data.TXT, data.Data(msg)).AsNumbers().ToList()
  47. for i := 0; i < len(l); i++ {
  48. l[i].PowMod(r.Private().D(), r.Public().N).String()
  49. }
  50. return l
  51. }
  52. func (r *RSA) EncryptNSign(msg string, n, e *integer.RSAInt) []*integer.RSAInt {
  53. l := r.Set(data.TXT, data.Data(msg)).AsNumbers().ToList()
  54. if r.Public().N.Gt(n) {
  55. for i := 0; i < len(l); i++ {
  56. l[i].PowMod(e, n).PowMod(r.Private().D(), r.Public().N)
  57. }
  58. } else {
  59. for i := 0; i < len(l); i++ {
  60. l[i].PowMod(r.Private().D(), r.Public().N).PowMod(e, n)
  61. }
  62. }
  63. return l
  64. }
  65. func (r *RSA) Decrypt(l []*integer.RSAInt) string {
  66. for i := 0; i < len(l); i++ {
  67. l[i].PowMod(r.Keys.Private().D(), r.Keys.Public().N)
  68. }
  69. r.FromList(l)
  70. return string(r.AsText().Repr())
  71. }
  72. func (r *RSA) Unsign(l []*integer.RSAInt, n, e *integer.RSAInt) string {
  73. for i := 0; i < len(l); i++ {
  74. l[i].PowMod(e, n)
  75. }
  76. r.FromList(l)
  77. return string(r.AsText().Repr())
  78. }
  79. func (r *RSA) DecryptNUnsign(l []*integer.RSAInt, n, e *integer.RSAInt) string {
  80. if n.Gt(r.Public().N) {
  81. for i := 0; i < len(l); i++ {
  82. l[i].PowMod(e, n).PowMod(r.Private().D(), r.Public().N)
  83. }
  84. } else {
  85. for i := 0; i < len(l); i++ {
  86. l[i].PowMod(r.Private().D(), r.Public().N).PowMod(e, n)
  87. }
  88. }
  89. r.FromList(l)
  90. return string(r.AsText().Repr())
  91. }