wie breche ich diese symmetrische verschlüsselung?

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
wegdes and brixx
Beiträge: 1
Registriert: Di Feb 11, 2020 8:43 am

wie breche ich diese symmetrische verschlüsselung?

Beitrag von wegdes and brixx » Di Feb 25, 2020 1:20 pm

aloha liebe forengemeinde,
ich habe folgenden algorithmus für eine symmetrische verschlüsselung verwendet:

schlüssel bilden:
alle zeichen des zeichensatzes werden in zufälliger reihenfolge neu angeordnet und als schlüssel benutzt.

Code: Alles auswählen

--> schlüssel: 'yx\le548wgnab9rso6,t;-~2fjqu=)0_1i+.:3pm7z[]hc@vd#(?k
ein text string in gleicher länge bestehend aus zufällig angeordneten _,i,v,x,l wird an den schlüssel angehängt.

Code: Alles auswählen

--> schlüssel: 'yx\le548wgnab9rso6,t;-~2fjqu=)0_1i+.:3pm7z[]hc@vd#(?klxvlv_lvxvx___ilvllivi__xxii_lxlxi_li__vxiiillixi__v_i
zuordnung durch schlüssel:
der schlüssel wird in 2 gleich große teile geteilt teil a und teil b

Code: Alles auswählen

--> teil a:'yx\le548wgnab9rso6,t;-~2fjqu=)0_1i+.:3pm7z[]hc@vd#(?k
--> teil b:lxvlv_lvxvx___ilvllivi__xxii_lxlxi_li__vxiiillixi__v_i
jedes zeichen aus teil a erhält seinen wert durch die stelle an der es steht weniger 1 und entspricht derselben stelle aus teil b

Code: Alles auswählen

--> ' hat den wert 0 und entspricht l
--> y hat den wert 1 und entspricht x
--> x hat den wert 2 und entspricht v
--> ...
--> ( hat den wert 51 und entspricht v
--> ? hat den wert 52 und entspricht _
--> k hat den wert 53 und entspricht i
verschlüsselung:
klartext: ich
wir nehmen das letzte zeichen des verschlüsselten textes, wenn kein zeichen im verschlüsselten text steht wird ein zufälliges zeichen als startwert bestimmt,

Code: Alles auswählen

-->'=0
und addieren den wert des aktuell zu bearbeitenden zeichens im klartext.

Code: Alles auswählen

-->'=0 i=34 0+34=34
wenn der errechnete wert größer dem wert der halben länge des schlüssels weniger 1 ist wird der wert der halben länge des schlüssels vom errechneten wert subtrahiert.

Code: Alles auswählen

-->34=i
das so errechnete zeichen wird an den verschlüsselten text angehängt und wir beginnen von vorne bis kein zeichen mehr zu verschlüsseln ist.

Code: Alles auswählen

-->verschlüsselter text: 'i
-->i=34 c=46 34+46=80 80-54=26 26=j
-->verschlüsselter text: 'ij
-->j=26 h=45 26+45=71 71-54=17 17=o
-->verschlüsselter text: 'ijo
nachdem der text einmal verschlüsselt wurde durchläuft er die verschlüsselung 2 weitere male.

Code: Alles auswählen

-->verschlüsselter text: eepnu
-->verschlüsselter text: .7c0zs
jetzt wird der wert jedes zeichens des verschlüsselten textes als römische ziffer dargestellt und ein _ angehängt eine 0 wird als _ dargestellt.

Code: Alles auswählen

-->.=36=xxxvi_ 7=41=xli_ c=46=xlvi_ 0=31=xxxi_ z=42=xlii_ s=16=xvi_
-->verschlüsselter text: xxxvi_xli_xlvi_xxxi_xlii_xvi_
nun wird jedes zeichen des so erhaltenen textes einem zufälligen zeichen welches ihm entspricht zugeordnet.

Code: Alles auswählen

-->_=enab-~ui:3d#? i=9,;jq1.7z[cvk v=xl4wstp( x=y8g2f)_m@ l='\5ro6=0+]h
-->verschlüsselter text: 2y2wj:26v:y=xka@2mza_=q1#gl.b
der so erhaltene text wird nun 3 weitere male nach der ersten methode verschlüsselt.

Code: Alles auswählen

-->verschlüsselter text: k~2v\=a.'v0_4w8tb:~n~y)\._zcu7
-->verschlüsselter text: ;t[b4gp(11ql.[?5jp-hxfjxe7,4kq9
-->verschlüsselter text: 5q@.dxa(vq51:,85a3~h.3w+:z=vy'q7
entschlüsselung:
verschlüsselter text: 5q@.dxa(vq51:,85a3~h.3w+:z=vy'q7
wir nehmen den wert des ersten zeichens aus dem verschlüsselten text und ziehen ihn vom wert des zweiten zeichens ab.

Code: Alles auswählen

--> 5=6 q=27 27-6=21
wenn der errechnete wert kleiner 0 ist wird der wert der halben länge des schlüssels addiert.

Code: Alles auswählen

--> 21=;
--> klartext: ;
das so errechnete zeichen wird an den klartext angehängt und wir beginnen von vorne bis kein zeichen mehr zu entschlüsseln ist.

Code: Alles auswählen

--> q=27 @=47 47-27=20 20=t
--> klartext: ;t
--> @=47 .=36 36-47=-11 -11+54=43 43=[
--> klartext: ;t[
...
--> '=0  q=27 27-0=27 27=q
--> klartext: ;t[b4gp(11ql.[?5jp-hxfjxe7,4kq
--> q=27 7=41 41-26=14 14=9
--> klartext: ;t[b4gp(11ql.[?5jp-hxfjxe7,4kq9
nachdem der text einmal entschlüsselt wurde durchläuft er die entschlüsselung 2 weitere male.

Code: Alles auswählen

--> klartext: k~2v\=a.'v0_4w8tb:~n~y)\._zcu7
--> klartext: 2y2wj:26v:y=xka@2mza_=q1#gl.b
nun wird der so erhaltene klartext dem entsprechenden zeichen aus schlüsselteil b zugeordnet.

Code: Alles auswählen

--> klartext: xxxvi_xli_xlvi_xxxi_xlii_xvi_
jetzt wird die so dargestellte folge römischer zahlen als werte betrachtet und in die entsprechenden zeichen umgeschrieben.

Code: Alles auswählen

--> xxxvi_=36=. xli_=41=7 xlvi_=46=c xxxi_=31=0 xlii_=42=z xvi_=16=s
--> klartext: .7c0zs
der so erhaltene text wird nun 3 weitere male nach der ersten methode entschlüsselt.

Code: Alles auswählen

--> klartext: eepnu
--> klartext: 'ijo
--> klartext: ich
folgende nachrichten sind im klartext und verschlüsselt bekannt:

Code: Alles auswählen

CLEAR:    bin_gleich_da
CHIFFRE:  2ru:x0asf70asrqj9~]jwqrh-lfqo(7]4jb,.if\:0:v1,w;-?qd0gd,v.ntg@a:icayk@c]6sy@
CLEAR:    sehr_gut._ich_mach_mich_fertig.
CHIFFRE:  zcs;:n7l=o3,]k-\k:_149+[(?iv)k+2e72u1:=z)a3qadh][9iwi3t;rssnk)x4or,:nd,mu(,clmwzsb1,i+-q.16:0#)std;_9dioc)_9u(#@180p@](,lqdvcl[4hbyargh@3=iumle9jhib)1x8i
CLEAR:    10min_wird_es_wohl_noch_dauern...;)
CHIFFRE:  ~]h5s?cv~758~x9pe@5b_r:@dmh\f?on+[2w7~@bqtxj0n0[q\pjp;)31gl##qv0?qz4bv:.-azvddf'c#3~(h]bmwy.024+-lkqh(3sp-.91o@wk1o-m)3w-1]9#\e6ys8qe9+@wpb[;4l5n1co(ubhhs(qxb6d6k)e0d-ve)j4wit6xv
CLEAR:    ok._dann_in_10._=)
CHIFFRE:  7d8s\'a(g5wfe=qni;cvb~774+)gd54e_@5bpsk[dhsx~'c,t;:#0rbi7#.])3'8y3dm#,.:y1z:=''w2fb?e\kn(=2nb)xo_b_t.9;
kann man daraus den schlüssel errechnen? wie würdet ihr vorgehen? auf frequenzen und häufigkeiten hin erscheint mir die geschichte auf den ersten blick unanfällig. aber irgendwo muss doch eine möglichkeit bestehen das ganze ohne schlüssel zu knacken oder irre ich mich da?

wedgy
Beiträge: 5
Registriert: Do Mär 12, 2020 5:36 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von wedgy » Do Mär 12, 2020 6:11 pm

immernoch keine antwort. vielleicht hilft das folgende batchscript um die vorgestellten algorithmen zu testen.
legt einen benutzernamen an. gebt mindestens ein passwort (minimum 8 stellen) ein. mit exit beendet ihr den ersten passphrase.
gebt dann mindestens ein weiteres passwort (minimum 8 stellen) ein. mit exit beendet ihr den zweiten passphrase.
nun einloggen, dabei aber zuerst den zweiten passphrase eingeben und mit exit beenden nun den zweiten passphrase.
nach dem erfolgreichen login könnt ihr textdateien aus dem ordner text in textdateien in den ordner crpt verschlüsseln.
dazu müssen sowohl quelldatei und zieldatei schon existieren. die zieldatei kann dabei leer sein. umgekehrt ist es möglich
textdateien aus dem ordner crpt in textdateien in den ordner text zu verschlüsseln.
in euren textdateien könnt ihr nur die in eurem schlüssel enthaltenen zeichen verwenden, bei programmstart die folgenden:

Code: Alles auswählen

abcdefghijklmnopqrstuvwxyz_0123456789.?,;'-+:()[]~#\@üäèïîìÄÅÉæÆôöòûùÜø£ƒáóúñªº¿®¬½¼¡«»ÁÂÀ©¢Ã¤ÐÊËÈÍÎÏ̯ßõÕþÚÛÙýÝ´­±¾§¸°¨¹³²
wenn ihr einen kürzeren schlüssel erzeugt dann besteht er immer aus den n ersten zeichen dieser zeichenfolge.

so ich hoffe das hilft beim testen der problematik. :geek:
auf antworten wird sehnsüchtig gewartet... aber als proof of concept sollte das wohl reichen =)

Code: Alles auswählen

@echo off
 mode 89,19
 mode con cp select=850> nul
 set title=LOKI v.0.1.alfa
 title %title%
 color 0a
 goto start
::FUNCTIONS:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::convert decimal number (0-3999) into roman number:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrmn
 if %1 equ 0 set output=__&& goto:eof
 if %1 gtr 3999 set output=ERROR1:gtrmn&& goto :eof
 if %1 lss 0 set output=ERROR2:gtrmn&& goto :eof
 set cnt0=-1
 set cnt1=
 set prm1=%1
 set output=_
:gtrmn0
 set /a cnt1=%cnt0%*-1-1
 if %cnt0% equ -1 set rmnc1=i&& set rmnc2=v&& set rmnc3=x
 if %cnt0% equ -2 set rmnc1=x&& set rmnc2=l&& set rmnc3=c
 if %cnt0% equ -3 set rmnc1=c&& set rmnc2=d&& set rmnc3=m
 if %cnt0% equ -4 set rmnc1=m&& set rmnc2=q&& set rmnc3=t
 if "!prm1:~%cnt1%,1!"=="" goto :eof
 if "!prm1:~%cnt0%,1!"=="0" set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="1" set output=%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="2" set output=%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="3" set output=%rmnc1%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="4" set output=%rmnc1%%rmnc2%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="5" set output=%rmnc2%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="6" set output=%rmnc2%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="7" set output=%rmnc2%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="8" set output=%rmnc2%%rmnc1%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="9" set output=%rmnc1%%rmnc3%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 set output =ERROR0:gtrmn&& goto :eof
::convert roman number (_-mmmcmxcix) into decimal number::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtdcm
 set prm1=%1
 if not "%prm1:~-1%"=="_" set output=ERROR1:gtdcm&& goto :eof
 if "%prm1%"=="__" set output=0&& goto :eof
 set cnt0=0
 set prm1=!prm1:~0,-1!
 set output=
:gtdcm0
 if %cnt0% equ 0 set rmnc1=i&& set rmnc2=v&& set rmnc3=x
 if %cnt0% equ 1 set rmnc1=x&& set rmnc2=l&& set rmnc3=c
 if %cnt0% equ 2 set rmnc1=c&& set rmnc2=d&& set rmnc3=m
 if %cnt0% equ 3 set rmnc1=m&& set rmnc2=q&& set rmnc3=t
 if "%prm1%"=="" set prm1=%1&& goto :eof
 if "%prm1:~-4%"=="%rmnc2%%rmnc1%%rmnc1%%rmnc1%" set output=8%output%&& set prm1=%prm1:~0,-4%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-3%"=="%rmnc2%%rmnc1%%rmnc1%" set output=7%output%&& set prm1=%prm1:~0,-3%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-3%"=="%rmnc1%%rmnc1%%rmnc1%" set output=3%output%&& set prm1=%prm1:~0,-3%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc3%" set output=9%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc2%%rmnc1%" set output=6%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc2%" set output=4%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc1%" set output=2%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-1%"=="%rmnc2%" set output=5%output%&& set prm1=%prm1:~0,-1%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-1%"=="%rmnc1%" set output=1%output%&& set prm1=%prm1:~0,-1%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if not %cnt0% geq 3 set output=0%output%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 set output=ERROR0:gtdcm&& goto :eof
::check keystring (length, parts, double characters, known characters, known roman digits)::::::::::::::::::::::::::::::::::::::::::::::::::
:chkks
 if "%rootkey%"=="" set output=ERROR1:chkks&& goto :eof
 set prm1=%rootkey%
 set cnt0=0
 set output=
:chkks0
 title %title% check length %cnt0% done
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :chkks0
 if not %cnt0% geq 54 set output=ERROR2:chkks&& goto :eof
 title %title% check mod 2
 set /a cnt1=%cnt0%%%2
 if not %cnt1% equ 0 set output=ERROR3:chkks&& goto :eof
 set /a cnt0=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt0%!
 set prm1h2=!prm1:~-%cnt0%!
 set cnt0=0
 set cnt1=1
:chkks1
 title %title% check double characters %cnt0%[!prm1h1:~%cnt0%,1!] %cnt1%[!prm1h1:~%cnt1%,1!]
 if "!prm1h1:~%cnt0%,1!"=="!prm1h1:~%cnt1%,1!" set output=ERROR4:chkks %cnt0% %cnt1%&& goto :eof
 set /a cnt1=%cnt1%+1
 if "!prm1h1:~%cnt1%,1!"=="" set /a cnt1=%cnt0%+2&& set /a cnt0=%cnt0%+1
 if "!prm1h1:~%cnt1%,1!"=="" goto :chkks2
 goto chkks1
:chkks2
 set cnt0=0
 attrib -h -s -r check.log
:chkks2a
 title %title% check known characters %cnt0% done
 if "!prm1h1:~%cnt0%,1!"=="" goto :chkks2b
 find /c "!prm1h1:~%cnt0%,1!" data/charset.log> check.log
 for /f "tokens=2 delims=:" %%a in (check.log) do set cnt1=%%a
 if  %cnt1:~1,1% equ 0 set output=ERROR5:chkks !prm1h1:~%cnt0%,1!&& goto :eof
 set /a cnt0=%cnt0%+1&& goto :chkks2a
:chkks2b
 attrib +h +s +r check.log
 set cnt0=0
 set chk_=0
 set chki=0
 set chkv=0
 set chkx=0
 set chkl=0
 set chkc=0
:chkks3
 title %title% check known roman digits %cnt0% done
 if not "!prm1h2:~%cnt0%,1!"=="_" if not "!prm1h2:~%cnt0%,1!"=="i" if not "!prm1h2:~%cnt0%,1!"=="v" if not "!prm1h2:~%cnt0%,1!"=="x" if not "!prm1h2:~%cnt0%,1!"=="l" if not "!prm1h2:~%cnt0%,1!"=="c" set output=ERROR6:chkks !prm1h2:~%cnt0%,1! %cnt0%&& goto :eof
 if "!prm1h2:~%cnt0%,1!"=="_" set /a chk_=%chk_%+1
 if "!prm1h2:~%cnt0%,1!"=="i" set /a chki=%chki%+1
 if "!prm1h2:~%cnt0%,1!"=="v" set /a chkv=%chkv%+1
 if "!prm1h2:~%cnt0%,1!"=="x" set /a chkx=%chkx%+1
 if "!prm1h2:~%cnt0%,1!"=="l" set /a chkl=%chkl%+1
 if "!prm1h2:~%cnt0%,1!"=="c" set /a chkc=%chkc%+1
 set /a cnt0=%cnt0%+1
 if "!prm1h2:~%cnt0%,1!"=="" goto :chkks4
:: if "!prm1h2:~%cnt0%,1!"=="" goto :chkks5
 goto :chkks3
:chkks4
 title %title% check count of roman digits
 if %chk_% lss 4 set output=ERROR7:chkks _ %chk_%&& goto :eof
 if %chki% lss 4 set output=ERROR7:chkks i %chki%&& goto :eof
 if %chkv% lss 4 set output=ERROR7:chkks v %chkv%&& goto :eof
 if %chkx% lss 4 set output=ERROR7:chkks x %chkx%&& goto :eof
 if %cnt0% geq 43 if %chkl% lss 4 set output=ERROR7:chkks l %chkl%&& goto :eof
 if %cnt0% geq 93 if %chkc% lss 4 set output=ERROR7:chkks c %chkc%&& goto :eof
 title %title%
 set output=ERROR0:chkks&& goto :eof
::generate random key:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrdm
 if "%gtrdm%"=="" set output=ERROR1:gtrdm&& goto :eof
 set prm1=%gtrdm%
 set cnt0=0
 set cnt1=
 set output=
:gtrdm0
 title %title% caesars salad prescan %cnt0% done
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :gtrdm0
 set /a cnt0=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt0%!
 set prm1h2=!prm1:~%cnt0%!
 set cnt1=%cnt0%
 set hlp1=
 set hlp2=
 set hlp3=
:gtrdm1
 title %title% caesars salad mixing A %cnt1% left
 set /a hlp1=%random%%%cnt1%
 set /a hlp2=%hlp1%+1
 set /a cnt1=%cnt1%-1
 set hlp3=%hlp3%!prm1h1:~%hlp1%,1!&& set prm1h1=!prm1h1:~0,%hlp1%!!prm1h1:~%hlp2%!
 if not %cnt1% equ 1 goto :gtrdm1
 set output=%hlp3%%prm1h1%
 set cnt1=%cnt0%
 set hlp1=
 set hlp2=
 set hlp3=
:gtrdm2
 title %title% caesars salad mixing B %cnt1% left
 set /a hlp1=%random%%%cnt1%
 set /a hlp2=%hlp1%+1
 set /a cnt1=%cnt1%-1
 set hlp3=%hlp3%!prm1h2:~%hlp1%,1!&& set prm1h2=!prm1h2:~0,%hlp1%!!prm1h2:~%hlp2%!
 if not %cnt1% equ 1 goto :gtrdm2
 set output=%output%%hlp3%%prm1h2%&& set prm1h1=!prm1:~0,%cnt0%!&& set prm1h2=!prm1:~%cnt0%!&& title %title%&& goto :eof
 set output=ERROR0:gtrdm&& goto :eof
::set key values::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:stkvl
 if "%rootkey%"=="" set output=ERROR1:stkvl&& goto:eof
 set prm1=%rootkey%
 set cnt0=0
 set output=
 set rmncnt_=0
 set rmncnti=0
 set rmncntv=0
 set rmncntx=0
 set rmncntl=0
 set rmncntc=0
:stkvl0
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :stkvl0
 set /a cnt1=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt1%!
 set prm1h2=!prm1:~%cnt1%!
 set cnt0=0
 for %%a in (rome_ romei romev romex romel) do set %%a=
:stkvl1
 title=%title% set key values: !prm1h1:~%cnt0%,1! = %cnt0% ^| !prm1h1:~%cnt0%,1! = !prm1h2:~%cnt0%,1!
 if "!prm1h1:~%cnt0%,1!"=="" goto :stkvl2
 set val_%cnt0%=!prm1h1:~%cnt0%,1!
 set chr_!prm1h1:~%cnt0%,1!=%cnt0%
 if "!prm1h2:~%cnt0%,1!"=="_" set rome_=%rome_%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=_&& set /a rmncnt_=%rmncnt_%+1
 if "!prm1h2:~%cnt0%,1!"=="i" set romei=%romei%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=i&& set /a rmncnti=%rmncnti%+1
 if "!prm1h2:~%cnt0%,1!"=="v" set romev=%romev%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=v&& set /a rmncntv=%rmncntv%+1
 if "!prm1h2:~%cnt0%,1!"=="x" set romex=%romex%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=x&& set /a rmncntx=%rmncntx%+1
 if "!prm1h2:~%cnt0%,1!"=="l" set romel=%romel%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=l&& set /a rmncntl=%rmncntl%+1
 if "!prm1h2:~%cnt0%,1!"=="c" set romec=%romec%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=c&& set /a rmncntc=%rmncntc%+1
 set /a cnt0=%cnt0%+1&& goto :stkvl1
:stkvl2
 set klngth=%cnt0%
 title %title%
 set output=ERROR0:vgnrk&& goto :eof
::modified vigenere shift:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:vgnrk
 if "%rootkey%"=="" set output=ERROR1:vgnrk&& goto :eof
 if "%klngth%"=="" set output=ERROR2:vgnrk&& goto :eof
 set prm1=%rootkey%
 set prm1h1=!prm1:~0,%klngth%!
 set prm1h2=!prm1:~-%klngth%!
 set prm2=%1
 if "%prm2:~7,1%"=="" set output=ERROR3:vgnrk&& goto :eof
 set cnt0=0
 set cnt1=0
 set cnt2=
 set cnt3=
 set cnt4=
 set output=
 set hlp1=
 set nks1=                                                                                                                           %
 set nks2=                                                                                                                           %
 set nks1=!nks1:~0,%klngth%!
 set nks2=!nks2:~0,%klngth%!
:vgnrk0
 title %title% vigenere shift !prm1h1:~%cnt0%,1! ^> !prm2:~%cnt1%,1! ^| !prm2:~%cnt1%,1! ^< !prm1h2:~%cnt0%,1!
 if "!prm1h1:~%cnt0%,1!"=="" goto :vgnrk3
 if "!prm2:~%cnt1%,1!"=="" set cnt1=0
 set hlp1=!prm1h2:~%cnt1%,1!
 set cnt2=!chr_%hlp1%!
 set /a cnt3=%cnt0%+%cnt2%
:vgnrk1
 if %cnt3% geq %klngth% set /a cnt3=%cnt3%-%klngth%
 if not "!nks1:~%cnt3%,1!"==" " set /a cnt3=%cnt3%+1&& goto :vgnrk1
 set /a cnt4=%cnt3%+1
 set nks1=!nks1:~0,%cnt3%!!prm1h1:~%cnt0%,1!!nks1:~%cnt4%!
 set /a cnt3=%cnt0%-%cnt2%
:vgnrk2
 if %cnt3% lss 0 set /a cnt3=%cnt3%+%klngth%
 if not "!nks2:~%cnt3%,1!"==" " set /a cnt3=%cnt3%-1&& goto :vgnrk2
 set /a cnt4=%cnt3%+1
 set nks2=!nks2:~0,%cnt3%!!prm1h2:~%cnt0%,1!!nks2:~%cnt4%!
 set /a cnt0=%cnt0%+1
 set /a cnt1=%cnt1%+1
 goto :vgnrk0
:vgnrk3
 title %title%
 set output=%nks1%%nks2%&& goto :eof
 set output=ERROR0:vgnrk&& goto :eof
::encryption method 1 advanced caesar:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ncrpt
 if "%ncrpt%"=="" set output=ERROR1:ncrpt&& goto :eof
 if "%rootkey%"=="" set output=ERROR2:ncrpt&& goto :eof
 if "%klngth%"=="" set output=ERROR3:ncrpt&& goto :eof
 set prm1=%ncrpt%
 set  cnt0=0
 set /a hlp1=%random%%%klngth%
 set hlp2=
 set hlp3=
 set output=!val_%hlp1%!
:ncrpt0
 title %title% encryption advanced caesar [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 set hlp1=%output:~-1%
 set hlp2=!chr_%hlp1%!
 set hlp1=!prm1:~%cnt0%,1!
 set hlp3=!chr_%hlp1%!
 set /a cnt1=%hlp2%+%hlp3%
 if %cnt1% geq %klngth% set /a cnt1=%cnt1%-%klngth%
 set output=%output%!val_%cnt1%!
 set /a cnt0=%cnt0%+1
 goto :ncrpt0
 set output=ERROR0:ncrpt&& title %title%&& goto :eof
::decryption method 1 advanced caesar:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:dcrpt
 if "%dcrpt%"=="" set output=ERROR1:dcrpt&& goto :eof
 if "%rootkey%"=="" set output=ERROR2:dcrpt&& goto :eof
 if "%klngth%"=="" set output=ERROR3:dcrpt&& goto :eof
 set prm1=%dcrpt%
 set cnt0=0
 set cnt1=
 set hlp1=
 set hlp2=
 set hlp3=
 set output=
:dcrpt0
 title %title% decryption advanced caesar [%cnt0%]
 set /a cnt1=%cnt0%+1
 if "!prm1:~%cnt1%,1!"=="" title %title%&& goto :eof
 set hlp1=!dcrpt:~%cnt0%,1!
 set hlp2=!chr_%hlp1%!
 set hlp1=!dcrpt:~%cnt1%,1!
 set hlp3=!chr_%hlp1%!
 set /a hlp1=%hlp3%-%hlp2%
 if %hlp1% lss 0 set /a hlp1=%hlp1%+%klngth%
 set output=%output%!val_%hlp1%!
 set /a cnt0=%cnt0%+1
 goto :dcrpt0
 set output=ERROR0:dcrpt&& title %title%&& goto :eof
::encryption method 2 home rome:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrnc
 if "%gtrnc%"=="" set output=ERROR1:gtrnc&& goto:eof
 if "%klngth%"=="" set output=ERROR2:gtrnc&& goto:eof
 set prm1=%gtrnc%
 set cnt0=0
 set cnt1=
 set hlp1=
 set hlp2=
 set output=
:gtrnc0
 title %title% encryption home rome [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 if not "!prm1:~%cnt0%,1!"=="_" if not "!prm1:~%cnt0%,1!"=="i" if not "!prm1:~%cnt0%,1!"=="v" if not "!prm1:~%cnt0%,1!"=="x" if not "!prm1:~%cnt0%,1!"=="l" if not "!prm1:~%cnt0%,1!"=="c" set output=ERROR1:gtrnc&& goto :eof
 set hlp1=!prm1:~%cnt0%,1!
 set /a cnt1=%random%%%!rmncnt%hlp1%!
 set hlp2=!rome%hlp1%!
 set output=%output%!hlp2:~%cnt1%,1!
 set /a cnt0=%cnt0%+1
 goto :gtrnc0
 set output=ERROR0:gtrnc&& title %title%&& goto :eof
::decryption method 2 home rome:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrdc
 if "%gtrdc%"=="" set output=ERROR1:gtrdc&& goto:eof
 if "%klngth%"=="" set output=ERROR2:gtrdc&& goto:eof
 set prm1=%gtrdc%
 set cnt0=0
 set hlp1=
 set output=
:gtrdc0
 title %title% decryption home rome [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 set hlp1=!prm1:~%cnt0%,1!
 set output=%output%!rom%hlp1%!
 set /a cnt0=%cnt0%+1
 goto :gtrdc0
 set output=ERROR0:gtrdc&& goto :eof
::encryption method 2 home rome base::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrms
 if "%gtrms%"=="" set output=ERROR1:gtrms&& goto :eof
 set mprm1=%gtrms%
 set mcnt0=0
 set moutput=
 set mhlp1=
:gtrms0
 title %title% encryption home rome base [%mcnt0%]
 if "!mprm1:~%mcnt0%,1!"=="" goto :gtrms1
 set mhlp1=!mprm1:~%mcnt0%,1!
 set mhlp1=!chr_%mhlp1%!
 call :gtrmn %mhlp1%
 set moutput=%moutput%%output%
 set /a mcnt0=%mcnt0%+1
 goto :gtrms0
:gtrms1
 title %title%
 set output=%moutput%
 if "%output%"=="" set output=ERROR0:gtrms&& goto :eof
 goto :eof
::decryption method 2 home rome base::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtchs
 if "%gtchs%"=="" set output=ERROR1:gtchs&& goto :eof
 set mprm1=%gtchs%
 set mcnt0=0
 set mcnt1=1
 set moutput=
 set mhlp1=
:gtchs0
 title %title% decryption home rome base [%mcnt0%]
 if "!mprm1:~%mcnt0%,1!"=="" goto :gtchs2
 if "!mprm1:~%mcnt0%,1!"=="_" if not "%mhlp1%"=="" set mhlp1=%mhlp1%!mprm1:~%mcnt0%,1!&& goto :gtchs1
 set mhlp1=%mhlp1%!mprm1:~%mcnt0%,1!
:: if "!mprm1:~%mcnt0%,1!"=="_" if "!mprm1:~%mcnt1%,1!"=="_" if not "!mprm1:~%mcnt1%,2!"=="__" set mhlp1=__&& set/a mcnt0=%mcnt0%+1&& goto :gtchs1
:: if "!mprm1:~%mcnt0%,1!"=="_" if not "!mprm1:~%mcnt1%,1!"=="_" goto :gtchs1
:: if "!mprm1:~%mcnt0%,1!"=="_" if "!mprm1:~%mcnt1%,2!"=="__" goto :gtchs1
 set /a mcnt0=%mcnt0%+1
 set /a mcnt1=%mcnt0%+1
 goto :gtchs0
:gtchs1
:: echo %mhlp1%
 call :gtdcm %mhlp1%
 set mhlp1=%output%
 set mhlp1=!val_%mhlp1%!
 set moutput=%moutput%%mhlp1%
 set mhlp1=
 set /a mcnt0=%mcnt0%+1
 set /a mcnt1=%mcnt0%+1
 goto :gtchs0
:gtchs2
 title %title%
 set output=%moutput%
 if "%output%"=="" set output=ERROR0:gtchs&& goto :eof
 goto :eof
::set default rootkey:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtdft
 set rootchr=abcdefghijklmnopqrstuvwxyz_0123456789.?,;'-+:()[]~#\@üäèïîìÄÅÉæÆôöòûùÜø£ƒáóúñªº¿®¬½¼¡«»ÁÂÀ©¢Ã¤ÐÊËÈÍÎÏ̯ßõÕþÚÛÙýÝ´­±¾§¸°¨¹³²
 set rootrmn=_iv_iv_ivx_ix_ix_ivx_ivx_ivx_ivx_ivx_ixllll_ivxl_ivxl_ixl_ixl_ixl_ixl_ixl_ixl_ix_ivx_ivx_cccc_ivxc_ixc_ivxc_ixc_ivxc_ixc_ix
 set rootkey=%rootchr%%rootrmn%
 set klngth=123
 goto :eof
::set keylength:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:sklngt
 if "%1"=="" set output=ERROR1:sklngt&& goto :eof
 if %1 lss 27 set output=ERROR2:sklngt&& goto :eof
 if %1 gtr 123 set output=ERROR3:sklngt&& goto :eof
 set cnt0=%1
 call :gtdft
 set sklngt=!rootchr:~0,%cnt0%!!rootrmn:~0,%cnt0%!
 set output=ERROR0:sklngth&& goto :eof
::create account::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:acccrt
 call :gtdft
 call :stkvl
 call :mltpl
 if not "%acccrt%"==""  set gtrdm=%acccrt%
 if "%acccrt%"==""  set gtrdm=%rootkey%
 call :gtrdm
 if not "%acccrt%"==""  set ghlp1=%output%
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :gtdft
 call :stkvl
 call :mltpl
 call :ncrpt
 echo %output%> user/%name%.log
 call :gtdft
 call :stkvl
 goto :eof
::multiple passwords::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:mltpl
 cls
 set /p psswrd=password: %
:: if "%psswrd%"=="exit"  goto :eof
 if "%psswrd:~7,1%"=="" goto :mltpl
 call :vgnrk %psswrd%
 set rootkey=%output%
 call :stkvl
:mltpl0
 cls
 set /p psswrd=add more: %
 if "%psswrd%"=="exit"  goto :eof
 if "%psswrd:~7,1%"=="" goto :mltpl0
 call :vgnrk %psswrd%
 set rootkey=%output%
 call :stkvl
 goto :mltpl0
::encipher textfile:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ncphr
 if "%ncphr%"=="" set output=ERROR1:ncphr&& goto :eof
 if "%1"=="" set output=ERROR2:ncphr&& goto :eof
 set ncrpt=%ncphr%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set gtrms=%output%
 call :gtrms
 set gtrnc=%output%
 call :gtrnc
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 echo %output%>> crpt/%1.txt
 goto :eof
::decipher textfile:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:dcphr
 if "%dcphr%"=="" set output=ERROR1:dcphr&& goto :eof
 if "%1"=="" set output=ERROR2:dcphr&& goto :eof
 set dcrpt=%dcphr%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set gtrdc=%output%
 call :gtrdc
 set gtchs=%output%
 call :gtchs
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 echo %output%>> text/%1.txt
 goto :eof
::helpfile::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:help
 cls
 echo LOKI is a batchscript for encrypting and decrypting textfiles.
 echo.
 echo LOKI uses passphrases instead of a password for the login.
 echo each passphrase consists of at least 1 up to n passwords.
 echo.
 echo when setup an account, LOKI will first ask for passphrase A, afterwards for passphrase B
 echo if you want to login you have to enter first passphrase B, afterwards passphrase A
 echo.
 echo LOKI allows the following characters in a textfile to work with:
 echo.
 echo abcdefghijklmnopqrstuvwxyz_0123456789.?,;'-+:()[]~
 echo #\@üäèïîìÄÅÉæÆôöòûùÜø£ƒáóúñªº¿®¬½¼¡«»ÁÂÀ©¢Ã¤ÐÊËÈÍÎ
 echo Ï̯ßõÕþÚÛÙýÝ´­±¾§¸°¨¹³²
 echo.
 echo this means LOKI also understands no "SPACE".
 echo if using any other characters than the allowed ones may crash LOKI.
 pause> nul&& goto :eof
::LOGIC:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::proof setlocal, operating system, cmd version, needed folders, needed files:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:start
 if not exist crpt md crpt
 if not exist data md data
 if not exist text md text
 if not exist user md user
 if not exist check.log echo _> check.log&& attrib +h +s +r check.log
 setlocal ENABLEEXTENSIONS
 cls
 if not "%ERRORLEVEL%"=="0" echo extensions not available&&echo programm shutting down&& pause> nul&& goto :eof
 setlocal enabledelayedexpansion
 cls
 if not "%ERRORLEVEL%"=="0" echo delayed expansion not available&&echo programm shutting down&& pause> nul&& goto :eof
 if not "%CMDEXTVERSION%"=="2" echo command extensions version not guilty.&& echo program maybe not working&& pause> nul
 wmic os get caption, OSArchitecture> data/winvrs.log
 attrib -r -s -h data/charset.log
 find /i /c "Microsoft Windows 10" data/winvrs.log> data/charset.log
 for /f "tokens=3" %%a in (data/charset.log) do set hlp1=%%a
 if not "%hlp1%"=="1" echo windows version not guilty.&& echo program maybe not working&& pause> nul
 set hlp1=
 call :gtdft
 echo %rootchr%> data/charset.log&& attrib +r +s +h data/charset.log
 call :stkvl
:restart
::login procedure:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 cls
 echo "exit" shutdown program
 echo "help" help
 set /p name=account: %
 if "%name%"=="exit" endlocal&& goto :eof
 if "%name%"=="help" call :help
 if "%name%"=="help" goto :restart
 if not exist user/%name%.log (
 echo account not found. want to create [%name%]?
 choice
 if !ERRORLEVEL! equ 1 call :acccrt
 goto :restart
 )
 call :mltpl
 set /p dcrpt=< user/%name%.log
 call :dcrpt
 set dcrpt=%output%
 call :gtdft
 call :stkvl
 call :mltpl
 call :dcrpt
 set rootkey=%output%
 call :chkks
 if not "%output%"=="ERROR0:chkks" call :gtdft&& call :stkvl&& goto restart
 set title=%title% ---- account: [%name%]%
 title %title%
 call :stkvl
 cls
 echo login successful
 echo 
 pause> nul
::choose task:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:restart0
 cls
 echo encrypt [1], decrypt [2], set new keylength [3], exit [4]
 choice /c 1234
 if "%ERRORLEVEL%"=="1" (
:rst0e1
 cls
 set /p uhlp1=source: %
 if "!uhlp1!"=="" goto :rst0e1
 if not exist text/!uhlp1!.txt goto :rst0e1
:rst0e1a
 cls
 set /p uhlp2=destination: %
 if "!uhlp2!"=="" goto :rst0e1a
 if not exist crpt/!uhlp2!.txt goto :rst0e1a
 for /f %%a in (text/!uhlp1!.txt) do set ncphr=%%a&& call :ncphr !uhlp2!
 cls
 echo text^/!uhlp1!.txt encrypted to crpt^/!uhlp2!.txt
 echo 
 pause> nul
 goto :restart0
 )
 if "%ERRORLEVEL%"=="2" (
:rst0e2
 cls
 set /p uhlp1=source: %
 if "!uhlp1!"=="" goto :rst0e2
 if not exist crpt/!uhlp1!.txt goto :rst0e2
:rst0e2a
 cls
 set /p uhlp2=destination: %
 if "!uhlp2!"=="" goto :rst0e2a
 if not exist text/!uhlp2!.txt goto :rst0e2a
 for /f %%a in (crpt/!uhlp1!.txt) do set dcphr=%%a&& call :dcphr !uhlp2!
 cls
 echo crpt^/!uhlp1! decrypted to text^/!uhlp2!
 echo 
 pause> nul
 goto :restart0
 )
 if "%ERRORLEVEL%"=="3" (
 cls
 echo set new keylength makes it impossible to decrypt old files
 choice
 if "!ERRORLEVEL!"=="1" (
:rst0e3
 cls
 set /p uhlp1=length: %
 call :sklngt !uhlp1!
 if not "!output!"=="ERROR0:sklngth" goto :rst0e3
 set acccrt=!sklngt!
 call :acccrt 
 set rootkey=!ghlp1!
 call :stkvl
 goto :restart0
 )
 if "!ERRORLEVEL!"=="2" goto :restart0
 )
 if "%ERRORLEVEL%"=="4" endlocal&& goto :eof
 goto :restart0

wedgy
Beiträge: 5
Registriert: Do Mär 12, 2020 5:36 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von wedgy » Do Mär 12, 2020 9:04 pm

achso, die keylength muss bevor man texte verschluesseln kann auf maximal 41 beschränkt werden, sonst bockt das skript rum. liegt an den sonderzeichen etc., ausserdem ist der login wesentlich kürzer. das bau ich denn nochmal um die tage. aber sonst funzt das fluffig. meine frage ist halt nur ob sich die grundlage lohnt um es auf daten anzuwenden.... oder halt schwachstellen zu orten und zu beheben....

nufan
Wiki-Moderator
Beiträge: 2479
Registriert: Sa Jul 05, 2008 3:21 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von nufan » Fr Mär 13, 2020 9:32 am

Hallo wedgy! :)
Ein interessantes, aber komplexes Problem. Ich bin sicher kein Experte in diesem Bereich und kann dir keine eindeutige Antwort bieten, aber ich versuche mal ein paar meiner Gedanken zusammenzufassen.

Mögliche Angriffe hängen auch davon ab, wie viele Informationen man einem Angreifer zugesteht. Ich kann mir vorstellen, dass die Möglichkeit beliebige Daten zu verschlüsseln (ohne den Schlüssel zu kennen), in diesem Fall wertvolle Informationen für Angreifer liefern könnte.
wegdes and brixx hat geschrieben:
Di Feb 25, 2020 1:20 pm
alle zeichen des zeichensatzes werden in zufälliger reihenfolge neu angeordnet und als schlüssel benutzt.
Der Schlüssel besteht aus einer Anordnung einer Untermenge des Zeichensatzes. Das bedeutet du erlaubst hier keine Wiederholungen und schränkst damit die Anzahl an möglichen Schlüsseln ein. Mir ist auch kein modernes Verfahren bekannt, das sich bei der Auswahl des Schlüssels auf druckbare Zeichen beschränkt.
wedgy hat geschrieben:
Do Mär 12, 2020 6:11 pm
wenn ihr einen kürzeren schlüssel erzeugt dann besteht er immer aus den n ersten zeichen dieser zeichenfolge.
Wenn bekannt ist, dass ein Schlüssel der Länge 8 verwendet wird, dann kommt man auf 8! = 40320 mögliche Schlüssel. Das sind ungefähr 2^15 Kombinationen. Zum Vergleich verwendet der aus dem Jahr 1975 stammende DES-Algorithmus bereits 56 Bit Schlüssel, man hat also 2^56 Möglichkeiten. Der zurzeit gängige AES hat eine minimale Länge von 128 Bit (2^128 Möglichkeiten).
wegdes and brixx hat geschrieben:
Di Feb 25, 2020 1:20 pm
jetzt wird der wert jedes zeichens des verschlüsselten textes als römische ziffer dargestellt
Das kommt mir etwas seltsam vor. Du schränkst hier den Zeichensatz deiner Daten vor der finalen Verschlüsselung auf wenige fixe Zeichen ein. Das könnte ein Angriffspunkt sein.

wedgy
Beiträge: 5
Registriert: Do Mär 12, 2020 5:36 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von wedgy » Fr Mär 13, 2020 11:52 am

hi,
danke für die schnelle antwort.
Der Schlüssel besteht aus einer Anordnung einer Untermenge des Zeichensatzes. Das bedeutet du erlaubst hier keine Wiederholungen und schränkst damit die Anzahl an möglichen Schlüsseln ein. Mir ist auch kein modernes Verfahren bekannt, das sich bei der Auswahl des Schlüssels auf druckbare Zeichen beschränkt.
richtig, moderne verfahren laufen auch nicht in der beschränkten kommandozeile. es liegt hier einfach an der sprache. die einschränkung ist eingebaut, damit man zum spass auch kurze schlüssel testen kann. leider sind in dem masterrootkey des skripts noch sonderzeichen drin, welche batch ein bisschen ärgern. in einer richtigen programmiersprache könnte man das system doch auf daten anwenden, was beim einlesen in 32 bit blöcken eine schlüssellänge von (2^32-(exklusive blöcke für datei header, ende, etc..))fakultät*die möglichen kombinationen an römischen ziffern ergeben würde.
Wenn bekannt ist, dass ein Schlüssel der Länge 8 verwendet wird, dann kommt man auf 8! = 40320 mögliche Schlüssel. Das sind ungefähr 2^15 Kombinationen. Zum Vergleich verwendet der aus dem Jahr 1975 stammende DES-Algorithmus bereits 56 Bit Schlüssel, man hat also 2^56 Möglichkeiten. Der zurzeit gängige AES hat eine minimale Länge von 128 Bit (2^128 Möglichkeiten).
kleine verwechslung von passwort und schlüssel. das passwort ist für den user, der schlüssel ist skript intern.
das skript benutzt intern einen schlüssel der alle zeichen unseres zu ver bzw entschlüsselnden textes und eine zuordnung römischer ziffern enthält. dieser muss aber mindestens 27*2 zeichen lang sein. das kann sich natürlich kein mensch merken, weswegen ich einen modifizierten vigenere shift mit 2 passphrases eingebaut habe. dieser verändert den masterrootkey beim login, um dann die userdatei zu entschluesseln. in der userdatei ist der mit dem geshifteten masterrootkey verschlüsselte userkey (mindestens 27*2 zeichen) enthalten. dieser wurde beim anlegen des users oder beim ändern der keylength zufällig erstellt und dann mit dem geshifteten masterrootkey verschlüsselt.
Das kommt mir etwas seltsam vor. Du schränkst hier den Zeichensatz deiner Daten vor der finalen Verschlüsselung auf wenige fixe Zeichen ein. Das könnte ein Angriffspunkt sein.
grundlegend ja, allerdings werden im nächsten schritt diese römischen zahlen ziffer für ziffer in ein zufälliges ihnen zugeordnetes zeichen umgeschrieben. damit ist das ganze wieder hinfällig, denn nun sind wieder alle zeichen des zeichensatzes vorhanden. dieser schritt soll verhindern, dass bei der kryptoanalyse ein rückschluss auf die genaue textlänge möglich ist.


hier nochmal ein kleiner umbau, das läuft vorerst beim login mit dem kürzesten möglichen userkey also einer keylength von 27*2. dass sorgt für einen wesentlich fixeren login. ausserdem hab ich den userkey mal auf 50*2 zeichen maximum beschränkt, damit das skript nicht so bockt und auch paar andere kleinigkeiten. also kann die user schlüssellänge nun zwischen 27*2 und 50*2 gewählt werden...
und wie gesagt, das soll lediglich ein proof of concept sein, ein tatsächliches programm für datenverschlüsselung ist was für menschen die tatsächlich programmieren können und nicht für skripties wie mich ;)

Code: Alles auswählen

@echo off
 mode 89,19
 mode con cp select=850> nul
 set title=LOKI v.0.1.alfa
 title %title%
 color 0a
 goto start
::FUNCTIONS:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::convert decimal number (0-3999) into roman number:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrmn
 if %gtrmn% equ 0 set output=__&& goto:eof
 if %gtrmn% gtr 3999 set output=ERROR1:gtrmn&& goto :eof
 if %gtrmn% lss 0 set output=ERROR2:gtrmn&& goto :eof
 set cnt0=-1
 set cnt1=
 set prm1=%gtrmn%
 set output=_
:gtrmn0
 set /a cnt1=%cnt0%*-1-1
 if %cnt0% equ -1 set rmnc1=i&& set rmnc2=v&& set rmnc3=x
 if %cnt0% equ -2 set rmnc1=x&& set rmnc2=l&& set rmnc3=c
 if %cnt0% equ -3 set rmnc1=c&& set rmnc2=d&& set rmnc3=m
 if %cnt0% equ -4 set rmnc1=m&& set rmnc2=q&& set rmnc3=t
 if "!prm1:~%cnt1%,1!"=="" goto :eof
 if "!prm1:~%cnt0%,1!"=="0" set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="1" set output=%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="2" set output=%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="3" set output=%rmnc1%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="4" set output=%rmnc1%%rmnc2%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="5" set output=%rmnc2%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="6" set output=%rmnc2%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="7" set output=%rmnc2%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="8" set output=%rmnc2%%rmnc1%%rmnc1%%rmnc1%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 if "!prm1:~%cnt0%,1!"=="9" set output=%rmnc1%%rmnc3%%output%&& set /a cnt0=%cnt0%-1&& goto :gtrmn0
 set output =ERROR0:gtrmn&& goto :eof
::convert roman number (_-mmmcmxcix) into decimal number::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtdcm
 set prm1=%gtdcm%
 if not "%prm1:~-1%"=="_" set output=ERROR1:gtdcm&& goto :eof
 if "%prm1%"=="__" set output=0&& goto :eof
 set cnt0=0
 set prm1=!prm1:~0,-1!
 set output=
:gtdcm0
 if %cnt0% equ 0 set rmnc1=i&& set rmnc2=v&& set rmnc3=x
 if %cnt0% equ 1 set rmnc1=x&& set rmnc2=l&& set rmnc3=c
 if %cnt0% equ 2 set rmnc1=c&& set rmnc2=d&& set rmnc3=m
 if %cnt0% equ 3 set rmnc1=m&& set rmnc2=q&& set rmnc3=t
 if "%prm1%"=="" set prm1=%1&& goto :eof
 if "%prm1:~-4%"=="%rmnc2%%rmnc1%%rmnc1%%rmnc1%" set output=8%output%&& set prm1=%prm1:~0,-4%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-3%"=="%rmnc2%%rmnc1%%rmnc1%" set output=7%output%&& set prm1=%prm1:~0,-3%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-3%"=="%rmnc1%%rmnc1%%rmnc1%" set output=3%output%&& set prm1=%prm1:~0,-3%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc3%" set output=9%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc2%%rmnc1%" set output=6%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc2%" set output=4%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-2%"=="%rmnc1%%rmnc1%" set output=2%output%&& set prm1=%prm1:~0,-2%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-1%"=="%rmnc2%" set output=5%output%&& set prm1=%prm1:~0,-1%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if "%prm1:~-1%"=="%rmnc1%" set output=1%output%&& set prm1=%prm1:~0,-1%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 if not %cnt0% geq 3 set output=0%output%&& set /a cnt0=%cnt0%+1&& goto :gtdcm0
 set output=ERROR0:gtdcm&& goto :eof
::check keystring (length, parts, double characters, known characters, known roman digits)::::::::::::::::::::::::::::::::::::::::::::::::::
:chkks
 if "%rootkey%"=="" set output=ERROR1:chkks&& goto :eof
 set prm1=%rootkey%
 set cnt0=0
 set output=
:chkks0
 title %title% check length %cnt0% done
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :chkks0
 if not %cnt0% geq 54 set output=ERROR2:chkks&& goto :eof
 title %title% check mod 2
 set /a cnt1=%cnt0%%%2
 if not %cnt1% equ 0 set output=ERROR3:chkks&& goto :eof
 set /a cnt0=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt0%!
 set prm1h2=!prm1:~-%cnt0%!
 set cnt0=0
 set cnt1=1
:chkks1
 title %title% check double characters %cnt0%[!prm1h1:~%cnt0%,1!] %cnt1%[!prm1h1:~%cnt1%,1!]
 if "!prm1h1:~%cnt0%,1!"=="!prm1h1:~%cnt1%,1!" set output=ERROR4:chkks %cnt0% %cnt1%&& goto :eof
 set /a cnt1=%cnt1%+1
 if "!prm1h1:~%cnt1%,1!"=="" set /a cnt1=%cnt0%+2&& set /a cnt0=%cnt0%+1
 if "!prm1h1:~%cnt1%,1!"=="" goto :chkks2
 goto chkks1
:chkks2
 set cnt0=0
 attrib -h -s -r check.log
:chkks2a
 title %title% check known characters %cnt0% done
 if "!prm1h1:~%cnt0%,1!"=="" goto :chkks2b
 find /c "!prm1h1:~%cnt0%,1!" data/charset.log> check.log
 for /f "tokens=2 delims=:" %%a in (check.log) do set cnt1=%%a
 if  %cnt1:~1,1% equ 0 set output=ERROR5:chkks !prm1h1:~%cnt0%,1!&& goto :eof
 set /a cnt0=%cnt0%+1&& goto :chkks2a
:chkks2b
 attrib +h +s +r check.log
 set cnt0=0
 set chk_=0
 set chki=0
 set chkv=0
 set chkx=0
 set chkl=0
 set chkc=0
:chkks3
 title %title% check known roman digits %cnt0% done
 if not "!prm1h2:~%cnt0%,1!"=="_" if not "!prm1h2:~%cnt0%,1!"=="i" if not "!prm1h2:~%cnt0%,1!"=="v" if not "!prm1h2:~%cnt0%,1!"=="x" if not "!prm1h2:~%cnt0%,1!"=="l" if not "!prm1h2:~%cnt0%,1!"=="c" set output=ERROR6:chkks !prm1h2:~%cnt0%,1! %cnt0%&& goto :eof
 if "!prm1h2:~%cnt0%,1!"=="_" set /a chk_=%chk_%+1
 if "!prm1h2:~%cnt0%,1!"=="i" set /a chki=%chki%+1
 if "!prm1h2:~%cnt0%,1!"=="v" set /a chkv=%chkv%+1
 if "!prm1h2:~%cnt0%,1!"=="x" set /a chkx=%chkx%+1
 if "!prm1h2:~%cnt0%,1!"=="l" set /a chkl=%chkl%+1
 if "!prm1h2:~%cnt0%,1!"=="c" set /a chkc=%chkc%+1
 set /a cnt0=%cnt0%+1
 if "!prm1h2:~%cnt0%,1!"=="" goto :chkks4
:: if "!prm1h2:~%cnt0%,1!"=="" goto :chkks5
 goto :chkks3
:chkks4
 title %title% check count of roman digits
 if %chk_% lss 4 set output=ERROR7:chkks _ %chk_%&& goto :eof
 if %chki% lss 4 set output=ERROR7:chkks i %chki%&& goto :eof
 if %chkv% lss 4 set output=ERROR7:chkks v %chkv%&& goto :eof
 if %chkx% lss 4 set output=ERROR7:chkks x %chkx%&& goto :eof
 if %cnt0% geq 43 if %chkl% lss 4 set output=ERROR7:chkks l %chkl%&& goto :eof
 if %cnt0% geq 93 if %chkc% lss 4 set output=ERROR7:chkks c %chkc%&& goto :eof
 title %title%
 set output=ERROR0:chkks&& goto :eof
::generate random key:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrdm
 if "%gtrdm%"=="" set output=ERROR1:gtrdm&& goto :eof
 set prm1=%gtrdm%
 set cnt0=0
 set cnt1=
 set output=
:gtrdm0
 title %title% caesars salad prescan %cnt0% done
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :gtrdm0
 set /a cnt0=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt0%!
 set prm1h2=!prm1:~%cnt0%!
 set cnt1=%cnt0%
 set hlp1=
 set hlp2=
 set hlp3=
:gtrdm1
 title %title% caesars salad mixing A %cnt1% left
 set /a hlp1=%random%%%cnt1%
 set /a hlp2=%hlp1%+1
 set /a cnt1=%cnt1%-1
 set hlp3=%hlp3%!prm1h1:~%hlp1%,1!&& set prm1h1=!prm1h1:~0,%hlp1%!!prm1h1:~%hlp2%!
 if not %cnt1% equ 1 goto :gtrdm1
 set output=%hlp3%%prm1h1%
 set cnt1=%cnt0%
 set hlp1=
 set hlp2=
 set hlp3=
:gtrdm2
 title %title% caesars salad mixing B %cnt1% left
 set /a hlp1=%random%%%cnt1%
 set /a hlp2=%hlp1%+1
 set /a cnt1=%cnt1%-1
 set hlp3=%hlp3%!prm1h2:~%hlp1%,1!&& set prm1h2=!prm1h2:~0,%hlp1%!!prm1h2:~%hlp2%!
 if not %cnt1% equ 1 goto :gtrdm2
 set output=%output%%hlp3%%prm1h2%&& set prm1h1=!prm1:~0,%cnt0%!&& set prm1h2=!prm1:~%cnt0%!&& title %title%&& goto :eof
 set output=ERROR0:gtrdm&& goto :eof
::set key values::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:stkvl
 if "%rootkey%"=="" set output=ERROR1:stkvl&& goto:eof
 set prm1=%rootkey%
 set cnt0=0
 set output=
 set rmncnt_=0
 set rmncnti=0
 set rmncntv=0
 set rmncntx=0
 set rmncntl=0
 set rmncntc=0
:stkvl0
 if not "!prm1:~%cnt0%,1!"=="" set /a cnt0=%cnt0%+1&& goto :stkvl0
 set /a cnt1=%cnt0%/2
 set prm1h1=!prm1:~0,%cnt1%!
 set prm1h2=!prm1:~%cnt1%!
 set cnt0=0
 for %%a in (rome_ romei romev romex romel) do set %%a=
:stkvl1
 title=%title% set key values: !prm1h1:~%cnt0%,1! = %cnt0% ^| !prm1h1:~%cnt0%,1! = !prm1h2:~%cnt0%,1!
 if "!prm1h1:~%cnt0%,1!"=="" goto :stkvl2
 set val_%cnt0%=!prm1h1:~%cnt0%,1!
 set chr_!prm1h1:~%cnt0%,1!=%cnt0%
 if "!prm1h2:~%cnt0%,1!"=="_" set rome_=%rome_%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=_&& set /a rmncnt_=%rmncnt_%+1
 if "!prm1h2:~%cnt0%,1!"=="i" set romei=%romei%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=i&& set /a rmncnti=%rmncnti%+1
 if "!prm1h2:~%cnt0%,1!"=="v" set romev=%romev%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=v&& set /a rmncntv=%rmncntv%+1
 if "!prm1h2:~%cnt0%,1!"=="x" set romex=%romex%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=x&& set /a rmncntx=%rmncntx%+1
 if "!prm1h2:~%cnt0%,1!"=="l" set romel=%romel%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=l&& set /a rmncntl=%rmncntl%+1
 if "!prm1h2:~%cnt0%,1!"=="c" set romec=%romec%!prm1h1:~%cnt0%,1!&& set rom!prm1h1:~%cnt0%,1!=c&& set /a rmncntc=%rmncntc%+1
 set /a cnt0=%cnt0%+1&& goto :stkvl1
:stkvl2
 set klngth=%cnt0%
 title %title%
 set output=ERROR0:vgnrk&& goto :eof
::modified vigenere shift:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:vgnrk
 if "%rootkey%"=="" set output=ERROR1:vgnrk&& goto :eof
 if "%klngth%"=="" set output=ERROR2:vgnrk&& goto :eof
 set prm1=%rootkey%
 set prm1h1=!prm1:~0,%klngth%!
 set prm1h2=!prm1:~-%klngth%!
 set prm2=%1
 if "%prm2:~7,1%"=="" set output=ERROR3:vgnrk&& goto :eof
 set cnt0=0
 set cnt1=0
 set cnt2=
 set cnt3=
 set cnt4=
 set output=
 set hlp1=
 set nks1=                                                                                                                           %
 set nks2=                                                                                                                           %
 set nks1=!nks1:~0,%klngth%!
 set nks2=!nks2:~0,%klngth%!
:vgnrk0
 title %title% vigenere shift !prm1h1:~%cnt0%,1! ^> !prm2:~%cnt1%,1! ^| !prm2:~%cnt1%,1! ^< !prm1h2:~%cnt0%,1!
 if "!prm1h1:~%cnt0%,1!"=="" goto :vgnrk3
 if "!prm2:~%cnt1%,1!"=="" set cnt1=0
 set hlp1=!prm1h2:~%cnt1%,1!
 set cnt2=!chr_%hlp1%!
 set /a cnt3=%cnt0%+%cnt2%
:vgnrk1
 if %cnt3% geq %klngth% set /a cnt3=%cnt3%-%klngth%
 if not "!nks1:~%cnt3%,1!"==" " set /a cnt3=%cnt3%+1&& goto :vgnrk1
 set /a cnt4=%cnt3%+1
 set nks1=!nks1:~0,%cnt3%!!prm1h1:~%cnt0%,1!!nks1:~%cnt4%!
 set /a cnt3=%cnt0%-%cnt2%
:vgnrk2
 if %cnt3% lss 0 set /a cnt3=%cnt3%+%klngth%
 if not "!nks2:~%cnt3%,1!"==" " set /a cnt3=%cnt3%-1&& goto :vgnrk2
 set /a cnt4=%cnt3%+1
 set nks2=!nks2:~0,%cnt3%!!prm1h2:~%cnt0%,1!!nks2:~%cnt4%!
 set /a cnt0=%cnt0%+1
 set /a cnt1=%cnt1%+1
 goto :vgnrk0
:vgnrk3
 title %title%
 set output=%nks1%%nks2%&& goto :eof
 set output=ERROR0:vgnrk&& goto :eof
::encryption method 1 advanced caesar:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ncrpt
 if "%ncrpt%"=="" set output=ERROR1:ncrpt&& goto :eof
 if "%rootkey%"=="" set output=ERROR2:ncrpt&& goto :eof
 if "%klngth%"=="" set output=ERROR3:ncrpt&& goto :eof
 set prm1=%ncrpt%
 set  cnt0=0
 set /a hlp1=%random%%%klngth%
 set hlp2=
 set hlp3=
 set output=!val_%hlp1%!
:ncrpt0
 title %title% encryption advanced caesar [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 set hlp1=%output:~-1%
 set hlp2=!chr_%hlp1%!
 set hlp1=!prm1:~%cnt0%,1!
 set hlp3=!chr_%hlp1%!
 set /a cnt1=%hlp2%+%hlp3%
 if %cnt1% geq %klngth% set /a cnt1=%cnt1%-%klngth%
 set output=%output%!val_%cnt1%!
 set /a cnt0=%cnt0%+1
 goto :ncrpt0
 set output=ERROR0:ncrpt&& title %title%&& goto :eof
::decryption method 1 advanced caesar:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:dcrpt
 if "%dcrpt%"=="" set output=ERROR1:dcrpt&& goto :eof
 if "%rootkey%"=="" set output=ERROR2:dcrpt&& goto :eof
 if "%klngth%"=="" set output=ERROR3:dcrpt&& goto :eof
 set prm1=%dcrpt%
 set cnt0=0
 set cnt1=
 set hlp1=
 set hlp2=
 set hlp3=
 set output=
:dcrpt0
 title %title% decryption advanced caesar [%cnt0%]
 set /a cnt1=%cnt0%+1
 if "!prm1:~%cnt1%,1!"=="" title %title%&& goto :eof
 set hlp1=!dcrpt:~%cnt0%,1!
 set hlp2=!chr_%hlp1%!
 set hlp1=!dcrpt:~%cnt1%,1!
 set hlp3=!chr_%hlp1%!
 set /a hlp1=%hlp3%-%hlp2%
 if %hlp1% lss 0 set /a hlp1=%hlp1%+%klngth%
 set output=%output%!val_%hlp1%!
 set /a cnt0=%cnt0%+1
 goto :dcrpt0
 set output=ERROR0:dcrpt&& title %title%&& goto :eof
::encryption method 2 home rome:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrnc
 if "%gtrnc%"=="" set output=ERROR1:gtrnc&& goto:eof
 if "%klngth%"=="" set output=ERROR2:gtrnc&& goto:eof
 set prm1=%gtrnc%
 set cnt0=0
 set cnt1=
 set hlp1=
 set hlp2=
 set output=
:gtrnc0
 title %title% encryption home rome [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 if not "!prm1:~%cnt0%,1!"=="_" if not "!prm1:~%cnt0%,1!"=="i" if not "!prm1:~%cnt0%,1!"=="v" if not "!prm1:~%cnt0%,1!"=="x" if not "!prm1:~%cnt0%,1!"=="l" if not "!prm1:~%cnt0%,1!"=="c" set output=ERROR1:gtrnc&& goto :eof
 set hlp1=!prm1:~%cnt0%,1!
 set /a cnt1=%random%%%!rmncnt%hlp1%!
 set hlp2=!rome%hlp1%!
 set output=%output%!hlp2:~%cnt1%,1!
 set /a cnt0=%cnt0%+1
 goto :gtrnc0
 set output=ERROR0:gtrnc&& title %title%&& goto :eof
::decryption method 2 home rome:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrdc
 if "%gtrdc%"=="" set output=ERROR1:gtrdc&& goto:eof
 if "%klngth%"=="" set output=ERROR2:gtrdc&& goto:eof
 set prm1=%gtrdc%
 set cnt0=0
 set hlp1=
 set output=
:gtrdc0
 title %title% decryption home rome [%cnt0%]
 if "!prm1:~%cnt0%,1!"=="" title %title%&& goto :eof
 set hlp1=!prm1:~%cnt0%,1!
 set output=%output%!rom%hlp1%!
 set /a cnt0=%cnt0%+1
 goto :gtrdc0
 set output=ERROR0:gtrdc&& goto :eof
::encryption method 2 home rome base::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtrms
 if "%gtrms%"=="" set output=ERROR1:gtrms&& goto :eof
 set mprm1=%gtrms%
 set mcnt0=0
 set moutput=
 set mhlp1=
:gtrms0
 title %title% encryption home rome base [%mcnt0%]
 if "!mprm1:~%mcnt0%,1!"=="" goto :gtrms1
 set mhlp1=!mprm1:~%mcnt0%,1!
 set mhlp1=!chr_%mhlp1%!
 set gtrmn=%mhlp1%
 call :gtrmn
 set moutput=%moutput%%output%
 set /a mcnt0=%mcnt0%+1
 goto :gtrms0
:gtrms1
 title %title%
 set output=%moutput%
 if "%output%"=="" set output=ERROR0:gtrms&& goto :eof
 goto :eof
::decryption method 2 home rome base::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtchs
 if "%gtchs%"=="" set output=ERROR1:gtchs&& goto :eof
 set mprm1=%gtchs%
 set mcnt0=0
 set mcnt1=1
 set moutput=
 set mhlp1=
:gtchs0
 title %title% decryption home rome base [%mcnt0%]
 if "!mprm1:~%mcnt0%,1!"=="" goto :gtchs2
 if "!mprm1:~%mcnt0%,1!"=="_" if not "%mhlp1%"=="" set mhlp1=%mhlp1%!mprm1:~%mcnt0%,1!&& goto :gtchs1
 set mhlp1=%mhlp1%!mprm1:~%mcnt0%,1!
 set /a mcnt0=%mcnt0%+1
 set /a mcnt1=%mcnt0%+1
 goto :gtchs0
:gtchs1
 set gtdcm=%mhlp1%
 call :gtdcm
 set mhlp1=%output%
 set mhlp1=!val_%mhlp1%!
 set moutput=%moutput%%mhlp1%
 set mhlp1=
 set /a mcnt0=%mcnt0%+1
 set /a mcnt1=%mcnt0%+1
 goto :gtchs0
:gtchs2
 title %title%
 set output=%moutput%
 if "%output%"=="" set output=ERROR0:gtchs&& goto :eof
 goto :eof
::set default rootkey:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:gtdft
 set rootchr=abcdefghijklmnopqrstuvwxyz_0123456789.?,'-+:()[]~#üäèïîìÄÅÉæÆôöòûùÜø£ƒáóúñªº¿®¬½¼¡«»ÁÂÀ©¢Ã¤ÐÊËÈÍÎÏ̯ßõÕþÚÛÙýÝ´­±¾§¸°¨¹³²;\@
 set rootrmn=_iv_iv_ivx_ix_ix_ivx_ivx_ivx_ivx_ivx_ixllll_ivxl_ivxl_ixl_ixl_ixl_ixl_ixl_ixl_ix_ivx_ivx_cccc_ivxc_ixc_ivxc_ixc_ivxc_ixc_ix
 set rootkey=%rootchr%%rootrmn%
 set klngth=123
 goto :eof
::set keylength:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:sklngt
 if "%1"=="" set output=ERROR1:sklngt&& goto :eof
 if %1 lss 27 set output=ERROR2:sklngt&& goto :eof
 if %1 gtr 123 set output=ERROR3:sklngt&& goto :eof
 set cnt0=%1
 call :gtdft
 set sklngt=!rootchr:~0,%cnt0%!!rootrmn:~0,%cnt0%!
 set output=ERROR0:sklngth&& goto :eof
::create account::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:acccrt
 call :gtdft
 call :stkvl
 call :mltpl
 if not "%acccrt%"==""  set gtrdm=%acccrt%
 if "%acccrt%"=="" call :sklngt 27
 if "%acccrt%"=="" set gtrdm=%sklngt%
 call :gtrdm
 set ghlp1=%output%
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :gtdft
 call :stkvl
 call :mltpl
 call :ncrpt
 echo %output%> user/%name%.log
 call :gtdft
 call :stkvl
 goto :eof
::multiple passwords::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:mltpl
 cls
 set /p psswrd=password: %
:: if "%psswrd%"=="exit"  goto :eof
 if "%psswrd:~7,1%"=="" goto :mltpl
 call :vgnrk %psswrd%
 set rootkey=%output%
 call :stkvl
:mltpl0
 cls
 set /p psswrd=add more: %
 if "%psswrd%"=="exit"  goto :eof
 if "%psswrd:~7,1%"=="" goto :mltpl0
 call :vgnrk %psswrd%
 set rootkey=%output%
 call :stkvl
 goto :mltpl0
::encipher textfile:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ncphr
 if "%ncphr%"=="" set output=ERROR1:ncphr&& goto :eof
 if "%1"=="" set output=ERROR2:ncphr&& goto :eof
 set ncrpt=%ncphr%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set gtrms=%output%
 call :gtrms
 set gtrnc=%output%
 call :gtrnc
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 set ncrpt=%output%
 call :ncrpt
 echo %output%>> crpt/%1.txt
 goto :eof
::decipher textfile:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:dcphr
 if "%dcphr%"=="" set output=ERROR1:dcphr&& goto :eof
 if "%1"=="" set output=ERROR2:dcphr&& goto :eof
 set dcrpt=%dcphr%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set gtrdc=%output%
 call :gtrdc
 set gtchs=%output%
 call :gtchs
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 set dcrpt=%output%
 call :dcrpt
 echo %output%>> text/%1.txt
 goto :eof
::helpfile::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:help
 cls
 echo LOKI is a batchscript for encrypting and decrypting textfiles.
 echo.
 echo LOKI uses passphrases instead of a password for the login.
 echo each passphrase consists of at least 1 up to n passwords.
 echo.
 echo when setup an account, LOKI will first ask for passphrase A, afterwards for passphrase B
 echo if you want to login you have to enter first passphrase B, afterwards passphrase A
 echo.
 echo LOKI allows the following characters in a textfile to work with:
 echo.
 echo abcdefghijklmnopqrstuvwxyz_0123456789.?,'-+:()[]~#
 echo.
 echo this means LOKI also understands no "SPACE".
 echo if using any other characters than the allowed ones may crash LOKI.
 pause> nul&& goto :eof
::LOGIC:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::proof setlocal, operating system, cmd version, needed folders, needed files:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:start
 if not exist crpt md crpt
 if not exist data md data
 if not exist text md text
 if not exist user md user
 if not exist check.log echo _> check.log&& attrib +h +s +r check.log
 setlocal ENABLEEXTENSIONS
 cls
 if not "%ERRORLEVEL%"=="0" echo extensions not available&&echo programm shutting down&& pause> nul&& goto :eof
 setlocal enabledelayedexpansion
 cls
 if not "%ERRORLEVEL%"=="0" echo delayed expansion not available&&echo programm shutting down&& pause> nul&& goto :eof
 if not "%CMDEXTVERSION%"=="2" echo command extensions version not guilty.&& echo program maybe not working&& pause> nul
 wmic os get caption, OSArchitecture> data/winvrs.log
 attrib -r -s -h data/charset.log
 find /i /c "Microsoft Windows 10" data/winvrs.log> data/charset.log
 for /f "tokens=3" %%a in (data/charset.log) do set hlp1=%%a
 if not "%hlp1%"=="1" echo windows version not guilty.&& echo program maybe not working&& pause> nul
 set hlp1=
 call :gtdft
 echo %rootchr%> data/charset.log&& attrib +r +s +h data/charset.log
 call :stkvl
:restart
::login procedure:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 cls
 echo "exit" shutdown program
 echo "help" help
 set /p name=account: %
 if "%name%"=="exit" endlocal&& goto :eof
 if "%name%"=="help" call :help
 if "%name%"=="help" goto :restart
 if not exist user/%name%.log (
 echo account not found. want to create [%name%]?
 choice
 if !ERRORLEVEL! equ 1 call :acccrt
 goto :restart
 )
 call :mltpl
 set /p dcrpt=< user/%name%.log
 call :dcrpt
 set dcrpt=%output%
 call :gtdft
 call :stkvl
 call :mltpl
 call :dcrpt
 set rootkey=%output%
 call :chkks
 if not "%output%"=="ERROR0:chkks" call :gtdft&& call :stkvl&& goto restart
 set title=%title% ---- account: [%name%]%
 title %title%
 call :stkvl
 cls
 echo login successful
 echo 
 pause> nul
::choose task:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:restart0
 cls
 echo encrypt [1], decrypt [2], set new keylength [3]
 choice /c 123
 if "%ERRORLEVEL%"=="1" (
:rst0e1
 cls
 set /p uhlp1=source: %
 if "!uhlp1!"=="" goto :rst0e1
 if not exist text/!uhlp1!.txt goto :rst0e1
:rst0e1a
 cls
 set /p uhlp2=destination: %
 if "!uhlp2!"=="" goto :rst0e1a
 if not exist crpt/!uhlp2!.txt goto :rst0e1a
 for /f %%a in (text/!uhlp1!.txt) do set ncphr=%%a&& call :ncphr !uhlp2!
 cls
 echo text^/!uhlp1!.txt encrypted to crpt^/!uhlp2!.txt
 echo 
 pause> nul
 goto :restart0
 )
 if "%ERRORLEVEL%"=="2" (
:rst0e2
 cls
 set /p uhlp1=source: %
 if "!uhlp1!"=="" goto :rst0e2
 if not exist crpt/!uhlp1!.txt goto :rst0e2
:rst0e2a
 cls
 set /p uhlp2=destination: %
 if "!uhlp2!"=="" goto :rst0e2a
 if not exist text/!uhlp2!.txt goto :rst0e2a
 for /f %%a in (crpt/!uhlp1!.txt) do set dcphr=%%a&& call :dcphr !uhlp2!
 cls
 echo crpt^/!uhlp1! decrypted to text^/!uhlp2!
 echo 
 pause> nul
 goto :restart0
 )
 if "%ERRORLEVEL%"=="3" (
 cls
 echo set new keylength makes it impossible to decrypt old files
 choice
 if "!ERRORLEVEL!"=="1" (
:rst0e3
 cls
 set /p uhlp1=length: %
 if "!uhlp1!"=="" goto :rst0e3
 if !uhlp1! lss 27 goto :rst0e3
 if !uhlp1! gtr 50 goto :rst0e3
 call :sklngt !uhlp1!
 set acccrt=!sklngt!
 call :acccrt 
 set rootkey=!ghlp1!
 call :stkvl
 goto :restart0
 )
 if "!ERRORLEVEL!"=="2" goto :restart0
 )
 goto :restart0

wedgy
Beiträge: 5
Registriert: Do Mär 12, 2020 5:36 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von wedgy » Fr Mär 13, 2020 10:49 pm

ok ich hab das schusselchen meinerseits entdeckt, folgende zeilen müssen geändert werden:

Zeile 184

Code: Alles auswählen

for %%a in (rome_ romei romev romex romel romec) do set %%a=
statt

Code: Alles auswählen

for %%a in (rome_ romei romev romex romel) do set %%a=
Zeile 611

Code: Alles auswählen

if !uhlp1! gtr 123 goto :rst0e3
statt

Code: Alles auswählen

if !uhlp1! gtr 50 goto :rst0e3
nun sollten alle rootkeylängen zwischen 27 und 123 funktionieren.

und um die verwirrung um den rootkey noch etwas zu reduzieren. der rootkey ist nix weiter als ein array, nur leider kennt batch keine arrays, weswegen das komplette array in einer variable steht um danach dann ein wenig umständlich in entsprechende variablen zerlegt zu werden um alles wie in einem array abfragen zu können.

p.s. ach ja natürlich war die kommandozeile nicht bockig, sondern mensch mal wieder schusselig. ist ja eigentlich immer so dass der fehler im skript und nicht in der maschine liegt... =)

nufan
Wiki-Moderator
Beiträge: 2479
Registriert: Sa Jul 05, 2008 3:21 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von nufan » Fr Mär 20, 2020 8:10 pm

Hallo :)
wedgy hat geschrieben:
Fr Mär 13, 2020 11:52 am
in einer richtigen programmiersprache [...]
Ich bin mit Batch nicht vertraut, aber ich muss sagen für mich sieht das Skript auf den ersten Blick seeehr chaotisch aus ^^ Was spricht gegen z.B. Python?
wedgy hat geschrieben:
Fr Mär 13, 2020 11:52 am
kleine verwechslung von passwort und schlüssel. das passwort ist für den user, der schlüssel ist skript intern.
Stimmt natürlich, da habe ich mich verlesen.
wedgy hat geschrieben:
Fr Mär 13, 2020 11:52 am
Das kommt mir etwas seltsam vor. Du schränkst hier den Zeichensatz deiner Daten vor der finalen Verschlüsselung auf wenige fixe Zeichen ein. Das könnte ein Angriffspunkt sein.
grundlegend ja, allerdings werden im nächsten schritt diese römischen zahlen ziffer für ziffer in ein zufälliges ihnen zugeordnetes zeichen umgeschrieben. damit ist das ganze wieder hinfällig, denn nun sind wieder alle zeichen des zeichensatzes vorhanden. dieser schritt soll verhindern, dass bei der kryptoanalyse ein rückschluss auf die genaue textlänge möglich ist.
Trotzdem weißt du dadurch, dass du nach den ersten drei Entschlüsselungs-Runden einen Plaintext mit einem sehr kleinen Alphabet und sogar einem Schema (dem römischen Additionssystem) raus bekommst. Wie gesagt ist das nur ein Gefühl, vielleicht liege ich auch falsch.

wedgy
Beiträge: 5
Registriert: Do Mär 12, 2020 5:36 pm

Re: wie breche ich diese symmetrische verschlüsselung?

Beitrag von wedgy » Sa Mär 21, 2020 11:41 pm

Ich bin mit Batch nicht vertraut, aber ich muss sagen für mich sieht das Skript auf den ersten Blick seeehr chaotisch aus ^^ Was spricht gegen z.B. Python?
leider meine schlampigen programmierkenntnisse... T_T
aber in zeiten des beruhigten öffentlichen lebens, kann ich ja versuchen an diesem makel etwas zu ändern. allerdings hatte ich da an javascript gedacht... (sry ich steh ja sowas von auf skript sprachen...)
=)

leider anwortet der herr bernd esslinger zum thema cryptool zur zeit auch nicht.... wahrscheinlich krisenbedingt. nun denn nutzen wir die zeit sinnvoll, danke für die anregungen soweit.

Antworten