feat: added dictionary generating tool.

This commit is contained in:
Andrey Parhomenko 2024-09-23 03:06:50 +05:00
parent d90d443017
commit e067b06686
6 changed files with 138 additions and 35 deletions

77
dict/dict.go Normal file
View file

@ -0,0 +1,77 @@
package dict
import (
"os"
"io"
"sync"
"strconv"
"surdeus.su/core/cli/mtool"
"surdeus.su/util/combo/pin"
"surdeus.su/util/combo/tmpl"
)
var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var Tool = mtool.T("dict").Func(Run).Usage(
"<token1 token2 ... [token3]>",
).Desc("make password dictionary from custom tokens")
func Run(
flags *mtool.Flags,
) {
var (
maxLen int
)
flags.IntVar(
&maxLen,
"max", 2, "max tokens in output passwords",
)
tokens := flags.Parse()
if len(tokens) < 2 {
flags.Usage()
os.Exit(1)
}
if len(tokens) > len(alphabet) {
flags.Usage()
os.Exit(1)
}
c := alphabet[:len(tokens)]
var (
wg sync.WaitGroup
)
input, output := io.Pipe()
wg.Add(1)
go func() {
pin.Tool.Run([]string{
"-c", c,
"-m", "-max-reps", "1",
"-max-len", strconv.Itoa(maxLen),
"--",
},
io.Reader(os.Stdin), io.Writer(output),
)
output.Close()
wg.Done()
}()
wg.Add(1)
go func() {
tmpl.Tool.Run(append([]string{
"-c", c,
"--",
}, tokens...),
io.Reader(input), io.Writer(os.Stdout),
)
input.Close()
wg.Done()
}()
wg.Wait()
}

2
go.mod
View file

@ -2,4 +2,4 @@ module surdeus.su/util/combo
go 1.16 go 1.16
require surdeus.su/core/cli v0.6.0 require surdeus.su/core/cli v0.8.0

4
go.sum
View file

@ -2,3 +2,7 @@ golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
surdeus.su/core/cli v0.6.0 h1:ezyBljhVn+lTcIMPblUMsQzaXQ+xzkzZ9ZYLcirZwEI= surdeus.su/core/cli v0.6.0 h1:ezyBljhVn+lTcIMPblUMsQzaXQ+xzkzZ9ZYLcirZwEI=
surdeus.su/core/cli v0.6.0/go.mod h1:r9JtQz3aEJzpYzMaNUNQHJoYkoWKNPi047qhd5uGlmA= surdeus.su/core/cli v0.6.0/go.mod h1:r9JtQz3aEJzpYzMaNUNQHJoYkoWKNPi047qhd5uGlmA=
surdeus.su/core/cli v0.7.0 h1:4IBN6PyZp6BUTC2mrDPudCjUbs/fs6Pv1KG/Ua/vBCI=
surdeus.su/core/cli v0.7.0/go.mod h1:r9JtQz3aEJzpYzMaNUNQHJoYkoWKNPi047qhd5uGlmA=
surdeus.su/core/cli v0.8.0 h1:HGmRqWl6W5DxFX1nVkUpS+cK0BgYYJdYrZY3VTq3C4k=
surdeus.su/core/cli v0.8.0/go.mod h1:r9JtQz3aEJzpYzMaNUNQHJoYkoWKNPi047qhd5uGlmA=

View file

@ -2,14 +2,17 @@ package main
import ( import (
"os" "os"
"surdeus.su/util/combo/tmpl"
"surdeus.su/util/combo/pin"
"surdeus.su/core/cli/mtool" "surdeus.su/core/cli/mtool"
"surdeus.su/util/combo/dict"
"surdeus.su/util/combo/pin"
"surdeus.su/util/combo/tmpl"
) )
var root = mtool.T("combo").Subs( var root = mtool.T("combo").Subs(
tmpl.Tool, tmpl.Tool,
pin.Tool, pin.Tool,
dict.Tool,
) )
func main() { func main() {

View file

@ -12,7 +12,7 @@ import (
var ( var (
delim rune = '\n' delim rune = '\n'
Tool = mtool.T("pin").Func(Run).Desc( Tool = mtool.T("pin").Func(Run).Desc(
"print all the possible PIN combinations made of custom characters", "print all the possible PIN combinations made of custom characters",
).Usage( ).Usage(
"", "",
@ -21,7 +21,7 @@ var (
func Pow(x, p int) int { func Pow(x, p int) int {
ret := 1 ret := 1
for i:=0 ; i<p ; i++ { for i := 0; i < p; i++ {
ret *= x ret *= x
} }
return ret return ret
@ -30,8 +30,8 @@ func Pow(x, p int) int {
func GetPin(chars []rune, length int, i int) string { func GetPin(chars []rune, length int, i int) string {
ret := "" ret := ""
slen := len(chars) slen := len(chars)
for j:=0 ; j<length ; j++ { for j := 0; j < length; j++ {
ret = string(chars[ ( i/Pow(slen, j) ) % slen] ) + ret ret = string(chars[(i/Pow(slen, j))%slen]) + ret
} }
return ret return ret
} }
@ -40,11 +40,12 @@ func FprintPins(
output io.Writer, output io.Writer,
chars []rune, chars []rune,
length int, length int,
maxReps int,
) { ) {
n := Pow(len(chars), length) n := Pow(len(chars), length)
for i:=0 ; i<n ; i++ { for i := 0; i < n; i++ {
pin := GetPin(chars, length, i) pin := GetPin(chars, length, i)
if Fits([]rune(pin), chars, length) { if Fits([]rune(pin), chars, maxReps) {
fmt.Fprintln( fmt.Fprintln(
output, output,
GetPin(chars, length, i), GetPin(chars, length, i),
@ -71,11 +72,19 @@ func Fits(s []rune, chrs []rune, maxReps int) bool {
func Run( func Run(
flags *mtool.Flags, flags *mtool.Flags,
) { ) {
CustomRun( cargs := flags.CustomArgs()
os.Stdin, if len(cargs) == 0 {
os.Stdout, CustomRun(
flags, os.Stdin,
) os.Stdout,
flags,
)
return
}
input := cargs[0].(io.Reader)
output := cargs[1].(io.Writer)
CustomRun(input, output, flags)
} }
func CustomRun( func CustomRun(
@ -84,15 +93,15 @@ func CustomRun(
flags *mtool.Flags, flags *mtool.Flags,
) { ) {
var ( var (
length int length int
rFlag bool rFlag bool
mFlag bool mFlag bool
minLength int minLength int
maxReps int maxReps int
) )
var ( var (
charsString string charsString string
chrs []rune chrs []rune
) )
flags.StringVar( flags.StringVar(
@ -103,20 +112,20 @@ func CustomRun(
"COMBO_CHARS", "COMBO_CHARS",
) )
flags.IntVar( flags.IntVar(
&minLength, "min-len", 1, &minLength, "min-len", 4,
"min length of the output pins", "min length of the output pins",
) )
flags.BoolVar( flags.BoolVar(
&mFlag, "m", false, &mFlag, "m", false,
"set the '-min-len' flag value to 1 (overrides the '-min' it)", "set the '-min-len' flag value to 1 (overrides the '-min-len')",
) )
flags.IntVar( flags.IntVar(
&length, "max", 0, &length, "max-len", 0,
"max length of the output pins", "max length of the output pins",
) )
flags.IntVar(&maxReps, "max-reps", 1, "max repeats of the rune." ) flags.IntVar(&maxReps, "max-reps", 4, "max repeats of the rune.")
flags.BoolVar(&rFlag, "r", false, "make the -max-reps value equal to the length of input chars" ) flags.BoolVar(&rFlag, "r", false, "make the -max-reps value equal to the length of input chars")
_ = flags.Parse() _ = flags.Parse()
@ -144,11 +153,11 @@ func CustomRun(
flags.Usage() flags.Usage()
os.Exit(1) os.Exit(1)
} }
for i := minLength ; i<=length ; i++ { for i := minLength; i <= length; i++ {
FprintPins(output, chrs, i) FprintPins(output, chrs, i, maxReps)
} }
} else { } else {
FprintPins(output, chrs, length) FprintPins(output, chrs, length, maxReps)
} }
} }

View file

@ -4,6 +4,8 @@ import (
"bufio" "bufio"
"fmt" "fmt"
"io" "io"
//"log"
"os" "os"
"surdeus.su/core/cli/mtool" "surdeus.su/core/cli/mtool"
@ -11,15 +13,23 @@ import (
var ( var (
delim = '\n' delim = '\n'
Tool = mtool.T("tmpl").Func(Run).Desc( Tool = mtool.T("tmpl").Func(Run).Desc(
"substitute the inputted runes with the specified words", "substitute the inputted runes with the specified words",
).Usage( ).Usage(
"[n_strings]", "[n_strings]",
) )
) )
func Run(flags *mtool.Flags){ func Run(flags *mtool.Flags) {
CustomRun(os.Stdin, os.Stdout, flags) cargs := flags.CustomArgs()
if len(cargs) == 0 {
CustomRun(os.Stdin, os.Stdout, flags)
return
}
input := cargs[0].(io.Reader)
output := cargs[1].(io.Writer)
CustomRun(input, output, flags)
} }
func CustomRun( func CustomRun(
@ -30,8 +40,8 @@ func CustomRun(
var ( var (
charsString string charsString string
chrs []rune chrs []rune
skip bool skip bool
) )
flags.StringVar( flags.StringVar(
@ -59,15 +69,15 @@ func CustomRun(
chrs = []rune(charsString) chrs = []rune(charsString)
//args = args[1:] //args = args[1:]
tmpl := make(map[rune] string) tmpl := make(map[rune]string)
for i, s := range args { for i, s := range args {
tmpl[rune(chrs[i])] = s tmpl[rune(chrs[i])] = s
} }
r := bufio.NewReader(input) r := bufio.NewReader(input)
for{ for {
s, e := r.ReadString(byte(delim)) s, e := r.ReadString(byte(delim))
if e==io.EOF { if e == io.EOF {
break break
} }
s = s[:len(s)-1] s = s[:len(s)-1]