main.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package main
  2. import (
  3. "os"
  4. "fmt"
  5. "bufio"
  6. "config"
  7. "regexp"
  8. "strings"
  9. "tools/rsa"
  10. "tools/rsa/data"
  11. "tools/common"
  12. )
  13. type optval int
  14. const (
  15. STD optval = 1 << iota
  16. GEN optval = 1 << iota
  17. RAGNAR optval = 1 << iota
  18. BIRGER optval = 1 << iota
  19. MATHEM optval = 1 << iota
  20. CUSTOM optval = 1 << iota
  21. SIGN optval = 1 << iota
  22. CRYPTSIGN optval = 1 << iota
  23. EVERY optval = CUSTOM | SIGN | CRYPTSIGN
  24. )
  25. func opt() optval {
  26. fmt.Printf("Select option\n")
  27. fmt.Printf("1: Set standard keys\n")
  28. fmt.Printf("2: Generate new keys\n")
  29. s := userInput("Option", false)
  30. switch s[0] {
  31. case '1':
  32. return STD
  33. case '2':
  34. return GEN
  35. default:
  36. fmt.Printf("Unknown option, set standard.\n")
  37. return STD
  38. }
  39. }
  40. func cryptOpt() optval {
  41. fmt.Printf("Select option\n")
  42. fmt.Printf("1: Read ragnars message\n")
  43. fmt.Printf("2: Send Birger a message\n")
  44. fmt.Printf("3: Encrypt/decrypt mathematica message\n")
  45. fmt.Printf("4: Encrypt/decrypt custom message\n")
  46. fmt.Printf("5: Sign/de-sign custom message\n")
  47. fmt.Printf("6: Encrypt+sign/decrypte+unsign custom message\n")
  48. fmt.Printf("7: Encrypt, sign and encrypt+sign\n")
  49. s := userInput("Option", false)
  50. switch s[0] {
  51. case '1': return RAGNAR
  52. case '2': return BIRGER
  53. case '3': return MATHEM
  54. case '4': return CUSTOM
  55. case '5': return SIGN
  56. case '6': return CRYPTSIGN
  57. case '7': return EVERY
  58. default:
  59. fmt.Printf("Unknown option, set standard.\n")
  60. return MATHEM
  61. }
  62. }
  63. func std1(r *rsa.RSA) bool {
  64. fmt.Printf("* Setting standard-keys for r1\n")
  65. return r.SetKeys(config.RSA_STD_1_D, config.RSA_STD_1_E, config.RSA_STD_1_N)
  66. }
  67. func std2(r *rsa.RSA) bool {
  68. fmt.Printf("* Setting standard-keys for r2\n")
  69. return r.SetKeys(config.RSA_STD_2_D, config.RSA_STD_2_E, config.RSA_STD_2_N)
  70. }
  71. func stdRagnar(r *rsa.RSA) bool {
  72. fmt.Printf("* Setting ragnar-keys for r2\n")
  73. return r.SetKeys(config.RSA_RAGNAR_D, config.RSA_RAGNAR_E, config.RSA_RAGNAR_N)
  74. }
  75. func stdBirger(r *rsa.RSA) bool {
  76. fmt.Printf("* Setting ragnar-keys for r2\n")
  77. return r.SetKeys(config.RSA_BIRGER_D, config.RSA_BIRGER_E, config.RSA_BIRGER_N)
  78. }
  79. func std(o optval, r1, r2 *rsa.RSA) bool {
  80. switch o {
  81. case RAGNAR:
  82. return std1(r1) && stdRagnar(r2)
  83. case BIRGER:
  84. return std1(r1) && stdBirger(r2)
  85. default:
  86. return std1(r1) && std2(r2)
  87. }
  88. }
  89. func gen(o optval, r1, r2 *rsa.RSA) bool {
  90. switch o {
  91. case RAGNAR, EVERY:
  92. r1.GenPrimes()
  93. stdRagnar(r2)
  94. case BIRGER:
  95. r1.GenPrimes()
  96. stdBirger(r2)
  97. default:
  98. r1.GenPrimes()
  99. r2.GenPrimes()
  100. }
  101. return true
  102. }
  103. func userInput(promt string, re bool) string {
  104. reader := bufio.NewReader(os.Stdin)
  105. fmt.Printf("%s [enter]: ", promt)
  106. msg, err := reader.ReadString('\n')
  107. if !common.IsError(err, "Could not read from input\n") {
  108. if re {
  109. s := regexp.MustCompile("[a-zæøåA-ZÆØÅ., ]+").FindAllString(msg, -1) // Allowin a-z, æ, ø, å, comma, dot, space
  110. msg = ""
  111. for i := 0; i < len(s); i++ {
  112. msg += strings.ToLower(strings.Trim(s[i], "\n"))
  113. }
  114. }
  115. return msg
  116. }
  117. return ""
  118. }
  119. func main() {
  120. r1 := rsa.New()
  121. r2 := rsa.New()
  122. if r1 == nil || r2 == nil {
  123. fmt.Printf("Could not create RSA")
  124. return
  125. }
  126. fmt.Printf("R1: %p\tR2: %p\n", r1, r2)
  127. var keys bool
  128. m := cryptOpt()
  129. o := opt()
  130. switch o {
  131. case STD:
  132. keys = std(m, r1, r2)
  133. case GEN:
  134. keys = gen(m, r1, r2)
  135. }
  136. if !keys {
  137. fmt.Printf("Oh no!")
  138. return
  139. }
  140. switch m {
  141. case RAGNAR:
  142. r2.Crack()
  143. msg,_ := r2.ReadRecvFile()
  144. d := r2.Set(data.TXT, data.Data(""))
  145. d.Data().SetRaw(msg)
  146. enc := d.AsNumbers().ToList()
  147. fmt.Printf("%s\n", d.Repr())
  148. dec := r2.Decrypt(enc)
  149. fmt.Printf("%s\n", dec)
  150. case BIRGER:
  151. msg := userInput("Message to Birger", true)
  152. enc := r1.Encrypt(msg, r2.Public().N, r2.Public().E)
  153. fmt.Printf("Message to send to Birger:\n%v\n\n", enc)
  154. case MATHEM:
  155. msg := "dette er en liten test på hva som går an å gjøre med mathematica, mye annet og naturligvis."
  156. fmt.Printf("Message to encrypt:\n%s\n\n", msg)
  157. enc := r1.Encrypt(msg, r2.Public().N, r2.Public().E)
  158. fmt.Printf("Encrypted message:\n%s\n\n", enc)
  159. dec := r2.Decrypt(enc)
  160. fmt.Printf("Decryptet message:\n%s\n\n", dec)
  161. case CUSTOM:
  162. msg := userInput("Your message", true)
  163. fmt.Printf("Message to encrypt:\n%s\n\n", msg)
  164. enc := r1.Encrypt(msg, r2.Public().N, r2.Public().E)
  165. fmt.Printf("Encrypted:\n%v\n\n", enc)
  166. dec := r2.Decrypt(enc)
  167. fmt.Printf("DECRYPTED MESSAGE:\n%s\n", dec)
  168. case SIGN:
  169. msg := userInput("Your message", true)
  170. fmt.Printf("Message to sign:\n%s\n\n", msg)
  171. signed := r1.Sign(msg)
  172. fmt.Printf("Signed:\n%v\n\n", signed)
  173. unsign := r1.Unsign(signed, r1.Public().N, r1.Public().E)
  174. fmt.Printf("Signed message:\n%s\n\n", unsign)
  175. case CRYPTSIGN:
  176. msg := userInput("Your message", true)
  177. fmt.Printf("Message to crypt and sign:\n%s\n\n", msg)
  178. encsign := r1.EncryptNSign(msg, r2.Public().N, r2.Public().E)
  179. fmt.Printf("Encrypted and signed:\n%v\n\n", encsign)
  180. decunsign := r2.DecryptNUnsign(encsign, r1.Public().N, r1.Public().E)
  181. fmt.Printf("Uncrypted and unsigned msg:\n%s\n\n", decunsign)
  182. case EVERY:
  183. msg := userInput("Your message", true)
  184. fmt.Printf("Message:\n%s\n\n", msg)
  185. enc := r1.Encrypt(msg, r2.Public().N, r2.Public().E)
  186. signed := r1.Sign(msg)
  187. encsign := r1.EncryptNSign(msg, r2.Public().N, r2.Public().E)
  188. fmt.Printf("Encrypted:\n%v\n\nSigned:\n%v\n\nEncrypted and signed:\n%s\n\n", enc, signed, encsign)
  189. }
  190. }