app.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 main() {
  18. var charsets map[string]string
  19. var usedCharsets[] string
  20. var possibleSymbols int = 0
  21. var passphrase string
  22. var words int
  23. charsets = make(map[string]string)
  24. charsets["Numbers"] = "0123456789"
  25. charsets["Lowercase"] = "abcdefghijklmnopqrstuvwxyz"
  26. charsets["Uppercase"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  27. charsets["Common Special Characters"] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  28. charsets["Space"] = " "
  29. charsets["Extended ASCII"] = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  30. flag.StringVar(&passphrase, "diceware", "", "a diceware passphrase")
  31. flag.IntVar(&words, "words", 0, "How many words")
  32. flag.StringVar(&passphrase, "random", "", "a random string password")
  33. flag.StringVar(&passphrase, "insecure", "", "a human invented password")
  34. flag.Parse()
  35. seen := make(map[string]bool)
  36. flag.Visit(func(f *flag.Flag) { seen[f.Name] = true })
  37. if len(seen) == 0 {
  38. flag.PrintDefaults()
  39. os.Exit(2) // the same exit code flag.Parse uses
  40. }
  41. fmt.Println("\nEvaluated string:", passphrase)
  42. if dice := seen["diceware"]; dice {
  43. if dice := !seen["words"]; dice {
  44. os.Exit(2)
  45. } else {
  46. entropy := math.Log2(math.Pow(float64(7776), float64(words)))
  47. fmt.Println("\nPassphrase entropy:", entropy)
  48. }
  49. } else if rnd := seen["random"]; rnd {
  50. passphraseLength := len(passphrase)
  51. for key, value := range charsets {
  52. if strings.ContainsAny(passphrase, value) {
  53. possibleSymbols += len(value)
  54. usedCharsets = append(usedCharsets, key)
  55. }
  56. }
  57. entropy := math.Log2(math.Pow(float64(possibleSymbols), float64(passphraseLength)))
  58. fmt.Println("\nNumber of characters:", passphraseLength)
  59. fmt.Println("\nUsed character sets:", strings.Join(usedCharsets, ", "))
  60. fmt.Println("\nPassphrase entropy:", entropy)
  61. }
  62. }