zockerman
Goto Top

Batch Variablenvergleich

Habe mal wieder ein Problem mit Batch

Hallo Liebe adminstrator.de-Gemeinde,

heute saß ich so rum und habe gedacht, ich schreibe ein Programm zum ver- und entschluesseln von Text. Gesagt getan. Es funktioniert auch alles. Nur eins nicht.
Der Verglech meiner 2 numerischen Variablen. Ich hab wirklich keine Ahnung woran das liegen kann.
Hier mein Code.
@echo off & setlocal enabledelayedexpansion
IF "%1" == "" (  
echo Ziehen Sie die zu entschluesselnde .txt auf die Decrypt.bat
pause > Nul
exit
)
set /p code1=<%cd%\Key\code
set /p a=<%cd%\Key\1
set /p b=<%cd%\Key\2
set /p c=<%cd%\Key\3
set /p d=<%cd%\Key\4
set /p e=<%cd%\Key\5
set /p f=<%cd%\Key\6
set /p g=<%cd%\Key\7
set /p h=<%cd%\Key\8
set /p i=<%cd%\Key\9
set /p j=<%cd%\Key\10
set /p k=<%cd%\Key\11
set /p l=<%cd%\Key\12
set /p m=<%cd%\Key\13
set /p n=<%cd%\Key\14
set /p o=<%cd%\Key\15
set /p p=<%cd%\Key\16
set /p q=<%cd%\Key\17
set /p r=<%cd%\Key\18
set /p s=<%cd%\Key\19
set /p t=<%cd%\Key\20
set /p u=<%cd%\Key\21
set /p v=<%cd%\Key\22
set /p w=<%cd%\Key\23
set /p x=<%cd%\Key\24
set /p y=<%cd%\Key\25
set /p z=<%cd%\Key\26
set /p A_g=<%cd%\Key\27
set /p B_g=<%cd%\Key\28
set /p C_g=<%cd%\Key\29
set /p D_g=<%cd%\Key\30
set /p E_g=<%cd%\Key\31
set /p F_g=<%cd%\Key\32
set /p G_g=<%cd%\Key\33
set /p H_g=<%cd%\Key\34
set /p I_g=<%cd%\Key\35
set /p J_g=<%cd%\Key\36
set /p K_g=<%cd%\Key\37
set /p L_g=<%cd%\Key\38
set /p M_g=<%cd%\Key\39
set /p N_g=<%cd%\Key\40
set /p O_g=<%cd%\Key\41
set /p P_g=<%cd%\Key\42
set /p Q_g=<%cd%\Key\43
set /p R_g=<%cd%\Key\44
set /p S_g=<%cd%\Key\45
set /p T_g=<%cd%\Key\46
set /p U_g=<%cd%\Key\47
set /p V_g=<%cd%\Key\48
set /p W_g=<%cd%\Key\49
set /p X_g=<%cd%\Key\50
set /p Y_g=<%cd%\Key\51
set /p Z_g=<%cd%\Key\52
set "datei=%1"  
)

echo Es wird decodiert!! Bitte warten...
for /f %%i IN (%datei%) DO (
IF "%%i"=="." (  
echo.|set /p=_t_>>tmp1
) ELSE (
set "crypt_num=%%i"  
set /a number = crypt_num / code1
echo !crypt_num!
call :decrypt
)
IF "%%i"=="," echo. >>tmp1  
)
for /F "delims=" %%a in (tmp1) do (  
set "text=%%a"  
set "text=!text: =!"  
echo !text!>>tmp2
)
for /F "delims=" %%a in (tmp2) do (  
set "text=%%a"  
set "text=!text:_t_= !"  
echo !text!>>decodiert.txt
)
del tmp1
del tmp2

Echo Decodierung abgeschlossen!!
pause > NUL
exit /b

:decrypt
echo crypt_num: !crypt_num!
echo Code: !code1!
echo Number: !number!
echo A_g: !A_g!
echo B_g: !B_g!
echo C_g: !C_g!
echo D_g: !D_g!
echo E_g: !E_g!
echo F_g: !F_g!
echo G_g: !G_g!
IF !number! EQU !A_g! set "sign=A" & echo test1  
IF !number! EQU !B_g! set "sign=B" & echo test1  
IF !number! EQU !C_g! set "sign=C" & echo test1  
IF !number! EQU !D_g! set "sign=D" & echo test1  
IF !number! EQU !E_g! set "sign=E" & echo test1  
IF !number! EQU !F_g! set "sign=F" & echo test1  
IF !number! EQU !G_g! set "sign=G" & echo test1  
IF !number! EQU !H_g! set "sign=H" & echo test1  
IF !number! EQU !I_g! set "sign=I" & echo test1  
IF !number! EQU !J_g! set "sign=J" & echo test1  
IF !number! EQU !K_g! set "sign=K" & echo test1  
IF !number! EQU !L_g! set "sign=L" & echo test1  
IF !number! EQU !M_g! set "sign=M" & echo test1  
IF !number! EQU !N_g! set "sign=N" & echo test1  
IF !number! EQU !O_g! set "sign=O"  
IF !number! EQU !P_g! set "sign=P"  
IF !number! EQU !Q_g! set "sign=Q"  
IF !number! EQU !R_g! set "sign=R"  
IF !number! EQU !S_g! set "sign=S"  
IF !number! EQU !T_g! set "sign=T"  
IF !number! EQU !U_g! set "sign=U"  
IF !number! EQU !V_g! set "sign=V"  
IF !number! EQU !W_g! set "sign=W"  
IF !number! EQU !X_g! set "sign=X"  
IF !number! EQU !Y_g! set "sign=Y"  
IF !number! EQU !Z_g! set "sign=Z"  
IF !number! EQU !a! set "sign=a"  
IF !number! EQU !b! set "sign=b"  
IF !number! EQU !c! set "sign=c"  
IF !number! EQU !d! set "sign=d"  
IF !number! EQU !e! set "sign=e"  
IF !number! EQU !f! set "sign=f"  
IF !number! EQU !g! set "sign=g"  
IF !number! EQU !h! set "sign=h"  
IF !number! EQU !i! set "sign=i"  
IF !number! EQU !j! set "sign=j"  
IF !number! EQU !k! set "sign=k"  
IF !number! EQU !l! set "sign=l"  
IF !number! EQU !m! set "sign=m"  
IF !number! EQU !n! set "sign=n"  
IF !number! EQU !o! set "sign=o"  
IF !number! EQU !p! set "sign=p"  
IF !number! EQU !q! set "sign=q"  
IF !number! EQU !r! set "sign=r"  
IF !number! EQU !s! set "sign=s"  
IF !number! EQU !t! set "sign=t"  
IF !number! EQU !u! set "sign=u"  
IF !number! EQU !v! set "sign=v"  
IF !number! EQU !w! set "sign=w"  
IF !number! EQU !x! set "sign=x"  
IF !number! EQU !y! set "sign=y"  
IF !number! EQU !z! set "sign=z"  
echo !sign!.
echo.|set /p=!sign!>>tmp1
set number=
set sign=
goto :eof

Erklärung:
Zuerst werden die "Keys" geholt, die notwendig sind um das Ganze zu entschlüsseln. Das beruht darauf, dass jeder Buchstabe eine Zufallszahl bekommt. Zusätzlich wird noch ein Code generiert. Nun werden Buchstabe und Code multipliziert und heraus kommt unsere Variable crypt_num (was ich gerade beschreibe, tut eine andere Batch. Und zwar richtig)

Mein Problem liegt in dem letzten Block. Ich habe mir mal ein paar werte ausgeben lassen und tata.
!number! und !A_g! sind gleich. Aber wieso setzt er nicht sign auf A??

achja der text der hier verschluesselt worden ist ist "ABCDEFG" deshalb habe ich mir diese Buchstaben anzeigen lassen, damit ich manuell überprüfen kann ob das passt. Und wenn man sich es anschaut. es passt


Hier mal ein Bild von dem was passiert
64bafd2f7f397e63761f5a8cc807e3cd

Content-Key: 157102

Url: https://administrator.de/contentid/157102

Printed on: April 24, 2024 at 05:04 o'clock

Member: jeb-the-batcher
jeb-the-batcher Dec 16, 2010 at 14:21:55 (UTC)
Goto Top
Hallo Zockerman,

schon erstaunlich wie kompliziert man ein einfaches Problem angehen kann!
Wie praktisch das der Schlüssel in 52 Datein verteilt wird.

Aber um zu deinem aktuellen Problem zu kommen, zum einen fehlt der Inhalt der 52 Dateien,
zum anderen tippe ich darauf, dass es nicht zu einem numerischen Vergleich kommt, weil in deinen Variabeln nämlich gar keine Zahl steht.
Ich vermute, dass am Ende noch ein Space hängt.

Ist aber leicht zu testen, einfach mal überall bei den Debugausgaben eine Raute dranhängen z.B. echo A_g: !A_g!#

Allerdings solltest du dir überlegen, ob das hier wohl der richtige Ansatz ist soviel Zeilen Code für ein paar Vergleiche zu verwenden.

Optimierte Grüße
jeb
Member: Zockerman
Zockerman Dec 16, 2010 at 17:06:49 (UTC)
Goto Top
Hallo jeb

ich weiß, dass es viel zu viel Code ist und, dass ich die Zeilen kürzen kann, aber ich wollte zuerst die Intelligenz programmieren und dann das minimieren anfangen.

Vielen Dank für deine Hilfe. Nagut, dass mit dem Space konnte ich ja durch löschen von Werten in der Variable lösen.
Aber was meinst du damit, dass der Inhalt meiner 52 Dateien fehlt?

Da stehen immer nur eine Zahl zwischen 1-32765 halt 16 bit^^

Grüße
Zockerman
Member: Biber
Biber Dec 16, 2010 at 20:11:21 (UTC)
Goto Top
Moin Zockerman,

Zitat von @Zockerman:
Aber was meinst du damit, dass der Inhalt meiner 52 Dateien fehlt?

Da stehen immer nur eine Zahl zwischen 1-32765 halt 16 bit^^
Ich will da jeb-the-batcher nicht vorgreifen, aber es könnte sein, dass ihm die Verwendung eines Dateiformats vorschwebt,
das die Speicherung von noch mehr als einer Zahl zwischen 1 und 32767 unterstützt...

Ich sach' ma' so: Wenn doch ohnehin jede noch so kleine Datei auf den heutigen Speichermedien 16384 Byte belegt,
dann könntest du doch auch mehr als die bisher verbratenen max.7 Zeichen nutzen.

Oder halten dich dann deine Kumpels für ein wenig knauserig?

Grüße
Biber
Member: jeb-the-batcher
jeb-the-batcher Dec 16, 2010 at 22:53:03 (UTC)
Goto Top
Danke Biber,

du hast meine Gedanken vollkommen richtig erraten.

Zitat von @Zockerman:
Hallo jeb

ich weiß, dass es viel zu viel Code ist und, dass ich die Zeilen kürzen kann, aber ich wollte zuerst die Intelligenz
programmieren und dann das minimieren anfangen.

Uhh, da hab ich doch glatt auf dem Boden gelegen ... wenn das schon der intelligente Teil war ... face-smile

Aber mal im Ernst:
Man sollte den gesamten Schlüssel in eine Datei schieben z.B. einfach pro Key eine Zeile.
Dann kann man ganz toll mit einer FOR-Loop alle Schlüssel aus eben jener einlesen.

Wenn man dann noch statt einzelne Variablenamen zu vergeben ein (Pseudo)-Batcharray verwendet etwa key=3542 (Schlüssel für A), key[1]=24020, ...
wird das Suchen und Vergleichen im Vergleich gleich viel leichter, könnte man halt Versuchen (was für ein schönes Wortspiel).

Zudem kann ich nicht ganz erkennen wozu aus dem Buchstabenraum (so in etwa 52 an der Zahl) auf den Raum 1 bis 32765 gemappt wird.
Genau genommen gibt es so ziemlich genau 52 Schlüssel, da kann man dann auch einfach die Zahlen aus 1 bis 52 als Schlüssel nehmen.

Aber Zockermann, mir gefällt der Ansatz, er zeigt den richtigen Weg und das Verständnis für die zu lösenden Probleme. face-smile

Grüße
jeb
Member: pieh-ejdsch
pieh-ejdsch Dec 19, 2010 at 14:40:43 (UTC)
Goto Top
moin Zockerman,

nicht passend zur Überschrift aber bei dem worum es geht.
ein Ansatz für das kommplette Auslesen einer Zeichenfolge ( in einer zu de - codierenden Zeichenfolge / Datei ) ohne die Zeichenfolge in einzelne Zeilen in eine andere Datei zerlegen zu müssen ist hier beschrieben.

Es ging um diesen Atbash-Algorithmus

Gruß Phil