Recover lost PGP passphrase with Mathematica! (Done)
- To: mathgroup at smc.vnet.net
- Subject: [mg127341] Recover lost PGP passphrase with Mathematica! (Done)
- From: Murta <rodrigomurtax at gmail.com>
- Date: Wed, 18 Jul 2012 01:39:12 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
Hi all! Long time ago, I have made one PGP key with one big passphrase that I have forgot. I just know some words of it, and could remember that I have mixed some Portuguese with German and English in it. Just for hobby, I tried to break up it using Mathematica, and I get a positive result!.. To do it you'll need to use a Mac with the free GPG installed (GnuPG). You will need just to save the testFile.gpg (cryptographed with the lost passphase key) in your notebook directory and create a possibility list with some clues of your lost passphrase. I find my in almost 50.000 combinations!.. (10 minutes) Don't forget that is necessary to save the notebook before run, it need you r notebook directory (copy and paste do not work) There is the code, (*------------------------------------------------------------------------*) (*Function to create combinations of words*) phrase[possibilidades_]:=Module[{$frases}, $frases=Distribute[possibilidades,List]; $frases=StringJoin@@Riffle[#," "]&/@$frases ] (*Testing 1 Phrase*) test1Phrase[pass_,fileName_]:=Module[{test,string,path=NotebookDirectory[],count}, count:=Length@ReadList["!ls '"<>path<>"'",Record]; test=count; string="! /usr/local/bin/gpg --batch -q -o '@path/outputRand.txt' --passphrase '@pass' --decrypt '@path/@fileName'"; string=StringReplace[string,{"@pass"-> pass,"@path/"-> path,"@fileName" -> fileName,"outputRand"-> ToString@RandomInteger[10^6]}]; Run[string]; If[count==test,False,True] ]; (*Tests each combination*) testPhraseList[listFrases_,fileName_]:=Module[{return}, i=1;qtd=Length[listFrases]; return=Catch[(i++;If[test1Phrase[#,fileName],Throw[#]])&/@listFrases]; If[Length[return]==0,return,"passphrase not found"] ] (*Nice progress bar*) pBar=Dynamic[Row[{ProgressIndicator[i,{0,qtd}]," ",NumberForm[100. i/qtd,{\[Infinity],2}],"% "}]]; (*Using the code*) (*list of possible words*) possibleList={{"Minha","Mein","Meine","meine"}, {"Terra","terra","grund","Grund","Land","land"}, {"tem","habe","have"}, {"Palms","palms","palmeiras","Palmeiras"}, {"onde","where"}, {"sing","canta","singt"}, {"der","o","the","die","das","a"}, {"sabia","Sabia","sabi=E1","Sabi=E1"} }; (*creating list of combinations*) (listaFrases=phrase[possibleList])//Length (*testing it!*) pBar testPhraseList[listaFrases,"testFile.gpg"] (*the function will print the file if it find it..*) (*------------------------------------------------------------------------*) Good luck if you need it!