Recently I’ve developed a brute force password cracker tool (can be found in post BruteForcer). I think it deserves to mention some design characteristics of the application. I’ll mention Alphabet Generation in other words base 26 operations that is used and needed for many programmers.
Alphabet to Generate
Our generator should output strings based on the alphabet that we provide. For instance if our alphabet was:
Alphabet = “ABC”
then our strings will be as below:
A | AA | BA | CA | AAA |
B | AB | BB | CB | AAB |
C | AC | BC | CC | AAC |
In fact this is the base operations of the calculus.
This is a good link that gives the big picture more clearly for the whole English Alphabet: https://www.minus40.info/sky/alphabetcountdec.html
A = 1, B=2, C=3, AA = 4, AB = 5 and so forth.
Let’s check why AA = 4:
This is similar (but not same) with our base 10 number system because in base 10 we have zero (0). Pay attention that we do not write 00 as a number. But in string notation 00 is completely different than 0.
Alphabet size = 3, so we’ll use mod 3.
A = 1
B = 2
C =3
AA = (3*1) + 1 = 4
AB = (3*1) + 2 = 5
AAA = (3*3*1) + (3*1) + 1 = 13
and so forth.
Code
So below code gets string representation of any given integer for the given alphabet:
def int2base(self, x, base): if x == 0: return Config.ALPHABET[0] digits = [] while x: x -= 1 digits.append(Config.ALPHABET[x % base]) x //= base # make sure it IS a integer division digits.reverse() result = ''.join(digits) if len(result) > Config.MAX_LENGTH: logging.warning('All combinations exhausted!') exit(0) return result
If you noticed there is a modulus and division operation in the loop. This is very similar to our base conversation calculation learned at our calculus lessons. Another important code is:
x //= base
which guarantees the integer division.