package main import ( "fmt" "math" "os" "strings" ) func contains(arr [3]string, str string) bool { for _, a := range arr { if a == str { return true } } return false } func main() { var charsets map[string]string var usedCharsets[] string var possibleSymbols int = 0 if len(os.Args) == 1 { fmt.Println("Usage:\n\tpassphrase-entropy passphrase\n\nNo passphrase given.") os.Exit(0) } passphrase := strings.Join(os.Args[1:]," ") passphraseLength := len(passphrase) fmt.Println("\nEvaluated string:", passphrase) charsets = make(map[string]string) charsets["Numbers"] = "0123456789" charsets["Lowercase"] = "abcdefghijklmnopqrstuvwxyz" charsets["Uppercase"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" charsets["Common Special Characters"] = " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~‚" charsets["Extended ASCII"] = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" for key, value := range charsets { if strings.ContainsAny(passphrase, value) { possibleSymbols += len(value) usedCharsets = append(usedCharsets, key) } } entropy := math.Log2(math.Pow(float64(possibleSymbols), float64(passphraseLength))) fmt.Println("\nNumber of characters:", passphraseLength) fmt.Println("\nUsed character sets:", strings.Join(usedCharsets, ", ")) fmt.Println("\nPassphrase entropy:", entropy) }