app.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "math"
  6. "os"
  7. "strings"
  8. )
  9. func contains(arr [3]string, str string) bool {
  10. for _, a := range arr {
  11. if a == str {
  12. return true
  13. }
  14. }
  15. return false
  16. }
  17. func myUsage() {
  18. fmt.Println("usage: passphrase-entropy <command> [<args>]")
  19. fmt.Println("Available commands are: ")
  20. fmt.Println(" diceware Calculate entropy of a diceware passphrase")
  21. fmt.Println(" random Calculate entropy of a random string")
  22. fmt.Println(" insecure Calculate entropy of an invented passphrase")
  23. }
  24. func main() {
  25. var charsets map[string]string
  26. var usedCharsets[] string
  27. var possibleSymbols int = 0
  28. charsets = make(map[string]string)
  29. charsets["Numbers"] = "0123456789"
  30. charsets["Lowercase"] = "abcdefghijklmnopqrstuvwxyz"
  31. charsets["Uppercase"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  32. charsets["Common Special Characters"] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  33. charsets["Space"] = " "
  34. charsets["Extended ASCII"] = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  35. dicewareCommand := flag.NewFlagSet("diceware", flag.ExitOnError)
  36. dicewarePassphraseFlag := dicewareCommand.String("passphrase", "", "the passphrase")
  37. wordsFlag := dicewareCommand.Int("words", 0, "number of words in passphrase")
  38. dictSizeFlag := dicewareCommand.Int("dictSize", 0, "number of words in dictionary")
  39. randomCommand := flag.NewFlagSet("random", flag.ExitOnError)
  40. randomPassphraseFlag := randomCommand.String("password", "", "the password")
  41. insecureCommand := flag.NewFlagSet("insecure", flag.ExitOnError)
  42. insecureWords := insecureCommand.Int("words", 0, "number of words in invented passphrase")
  43. if len(os.Args) == 1 {
  44. myUsage()
  45. return
  46. }
  47. switch os.Args[1] {
  48. case "diceware":
  49. dicewareCommand.Parse(os.Args[2:])
  50. case "random":
  51. randomCommand.Parse(os.Args[2:])
  52. case "insecure":
  53. insecureCommand.Parse(os.Args[2:])
  54. default:
  55. myUsage()
  56. fmt.Printf("\n%q is not valid command.\n", os.Args[1])
  57. os.Exit(2)
  58. }
  59. if dicewareCommand.Parsed() {
  60. if *dicewarePassphraseFlag == "" {
  61. dicewareCommand.Usage()
  62. return
  63. }
  64. if *wordsFlag == 0 {
  65. dicewareCommand.Usage()
  66. return
  67. }
  68. if *dictSizeFlag == 0 {
  69. dicewareCommand.Usage()
  70. return
  71. }
  72. entropy := math.Log2(math.Pow(float64(*dictSizeFlag), float64(*wordsFlag)))
  73. fmt.Println("\nPassphrase entropy:", entropy)
  74. }
  75. if randomCommand.Parsed() {
  76. if *randomPassphraseFlag == "" {
  77. randomCommand.Usage()
  78. return
  79. }
  80. passphraseLength := len(*randomPassphraseFlag)
  81. for key, value := range charsets {
  82. if strings.ContainsAny(*randomPassphraseFlag, value) {
  83. possibleSymbols += len(value)
  84. usedCharsets = append(usedCharsets, key)
  85. }
  86. }
  87. entropy := math.Log2(math.Pow(float64(possibleSymbols), float64(passphraseLength)))
  88. fmt.Println("\nNumber of characters:", passphraseLength)
  89. fmt.Println("\nUsed character sets:", strings.Join(usedCharsets, ", "))
  90. fmt.Println("\nPassphrase entropy:", entropy)
  91. }
  92. if insecureCommand.Parsed() {
  93. if *insecureWords != 0 {
  94. insecureCommand.Usage()
  95. return
  96. }
  97. }
  98. }