Skip to content

Instantly share code, notes, and snippets.

@ptitov
Created November 27, 2011 07:15
Show Gist options
  • Save ptitov/1397144 to your computer and use it in GitHub Desktop.
Save ptitov/1397144 to your computer and use it in GitHub Desktop.
mdpass perl port
#!/usr/bin/perl
use Digest::MD5 qw(md5_hex);
use integer;
use Config;
%english = (
pr => [ 'e', 'i', 'o', 'ay' ],
lw => [ 'ay' ],
tm => [ '-' ],
ps => [ '-' ],
oya => [ 'g', 'l' ],
ea => [ 'rth', 'll', 'lm', 'ms', '-', 'ns', 'c', 'd', 'k', 'l', 'p', 'r', 's', 't', 'v', 'rd', 'rn', 'rs', 'rt', 'ch', 'df', 'st', 'ds', 'th', 'tl', 'ts' ],
pt => [ '-' ],
nst => [ '-', 'a', 'e', 'ea' ],
ayi => [ 'ng' ],
ai => [ 'd', 'l', 'n', 'r', 's', 't', 'nst', 'ns' ],
lth => [ 'ou' ],
tr => [ 'ie', 'u', 'ou', 'oy', 'ea', 'ee', 'ue' ],
ee => [ '-', 'c', 'd', 'k', 'l', 'm', 'n', 'p', 's', 't', 'ds', 'th', 'ks' ],
lls => [ '-' ],
nsw => [ 'e' ],
ts => [ '-' ],
ia => [ 'g', 's', 't', 'nt', 'nts', '-' ],
tt => [ 'e', 'i' ],
sth => [ 'eu' ],
ndl => [ 'y' ],
rch => [ 'i' ],
ei => [ 'ng', 'g', 'th', 'r', 'v', 'z', 'gn' ],
tw => [ 'a', 'e', 'o', 'ee' ],
ie => [ 'lds', 'ld', '-', 'ndl', 'mh', 'nds', 'nd', 'd', 'r', 's', 'gfr', 'rc' ],
xt => [ '-' ],
stl => [ 'e' ],
spr => [ 'ea', 'i' ],
ndr => [ 'e' ],
rchb => [ 'i' ],
nds => [ '-' ],
eo => [ 'pl', 'n', 'w' ],
eei => [ 'ng' ],
au => [ 'r', 's', 'rs', 'ts', 'ght' ],
wsk => [ 'i' ],
mh => [ 'i' ],
str => [ 'u', 'oy', 'ea', 'a', 'e', 'i', 'o' ],
ght => [ '-', 'e', 'y' ],
sts => [ '-' ],
ay => [ '-', 'l', 's' ],
io => [ 'n', 'r', 'lch', 'ns', 'rs', 'b', 'f' ],
ua => [ 'rds' ],
eu => [ 'r', 's' ],
eau => [ 't' ],
mm => [ 'e' ],
nth => [ 'e' ],
mn => [ 'o' ],
ey => [ '-' ],
ue => [ 'sts', '-', 'd' ],
mp => [ '-', 'a' ],
mr => [ 'a' ],
tch => [ '-' ],
ms => [ '-', 'e' ],
ui => [ 'ckl', 'cks', 't' ],
rks => [ '-' ],
ye => [ '-', 't' ],
ntr => [ 'y' ],
yi => [ 'ng' ],
dst => [ '-' ],
nts => [ '-' ],
uee => [ 'n' ],
eye => [ '-', 's' ],
ff => [ '-', 'e' ],
you => [ 'ng', '-', 'rs', 'r' ],
bl => [ 'a', 'e', 'i', 'o', 'oo' ],
rst => [ '-' ],
fl => [ 'ee', 'a', 'e', 'i', 'yi', 'u', 'y' ],
nb => [ 'e' ],
'-' => [ 'yea', 'pl', 'pr', 'ai', 'bl', 'br', 'ch', 'cl', 'str', 'cr', 'sc', 'sh', 'sk', 'sl', 'sm', 'sn', 'sp', 'st', 'sw', 'dr', 'dw', 'th', 'tm', 'ea', 'tr', 'ei', 'tw', 'eu', 'fl', 'fr', 'gl', 'a', 'b', 'c', 'd', 'e', 'f', 'gr', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'wh', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'wr', 'hr', 'eye', 'thr', 'io', 'ye', 'kn', 'you', 'kr', 'spr', 'oa', 'oe', 'ou' ],
rdl => [ 'y' ],
nc => [ 'e', 'ou' ],
br => [ 'ou', 'a', 'i', 'o', 'u', 'ea' ],
nd => [ '-', 'a', 'e', 'i', 'ee' ],
bt => [ '-' ],
ppr => [ 'oa' ],
rld => [ '-' ],
ng => [ '-', 'e', 'i' ],
rc => [ 'e', 'u' ],
fr => [ 'ee', 'ie', 'a', 'i', 'o', 'ai' ],
nh => [ 'i' ],
rd => [ '-', 'e', 'i', 'o' ],
ft => [ '-', 'e', 'y' ],
rds => [ '-' ],
nk => [ '-', 'i' ],
rf => [ 'u' ],
nl => [ 'e', 'y' ],
rg => [ '-', 'o' ],
nn => [ 'o' ],
rk => [ '-', 'o' ],
rl => [ 'e', 'i', 'o' ],
rm => [ '-', 'a', 'e', 'o', 'y' ],
rth => [ '-', 'e', 'u' ],
ns => [ '-', 'e' ],
rn => [ '-', 'e', 'i', 'ey' ],
nt => [ 'ai', 'au', '-', 'e', 'i', 'o', 'u' ],
cc => [ 'e', 'o' ],
rp => [ '-', 'o' ],
thg => [ 'a' ],
rr => [ 'ia', 'ie', 'io', 'i', 'o', 'y' ],
rs => [ 'o', 'eu', '-', 'e' ],
rt => [ '-', 'a', 'e', 'y', 'ai' ],
ch => [ '-', 'a', 'e', 'i' ],
rv => [ 'e' ],
rw => [ 'a' ],
ckl => [ 'y' ],
yea => [ 'r', 'rs' ],
ck => [ '-', 'e' ],
cl => [ 'oa', 'ou', 'o' ],
ghts => [ '-' ],
gh => [ '-', 'e' ],
thr => [ 'ou', 'e', 'o', 'u', 'ee' ],
oa => [ 'k', 'rs', 'ch' ],
mpl => [ 'e' ],
gfr => [ 'ie' ],
gl => [ 'a' ],
cks => [ '-', 'i' ],
cr => [ 'ea', 'eo', 'ie', 'yi', 'e', 'i', 'o', 'y' ],
lch => [ 'i', 'o' ],
gn => [ '-' ],
ct => [ 'e', 'o', '-' ],
oe => [ 'd', 's' ],
sb => [ 'a' ],
sc => [ 'a', 'o' ],
gr => [ 'ee', 'a', 'e', 'o', 'ou', 'ay', 'ea' ],
oi => [ 'ng', 'nt', 'c' ],
kn => [ 'e', 'i', 'o', 'ee' ],
ttl => [ 'e' ],
fts => [ '-' ],
kr => [ 'ie' ],
ngth => [ '-' ],
sh => [ 'a', 'e', 'i', 'o', 'ie', 'ou', '-' ],
ks => [ '-' ],
oo => [ 'rs', '-', 'd', 'k', 'm', 'n', 'r', 't', 'ks' ],
sk => [ '-', 'e', 'i', 'y' ],
sl => [ 'ay', 'ee', 'a', 'e', 'i', 'ai' ],
sm => [ 'a', 'i', 'o' ],
wh => [ 'a', 'e', 'i', 'o', 'y' ],
sn => [ 'a' ],
rms => [ '-' ],
sp => [ 'a', 'o', 'ea' ],
a => [ 'rdl', 'rth', 'lf', 'lk', 'll', 'lm', 'lr', 'ls', 'lt', 'lw', 'stl', 'lth', 'mp', 'tch', 'nc', 'nd', 'ng', 'nn', 'nt', 'ttl', 'nch', 'ph', 'pp', 'nsw', 'nds', 'bl', 'rc', 'rd', 'ppr', 'rg', 'rk', 'rl', 'rm', 'rp', 'cc', 'rr', 'rs', 'rt', 'ch', 'ck', 'cr', 'sk', 'rms', '-', 'ss', 'st', 'dv', 'th', 'ngr', 'tt', 'lls', 'b', 'c', 'd', 'g', 'j', 'k', 'l', 'm', 'n', 'p', 'ff', 'r', 's', 't', 'v', 'w', 'z', 'fr', 'ft', 'gr', 'ws', 'rchb', 'rch' ],
ou => [ 'th', 'gh', 'nds', 'ntr', '-', 'd', 'r', 's', 't', 'ght', 'ld', 'nd', 'nt', 'bl', 'bt', 'rn', 'rt', 'ch' ],
nch => [ 'e' ],
dd => [ 'e' ],
b => [ 'ea', 'ee', 'ei', 'eo', 'ey', 'a', 'e', 'i', 'o', 'u', 'y', 'eau', 'oo', 'ou', 'oy' ],
ngd => [ 'o' ],
c => [ 'o', 'u', 'y', 'ou', 'au', '-', 'ei', 'a', 'e', 'i' ],
df => [ 'u' ],
ss => [ '-', 'e', 'io' ],
d => [ '-', 'a', 'oe', 'e', 'i', 'oo', 'o', 'ou', 'u', 'y', 'au', 'ay', 'ea', 'ee', 'ia', 'ie' ],
wn => [ '-' ],
oy => [ '-' ],
st => [ '-', 'a', 'e', 'oo', 'i', 'o', 'y' ],
e => [ 'ss', 'st', 'th', 'nds', 'tt', 'tw', 'ngth', '-', 'ft', 'rms', 'b', 'c', 'ngr', 'd', 'f', 'g', 'h', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w', 'xc', 'xt', 'ld', 'lf', 'll', 'lm', 'lp', 'ls', 'lt', 'lv', 'ctr', 'mn', 'ms', 'nb', 'nc', 'nd', 'nl', 'ns', 'nt', 'mpl', 'mbl', 'str', 'pl', 'pt', 'rc', 'rf', 'rg', 'rl', 'rm', 'rn', 'rr', 'rs', 'rt', 'rv', 'ck', 'cr', 'ct', 'sh' ],
f => [ '-', 'oo', 'ou', 'a', 'e', 'i', 'o', 'ai', 'u', 'ea', 'ee', 'ie' ],
g => [ 'ai', 'ea', 'ua', 'ue', '-', 'ia', 'a', 'e', 'i', 'o', 'u', 'oi', 'oo' ],
wr => [ 'a', 'o' ],
h => [ 'ou', '-', 'ai', 'a', 'e', 'i', 'o', 'u', 'ea' ],
sw => [ 'i', 'o', 'ee' ],
ws => [ '-' ],
i => [ 'mm', 'ms', 'nc', 'nd', 'ng', 'nk', 'nt', 'ph', 'rst', 'pp', 'ps', 'rds', 'rth', 'dst', 'bl', 'rd', 'ch', 'ck', 'ghts', 'ct', 'sc', 'sh', 'ldr', 'sl', 'str', 'dd', 'st', 'th', 'ts', 'ttl', 'ff', 'ft', 'fts', 'gh', 'nst', '-', 'b', 'c', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 'ngd', 's', 't', 'v', 'ngl', 'ngs', 'ld', 'll', 'ght', 'lt', 'lv' ],
j => [ 'ou', 'oy', 'a', 'e', 'u' ],
ngl => [ 'e' ],
k => [ 'e', 'i', 'ee', '-' ],
ld => [ '-', 'e', 'i' ],
l => [ 'ai', 'ay', '-', 'a', 'e', 'i', 'o', 'y', 'ea', 'ia', 'ie', 'io', 'oo', 'ou' ],
m => [ '-', 'a', 'e', 'i', 'o', 'u', 'y', 'oo', 'ou', 'ai', 'ay', 'ea', 'ee' ],
lf => [ '-' ],
n => [ 'ou', 'au', '-', 'ea', 'ee', 'a', 'e', 'i', 'o', 'ue', 'y', 'ia', 'io' ],
mphs => [ '-' ],
o => [ 'cks', 'dd', 'ss', 'st', 'dr', 'ds', 'nst', 'th', 'rks', 'rld', 'ff', 'thg', 'wn', 'ws', 'wsk', '-', 'ld', 'll', 'mp', 'mr', 'b', 'd', 'f', 'g', 'rds', 'h', 'j', 'k', 'l', 'm', 'n', 'rth', 'p', 'r', 'nc', 's', 'nd', 't', 'v', 'ng', 'w', 'nl', 'ns', 'nt', 'lch', 'ph', 'ps', 'bl', 'rc', 'rd', 'rg', 'rk', 'rl', 'rm', 'rn', 'rr', 'rs', 'rt', 'rw', 'ck' ],
p => [ 'oi', 'oo', 'ai', 'ay', '-', 'ea', 'eo', 'a', 'e', 'i', 'o', 'u', 'y', 'ie' ],
dr => [ 'ea', 'a', 'e', 'i', 'o', 'y' ],
ngr => [ 'i', 'y' ],
ds => [ '-' ],
q => [ 'ui', 'uee' ],
ngs => [ '-' ],
r => [ 'a', 'e', 'i', 'o', 'u', 'y', 'ie', 'oya', 'oe', 'ou', 'ai', 'ea', 'ei', '-' ],
lk => [ 'e', 'i' ],
s => [ '-', 'oo', 'ou', 'a', 'e', 'i', 'o', 'u', 'ayi', 'ai', 'ay', 'eei', 'ea', 'ee', 'ei', 'eu', 'ie' ],
dv => [ 'e', 'i' ],
ll => [ '-', 'e', 'o', 'u', 'y', 'ey' ],
t => [ 'ea', 'ee', '-', 'a', 'e', 'i', 'o', 'u', 'y', 'io', 'oo', 'ou' ],
hr => [ 'o' ],
lm => [ '-', 'e', 'o' ],
dw => [ 'e' ],
ph => [ '-', 'e', 'i' ],
u => [ 'rth', 'lf', 'll', 'str', 'nd', 'ng', 'nh', 'nl', 'nt', 'l', 'n', 'p', 'r', 's', 't', 'ndr', 'bl', 'nth', 'rn', 'rp', 'ch', 'ck', 'sb', 'dd', 'st', 'th', 'lls', 'ff' ],
v => [ 'ou', 'a', 'e', 'i', 'y', 'oya', 'oi' ],
w => [ 'oo', 'ou', '-', 'ai', 'ay', 'a', 'e', 'i', 'o', 'u', 'ea', 'ee' ],
lp => [ '-', 'e' ],
ctr => [ 'o' ],
pl => [ 'ea', 'ie', 'a', 'e' ],
y => [ 'cl', 'd', 'l', 'ss', 'r', 's', 'mphs', 'sth', '-' ],
lr => [ 'ea' ],
xc => [ 'a' ],
ldr => [ 'e' ],
th => [ 'io', 'ou', '-', 'a', 'e', 'i', 'o', 'u', 'y', 'ee', 'ei', 'eu', 'ey' ],
z => [ 'e' ],
mbl => [ 'e' ],
lds => [ '-' ],
ls => [ '-', 'a', 'e', 'o' ],
lt => [ '-', 'a' ],
pp => [ 'e', 'i', 'y', 'ea' ],
lv => [ 'e' ],
tl => [ 'y' ]
);
$prefix = '-';
die "Only 64-bit architectures are supported\n" if(!$Config{use64bitint});
die "Usage: mdpass passphrase website\n" if(@ARGV<2);
$passphrase = $ARGV[0];
$website = $ARGV[1];
$digest = substr(md5_hex($passphrase.$website), 0, 10);
$digest = hex($digest);
while($digest > 0) {
my @ary = @{$english{$prefix}};
die if(@ary == 0);
if($digest < 1000) {
$out .= '-';
my $number = $digest % 1000;
$out .= $number;
print "$out\n";
exit;
}
my $idx = $digest % @ary;
$digest /= @ary;
my $syllable = @ary[$idx];
$out .= $syllable;
$prefix = $syllable;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment