|
|
Message-ID: <20240517205228.GA30958@openwall.com>
Date: Fri, 17 May 2024 22:52:28 +0200
From: Solar Designer <solar@...nwall.com>
To: john-users@...ts.openwall.com
Subject: Re: Markov phrases in john
On Wed, May 15, 2024 at 11:50:45PM +0200, Solar Designer wrote:
> On Wed, May 08, 2024 at 07:12:47AM -0400, Matt Weir wrote:
> > Now if you don't want to do conditional probability and do more 'individual
> > words frequency sorted' like mask mode, that is a lot easier to do. I
> > wouldn't be surprised if there is an external mode in JtR to do just this
> > already.
>
> This wasn't convenient to do from an external mode because of its too
> limited interfacing to the rest of JtR. We offered two kinds of modes:
> standalone generators and filters. The former would have to have the
> wordlist embedded in the code, which is cumbersome. The latter can
> produce at most one output word per input word (filtering or modifying
> it). This changed when JimF introduced hybrid external modes in 2016 -
> that's two extra callbacks. So a candidate passphrase generator as an
> external mode is more reasonably implementable now, but not done yet.
OK, done for word pairs now:
# Combine words coming from another cracking mode into pairs. This gradually
# memorizes up to the initial 1 MB worth of words and uses them to prefix and
# suffix each current word.
# Known limitations: the progress indicator and ETA will be too optimistic
# (they assume linear progress through the input stream, but actual complexity
# is quadratic), --restore of an interrupted session will not work right (has
# no opportunity to re-memorize the other mode's skipped words).
# Example usage: --wordlist --external=combinator --rules-stack=phrase
[List.External:Combinator]
int separator;
int words[1000000], size;
int base[0x40], base_size, base_length, swap, p, q;
void init()
{
separator = ' '; // Set to 0 for no separators
size = 1000000;
base_size = 0x40;
if (req_maxlen && base_size > req_maxlen + 1)
base_size = req_maxlen + 1;
q = 0;
}
void new()
{
swap = p = 0;
base_length = -1;
while (q < size && (words[q++] = word[++base_length]))
continue;
if (q < size && base_length < base_size)
return;
q -= base_length + 1;
while (word[++base_length])
continue;
if (base_length >= base_size)
word = 0;
}
void next()
{
int i, j;
if (swap) {
i = -1;
while (word[++i] = words[p++])
continue;
if (p >= q) {
word = 0;
return;
}
if (separator)
word[i++] = separator;
j = 0;
while (word[i++] = base[j++])
continue;
return;
}
i = base_length;
if (separator)
word[i++] = separator;
while (word[i++] = words[p++])
continue;
if (p >= q) {
p = 0;
swap++;
i = -1;
while (++i < base_length)
base[i] = word[i];
base[i] = 0;
}
}
Alexander
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.