Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

StringEncrypt & Decrypt by nnnik


  • Please log in to reply
28 replies to this topic
nnnik
  • 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...wink.png
Trotztdem bin ich mit den Ergebnissen ganz zufrieden.


Visit the new forum ahkscript.org.

http://ahkscript.org


nnnik
  • 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.

http://ahkscript.org


Alibaba
  • 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. wink.png

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

 

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

 

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


nnnik
  • 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.

http://ahkscript.org


IsNull
  • 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. wink.png )

 

 

back to topic:

 

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. wink.png



Alibaba
  • 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:

wertetabelle.PNG

 

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. wink.png


Find the recent autohotkey version here: ahkscript.org


nnnik
  • 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.

http://ahkscript.org


nnnik
  • 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.

http://ahkscript.org


Alibaba
  • 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... wink.png

 

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


nnnik
  • 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.

http://ahkscript.org


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

Habs hochgeladen.

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


Visit the new forum ahkscript.org.

http://ahkscript.org


Alibaba
  • 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. wink.png

 

Edit:

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

 

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


Find the recent autohotkey version here: ahkscript.org


Alibaba
  • 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


Dr_Holle
  • 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 wink.png .

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.



IsNull
  • 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. tongue.png