Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate

# StringEncrypt & Decrypt by nnnik

28 replies to this topic
• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Diese Funktionen verschlüsseln Text Passagen jeglicher Art.

```StrEncrypt(Str,Pass="",Quality=1)
{
Strarr:=[]
PWARR:=[]
Loop,Parse,str
Strarr.Insert(asc(A_LoopField))
Loop,Parse,Pass
PWARR.Insert(asc(A_LoopField))
StrArr:=FilterAlgid(StrArr,PwArr,Quality)
s:=""
For each,val in StrArr
s.=UShortToHex(val)
return s
}

StrDecrypt(Str,Pass="")
{
Strarr:=[]
PWARR:=[]
Loop, % strlen(str)//4
Strarr.Insert(HexToUShort(SubStr(Str,(A_Index-1)*4+1,4)))
Loop,Parse,Pass
PWARR.Insert(asc(A_LoopField))
StrArr:=FilterRemoveAlgid(StrArr,PwArr)
s:=""
For each,val in StrArr
s.=chr(val)
return s
}

FilterAlgid(StrArr,PwArr,Quality=1,modvar=0x10000)
{
Strarr:=strarr.Clone()
PwArr:=Pwarr.Clone()
Strarr:=Filter3(StrArr,modvar)
Loop, % Quality+1
{
PWArr:=Filter1(PWArr,0,modvar)
PWArr:=Filter2(PWarr,0)
buf:=Calcbuf(PWarr,modvar)
strarr:=Filter1(strarr,buf,modvar)
strarr:=Filter2(strarr,buf)
}
strarr.insert(Quality)
return strarr
}

FilterRemoveAlgid(StrArr,PwArr,modvar=0x10000)
{
bufarr:=[]
Strarr:=strarr.Clone()
PwArr:=Pwarr.Clone()
Quality:=strarr[strarr.maxindex()]
strarr.remove()
Loop % Quality+1
{
PWArr:=Filter1(PWArr,0,modvar)
PWArr:=Filter2(PWarr,0)
bufarr.insert(Calcbuf(PWarr,modvar))
}
Loop, % Quality+1
{
strarr:=Filter2Remove(strarr,bufarr[Quality+2-A_Index])
strarr:=Filter1Remove(strarr,bufarr[Quality+2-A_Index],modvar)
}
Strarr:=Filter3Remove(StrArr,modvar)
return strarr
}

Calcbuf(arr,modvar=0x100000000)
{
buf:=0
lastnum:=0
Loop, % arr.Maxindex()
{
For each,val in arr
buf:=mod((val*(buf+1))+val,modvar)
}
return buf
}

Filter1(arr,buf,modvar=0x100000000)
{
lastnum:=0
arr:=arr.Clone()
Loop, % arr.Maxindex()
{
buf:=mod(mod(buf+lastnum+A_Index,modvar)*(buf+1)*(lastnum+1)*mod(A_Index,modvar)*255,modvar)
arr[A_Index]:=mod(buf+(lastnum:=arr[A_Index]),modvar)
}
return arr
}

Filter1Remove(arr,buf,modvar=0x100000000)
{
lastnum:=0
arr:=arr.Clone()
Loop, % arr.MaxIndex()
{
buf:=mod(mod(buf+lastnum+A_Index,modvar)*(buf+1)*(lastnum+1)*mod(A_Index,modvar)*255,modvar)
arr[A_Index]:=lastnum:=min(mod(arr[A_Index]-buf,modvar),modvar)
}
return arr
}

Filter2(arr,PWVar=0)
{
v2:=[],s:=[],buf:=0
x:=arr.Maxindex()
Loop, % x
s[A_Index]:=A_Index
Loop, % x
n:=Floor(mod(buf+PWVar,s.Maxindex())+1),w:=s[n],buf:=(v2[w]:=arr[x-A_Index+1]),s.Remove(n,n)
return v2
}

Filter2Remove(arr,PWVar=0)
{
v2:=[],s:=[],buf:=0
x:=arr.Maxindex()
Loop, % x
s[A_Index]:=A_Index
Loop, % x
n:=Floor(mod(buf+PWVar,s.Maxindex())+1),w:=s[n],buf:=(v2[x-A_Index+1]:=arr[w]),s.Remove(n,n)
return v2
}

Filter3(arr,modvar)
{
cmin:=modvar
cmax:=0
spclmodvar:=1
vmod:=0
strl:=arr.Maxindex()
For each, val in arr
cmin:=val<cmin?val:cmin,cmax:=val>cmax?val:cmax
while ((cmax-cmin)>spclmodvar-1)
spclmodvar*=2,vmod:=A_Index
cmin-=(cmin+spclmodvar-1)>(modvar-1)?(cmin+spclmodvar-1)-(modvar-1):0
if (cmax-cmin)<(spclmodvar-1)
Random,var,0,% (spclmodvar-1)-(cmax-cmin)
cmin-=var
cmin:=cmin<0?cmin:=0:cmin
If (vmod=0)
return [strl>>16,strl-((strl>>16)<<16),cmin,0]
For each, val in arr
arr[each]-=cmin
spclmodvar:=1
cmax:=""
vmod2:=""
while ((modvar-1)>spclmodvar-1)
spclmodvar*=2,vmod2:=A_Index
arr2:=[]
rest:=0
For each, val in arr
{
w:=ceil((A_Index*vmod)/vmod2)
rest:=rest+vmod
If (rest<=vmod2)
{
arr2[w]:=(arr2[w]?arr2[w]:0)+(val<<(vmod2-rest))
}
else
{
rest:=(rest-vmod2)
arr2[w-1]:=arr2[w-1]+(val>>rest)
v:=val-((val>>rest)<<rest)
arr2[w]:=(v<<(vmod2-rest))
}
}
arr2.Insert(strl>>16)
arr2.Insert(strl-((strl>>16)<<16))
arr2.Insert(cmin)
arr2.Insert(vmod)
return arr2
}

Filter3Remove(arr,modvar)
{
arr2:=[]
cmin:=arr[arr.maxindex()-1]
vmod:=arr[arr.maxindex()]
strl:=arr[arr.maxindex()-2]+(arr[arr.maxindex()-3]<<16)
arr.remove()
arr.remove()
arr.remove()
arr.remove()
if !vmod
{
if strl<0x5FFFFF
Loop, % StrL
arr2.Insert(cmin)
return arr2
}
spclmodvar:=1
while ((modvar-1)>spclmodvar-1)
spclmodvar*=2,vmod2:=A_Index
rest:=0
Loop % strl
{
w:=ceil((A_Index*vmod)/vmod2)
rest:=rest+vmod
if ((rest)<=vmod2)
{
arr2[A_Index]:=arr[w]>>(vmod2-rest)
arr[w]-=arr2[A_Index]<<(vmod2-rest)
}
else
{
rest:=(rest-vmod2)
arr2[A_Index]:=arr[w-1]<<(rest)
arr2[A_index]+=arr[w]>>(vmod2-rest)
arr[w]-=((arr[w]>>(vmod2-rest))<<(vmod2-rest))
}
}
For each, v in arr2
arr2[each]+=cmin
return arr2
}

min(val,modvar=0xFFFFFFFF)
{
while val<0
val+=modvar
return val
}

showarr(arr)
{
str2:="["
For each,key in	arr
str2.=key "`,"
StringTrimright,str2,str2,1
str2.="]"
return str2
}

HexToUShort(str)
{
static d:={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9","A":10,"B":11,"C":12,"D":13,"E":14,"F":15}
val:=0
Loop,Parse,str
val:=(val<<4)+d[A_Loopfield]
return val
}

UShortToHex(val)
{
static d:={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"A",11:"B",12:"C",13:"D",14:"E",15:"F"}
s:=""
var:=val
Loop, % 4
val:=var>>(4*(4-A_index)),s.=d[val],var-=val<<(4*(4-A_index))
return s
}
```

Alle Funktionen könnt ihr, soblad ihr durchgeblickt habt, weiterverwenden.
Wie Irgendjemand aus dem Forum gesagt hat "Do What the **** you want with it License" DWF License.

Benutzung:
Verschlüsseln:

```Result:=StrEncrypt(String,Pass="",Quality=1)
```

String:
Den String den ihr verschl&uuml;sseln wollt.

Pass:
Einfach ein Passwort.
Kann weggelassen werden.

Quality:

Die Qualität
Wenn der Wert gross ist braucht der Rechner länger zum Ver- und Entschl&uuml;sseln</p>
Q wird nicht für das Entschlüsseln benötigt, da dieser Wert gespeichert ist.
Ich empfehle mindestens 1.
Kann weggelassen werden.

Result:
Den Hexstring den ihr zum Entschl&uuml;sseln wieder braucht.

Entschlüsseln:

```String:=StrDecrypt(Result,Pass="")
```

Result:
Das Ergebnis der Verschlüsselungs Funktion.

Pass:
Benutzt das selbe Passwort wie bei der Verschlüsselung um das selbe Ergebnis zu erhalten.
Kann, falls nicht vorhanden ausgelassen, werden.

String:
Den String oder Text den ihr verschlüsselt habt.

Keine Gewährund Haftung ist aussgeschlossen...
Trotztdem bin ich mit den Ergebnissen ganz zufrieden.

Visit the new forum ahkscript.org.

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Gesichert

THX an den der es für mich Verbessert hat.

Visit the new forum ahkscript.org.

• Members
• 435 posts
• Last active: Nov 19 2014 04:21 PM
• Joined: 01 Nov 2012

Tja, was soll ich sagen?

Sieht gut aus. Gute Arbeit!

Ich denke, dieser Verschlüsselungsalgorithmus punktet vorallem durch seine Einheitlichkeit durch die Ausgabe als HexCode und der "rekursiven" (falls man das so nennen kann) Verschlüsselungstechnik, außerdem ist dein Code um einiges leichter zu lesen als meiner.

Vorallem der Parameter an dem man die Qualität einstellen kann, ist eine super Idee!

Du hast "gewonnen", muss ich wohl zugeben...

Ich grüble allerdings schon die ganze Zeit darüber nach wie man Dateien verschlüsseln könnte, die nicht im Textformat sind, also mp3's, jpg's, oder vielleicht auch exe anwendungen...

Das wäre nützlich.

Find the recent autohotkey version here: ahkscript.org

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Das ist jetzt eine Text Anwendung der beiden Filter.

Per FileOpen und RawRead/Write könnte ich die Filter auch andere Werte berechnen lassen.

Das ganze ist, wie mir jetzt auffällt, sehr sehr Rechenintensiv.

ab Qualität 1 sollte eigentlich kein System mehr vorhanden sein mit dem man einfacher BruteForcen könnte.

Bei Qualität 0 könnte man Ähnlichkeiten zwischen den Hex Werten finden.

Jedoch sind die Berechnungen mehrdeutig, so kann "Hello World" auch über irgend ein Passwort "Msgbox % v" entsprechen.

Visit the new forum ahkscript.org.

• Moderators
• 990 posts
• Last active: May 15 2014 11:56 AM
• Joined: 10 May 2007

ab Qualität 1 sollte eigentlich kein System mehr vorhanden sein mit dem man einfacher BruteForcen könnte.

Und wie kommst du auf diese abenteuerliche Aussage? Dir ist klar, dass das Erschaffen eines sicheren Algorithms sehr komplex ist, und man dazu sehr fundierte Kentnisse in Mathematik und Kryptologie haben muss. Selbst dann ist das ganze immer noch sehr verzwickt, und daher werden die Algorithmen von vielen Experten zusammen analysiert - bis keiner mehr eine Schwachstelle finden kann.

(Solange du einen eigen entwickelten Algorithmus als sicher bezeichnest, werde ich dir etwas auf den Eiern rumtreten müssen. )

IMHO finde ich es sehr sinnvoll, eine einfach zu verwendende Verschlüsselung zu haben, die eben immer Text ausgibt (Hex encoded). Es ist in der Tat für Newbies sehr schwer, mit einem AES etc. zu arbeiten, weil diese Algorithmen jegliche Bytes als Kryptotext produzieren können.

Als Tipp für ein nächstes Projekt mit diesem Ziel:

Nimm doch einfach einen sicheren Algo (AES z.B.) und baue darum einen Hex converter, d.h. lies einfach die Bytes aus und wandle sie in Hex-Strings um.

• Members
• 435 posts
• Last active: Nov 19 2014 04:21 PM
• Joined: 01 Nov 2012

Ich hab mir mal die Zeit genommen, die Rechenzeiten zu analysieren.
Ich habe jeweils ANSI Strings der Länge 10, 100, 1000 und teilweise auch 10000 Zeichen mit den Qualitätsstufen 0, 2, 4, 6, 8, 10 und 50 (ohne Passwort) kodieren lassen.

Hier die Wertetabelle:

Die Werte mit vorangestelltem "~" sind nicht gemessen, sondern errechnet.

Auch mit Passwort bleiben die Werte ungefähr gleich, allerdings war zu erkennen, dass mit steigender Passwortlänge auch eine leichter Anstieg der Rechenzeit (bis zu 1s) einhergeht.

Die Werte habe ich auf meinem PC mit einem AMD Athlon II X4 630 Prozessor ermittelt. Er besitzt 4 Kerne und eine Geschwindigkeit von 2.8 GHz pro Kern.

Und ja... Ich mag Statistiken.

Find the recent autohotkey version here: ahkscript.org

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Ist ja nicht so als gäbe es AES mit Stringausgabe nicht aber ich hatte mir halt vorher darüber ziemlich viele Gedanken gemacht und wollte diese halt einmal umsetzten.

Das Hauptproblem bei QaMaraths Encoder ist halt, dass ein ähnlicher String ein ähnliches Ergebnis erzeugt.

Das Problem habe ich behoben indem ich Filter1 2mal über den String laufen lasse und den String dabei immer wieder umdrehe.

Da Filter1 jeden Character in seine Berechnung mit einbezieht der vor dem jetzigem steht wird wenn das ganze sich umgedreht hat,  eine Änderung irgend eines Chars dazu führen, dass sich das komplette Endergebnis ändert.

Um zu verhindern, dass die Chars die weiter hinten stehen viel Information über die Vorgänger enthalten habe ich eine Berechnung ähnlich der folgenden benutzt:

var5:=mod(var1*var2*var3,var4)

Der Vorteil hierbei ist, dass selbst wenn var3-var4 bekannt sind man var1 und var2 immer noch BruteForcen muss

Rechenbeispiel:

1:=mod(var1*var2*1,16)

var1:=?

var2:=?

Das ganze ist aber nur so in einer Formel aufzustellen, falls var3-var5 bekannt sind.

Visit the new forum ahkscript.org.

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Nun ja die hohen Werte sind damit zu erklären, dass der Rechenaufwand Fakultär zur Stringlänge steigt.

Das kann man als vor und als Nachteil sehen.

TODO:

Den String in abhängigkeit zur Qualität in kleinere Stücke aufteilen.

Visit the new forum ahkscript.org.

• Members
• 435 posts
• Last active: Nov 19 2014 04:21 PM
• Joined: 01 Nov 2012

Ich finde die Werte sind akzeptabel...

Man muss ja nicht unbedingt einen 10000 Zeichen String mit Qualität 50 kodieren...

Immerhin könnte man eine große Textdatei mit bis zu 10000 Zeichen in weniger als 7 Minuten in der Qualitätsstufe 4 kodieren lassen.

Find the recent autohotkey version here: ahkscript.org

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Ich brauche für 10k Zeichen jetzt bei Qualität 1 ungefähr 7 sec.

Poste das ganze morgen.

Natürlich kann ich keine Garantie geben, dass es sicher ist.

Aber soweit ich das sehe ist ein einfaches zurückrechnen nicht möglich.

Visit the new forum ahkscript.org.

• Members
• 1625 posts
• Last active: Jan 24 2019 02:19 PM
• Joined: 28 Jul 2012

Todo Qualität sollte auch Floats annehmen können.

Visit the new forum ahkscript.org.

• Members
• 435 posts
• Last active: Nov 19 2014 04:21 PM
• Joined: 01 Nov 2012

Aber soweit ich das sehe ist ein einfaches zurückrechnen nicht möglich.

Hör jetzt lieber auf, das immer zu erwähnen, sonst regt sich IsNull wieder auf.

Edit:

Achne, seit neuestem "ViTAL_"... Entschuldigung!

Wieso denn eigentlich die Änderung, wenn man fragen darf?

Find the recent autohotkey version here: ahkscript.org

• Members
• 435 posts
• Last active: Nov 19 2014 04:21 PM
• Joined: 01 Nov 2012

Hab übrigens nochmal einen 10k String mit Qualität 50 kodieren lassen und die Zeit gemessen. Verbesserung von 65 min auf 1.5 min. Respekt!

Find the recent autohotkey version here: ahkscript.org

• Members
• 105 posts
• Last active: Mar 26 2014 10:10 AM
• Joined: 18 Dec 2012

Sieht interessant aus.

Ich wollte auch schon immer mal ein Verschlüsselungs-Programm coden, aber irgendwie hatte ich immer andere Dinge zu tun .

Gängige Verschlüsselungsmethoden sind natürlich sicherer, aber es kommt halt immer auf den Einsatzzweck an.

Ich werde irgendwann auch mal so etwas in der Art in Angriff nehmen. Mal sehen was mir da spontan für Ideen einfallen.

Mal angenommen, ich will ein Passwort verschlüsseln, da wäre AES oder MD5 angebrachter als ein selber geschriebenes Verschlüsselungsprogramm.

Würde ich nun nur den Inhalt einer INI-Datei "unleserlich" machen wollen reicht so etwas wie hier vollkommen aus.

Wenn ich nun jedoch ein Bild (Hochauflösend, TrueColor) verschlüsseln wollte, dann wäre das hier wieder ungeeignet, da es viel zu langsam wäre. Bei einem Bild würde ich vermutlich nur "Teile" verschlüsseln, das sollte dann ausreichen um es unleserlich zu machen.

...es kommt halt immer auf den Verwendungszweck an.

• Moderators
• 990 posts
• Last active: May 15 2014 11:56 AM
• Joined: 10 May 2007

Der Nick ViTAL mag ich schon ne ganze Weile lieber, und da man hier im Forum nun den Benutzernamen wechseln kann, habe ich das mal ausprobiert. (Das Anhängsel _ ist übrigens lediglich da, weil irgend ne inaktive Gurke "vital" schon besetzt.)

Ich hoffe die allgemeine Neugier wurde damit einigermassen gestillt.