nnnik's Encrypt/Decrypt V2.1.0

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

nnnik's Encrypt/Decrypt V2.1.0

22 Dec 2013, 15:06

Ich habe nochmal an meiner Verschlüsselung gearbeitet.
Sie ist jetzt optimierter noch einfacher zu bedienen und gibt anstatt Hex nun Base64 zurück.
Hier ist der Code.

Code: Select all

encryptStr(str="",pass="")
{
If !(enclen:=(strput(str,"utf-16")*2))
    return "Error: Nothing to Encrypt"
If !(passlen:=strput(pass,"utf-8")-1)
    return "Error: No Pass"
enclen:=mod(enclen,4) ? (enclen) : (enclen-2)
Varsetcapacity(encbin,enclen,0)
strput(str,&encbin,enclen/2,"utf-16")
Varsetcapacity(passbin,passlen+=mod((4-mod(passlen,4)),4),0)
strput(pass,&passbin,strlen(pass),"utf-8")
_encryptbin(&encbin,enclen,&passbin,passlen)
return _crypttobase64(&encbin,enclen)
}

decryptStr(str="",pass="")
{
If !((strput(str,"utf-16")*2))
    return "Error: Nothing to Decrypt"
If !((passlen:=strput(pass,"utf-8")-1))
    return "Error: No Pass"
Varsetcapacity(passbin,passlen+=mod((4-mod(passlen,4)),4),0)
strput(pass,&passbin,strlen(pass),"utf-8")
enclen:=_cryptfrombase64(str,encbin)
_decryptbin(&encbin,enclen,&passbin,passlen)
return strget(&encbin,"utf-16")
}

_MCode(mcode)
{
  static e := {1:4, 2:1}, c := (A_PtrSize=8) ? "x64" : "x86"
  if (!regexmatch(mcode, "^([0-9]+),(" c ":|.*?," c ":)([^,]+)", m))
    return
  if (!DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", 0, "uint*", s, "ptr", 0, "ptr", 0))
    return
  p := DllCall("GlobalAlloc", "uint", 0, "ptr", s, "ptr")
  if (c="x64")
    DllCall("VirtualProtect", "ptr", p, "ptr", s, "uint", 0x40, "uint*", op)
  if (DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", p, "uint*", s, "ptr", 0, "ptr", 0))
    return p
  DllCall("GlobalFree", "ptr", p)
}

_encryptbin(bin1pointer,bin1len,bin2pointer,bin2len){
  static encrypt := _MCode("2,x86:U1VWV4t0JBCLTCQUuAAAAAABzoPuBIsWAcKJFinCAdAPr8KD6QR164tsJByLfCQYi3QkEItMJBSLH7gAAAAAixYBwjHaiRYx2inCAdAPr8KDxgSD6QR154PHBIPtBHXQuAAAAABfXl1bww==,x64:U1ZJicpJidNMidZMidlIAc64AAAAAEiD7gSLFgHCiRYpwgHQD6/CSIPpBHXpuAAAAABBixhMidZMidmLFgHCMdqJFjHaKcIB0A+vwkiDxgRIg+kEdeVJg8AESYPpBHXbuAAAAABeW8M=") ;reserved
b:=0
Loop % bin1len/4
{
a:=numget(bin1pointer+0,bin1len-A_Index*4,"uint")
numput(a+b,bin1pointer+0,bin1len-A_Index*4,"uint")
b:=(a+b)*a
}
Loop % bin2len/4
{
c:=numget(bin2pointer+0,(A_Index-1)*4,"uint")
b:=0
Loop % bin1len/4
{
a:=numget(bin1pointer+0,(A_Index-1)*4,"uint")
numput((a+b)^c,bin1pointer+0,(A_Index-1)*4,"uint")
b:=(a+b)*a
}
}
}

_decryptbin(bin1pointer,bin1len,bin2pointer,bin2len){
  static decrypt := _MCode("2,x86:U1VWV4tsJByLfCQYAe+D7wSLH7gAAAAAi3QkEItMJBSLFjHaKcKJFgHQD6/Cg8YEg+kEdeuD7QR11LgAAAAAi3QkEItMJBQBzoPuBIsWKcKJFgHQD6/Cg+kEde24AAAAAF9eXVvD,x64:U1ZJicpJidNNAchJg+gEuAAAAABBixhMidZMidmLFjHaKcKJFgHQD6/CSIPGBEiD6QR16UmD6QR140yJ1kyJ2UgBzrgAAAAASIPuBIsWKcKJFgHQD6/CSIPpBHXruAAAAABeW8M=") ;reserved

Loop % bin2len/4
{
c:=numget(bin2pointer+0,bin2len-A_Index*4,"uint")
b:=0
Loop % bin1len/4
{
a:=numget(bin1pointer+0,(A_Index-1)*4,"uint")
numput(a:=(a^c)-b,bin1pointer+0,(A_Index-1)*4,"uint")
b:=(a+b)*a
}
}
b:=0
Loop % bin1len/4
{
a:=numget(bin1pointer+0,bin1len-A_Index*4,"uint")
numput(a:=a-b,bin1pointer+0,bin1len-A_Index*4,"uint")
b:=(a+b)*a
}
}

_crypttobase64(binpointer,binlen)
{
    s:=0
    DllCall("crypt32\CryptBinaryToStringW","ptr",binpointer,"uint",binlen,"uint",1,"ptr",   0,"uint*",s)
    VarSetCapacity(out,s*2,0)
    DllCall("crypt32\CryptBinaryToStringW","ptr",binpointer,"uint",binlen,"uint",1,"ptr",&out,"uint*",s)
    return strget(&out,"utf-16")
}

_cryptfrombase64(string,byref bin)
{
    DllCall("crypt32\CryptStringToBinaryW", "wstr",string,"uint",0,"uint",1,"ptr",0,"uint*",s,"ptr",0,"ptr",0)
    VarSetCapacity(bin,s,0)
    DllCall("crypt32\CryptStringToBinaryW", "wstr",string,"uint",0,"uint",1,"ptr",&bin,"uint*",s,"ptr",0,"ptr",0)
    return s
}
Den Sourcecode der MCode Funktionen könnt ihr von mir per PM haben.
(Es ist nicht so als könnte man dann die Verschlüsselung knacken, aber ich arbeite noch an der richtigen Lizenz.)

Ich freue mich immer über Rückmeldungen also sagt was. :D
Recommends AHK Studio
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 05:47

Kann es gerade leider nich testen, aber ich würde schon mal Anspruch darauf anmelden, einen Blick auf den MCode zu werfen. :D
Ich gehe mal von C++ aus, richtig?
"Nothing is quieter than a loaded gun." - Heinrich Heine
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 06:06

Assembly NASM slang.
Recommends AHK Studio
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 06:20

Inwiefern ist 'slang' in dem Zusammenhang zu verstehen? :D
"Nothing is quieter than a loaded gun." - Heinrich Heine
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 06:27

Es gibt verschiedene "Slangs"(so nenn ich es) bei Assembly.
Ein Slang wird durch den verwendeten Compiler beschrieben, in diesem Fall NASM (einfach zu verstehen und zu benuzten und zu lesen)
An sich gibt es noch MASM (Microsoft's Macro Assembler, dieser "Slang" wird bei VC++ als inline assembly verwendet) und noch ein paar andere.
Recommends AHK Studio
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 06:32

Ok, alles klar. Danke. Ich werd das heute noch ausprobieren... :)
"Nothing is quieter than a loaded gun." - Heinrich Heine
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 10:57

Gefällt mir gut!

Allerdings, vergiss nicht hier auch Bentschi's MCode Funktion mit zu posten:

Code: Select all

;MCode() by Bentschi
;http://www.autohotkey.com/board/topic/89253-mcode-funktion-onlinegenerator-x86-und-x64/

MCode(mcode)
{
  static e := {1:4, 2:1}, c := (A_PtrSize=8) ? "x64" : "x86"
  if (!regexmatch(mcode, "^([0-9]+),(" c ":|.*?," c ":)([^,]+)", m))
    return
  if (!DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", 0, "uint*", s, "ptr", 0, "ptr", 0))
    return
  p := DllCall("GlobalAlloc", "uint", 0, "ptr", s, "ptr")
  if (c="x64")
    DllCall("VirtualProtect", "ptr", p, "ptr", s, "uint", 0x40, "uint*", op)
  if (DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", p, "uint*", s, "ptr", 0, "ptr", 0))
    return p
  DllCall("GlobalFree", "ptr", p)
}
Die hat schließlich nicht jeder in der Standard Lib. ;)
"Nothing is quieter than a loaded gun." - Heinrich Heine
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: nnnik's Encrypt/Decrypt V2

23 Dec 2013, 13:08

Oh ja und ich sollte erwähnen, dass es für 64 Bit noch nicht gemacht ist.
Recommends AHK Studio
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: nnnik's Encrypt/Decrypt V2.1.0

26 Dec 2013, 09:23

Update auf v2.1
Ein bug fix der auftreten könnte.
64 bit Code hinzugefügt
Keine Includes mehr notwendig.
Recommends AHK Studio
User avatar
Gurkentoepfer
Posts: 49
Joined: 24 Feb 2014, 14:52

Re: nnnik's Encrypt/Decrypt V2.1.0

28 Nov 2014, 04:49

Hi nnnik,
das Ver- und Entschlüsseln funktioniert gut, wenn ich den Schlüssel "Original" verwende
(klar - soll ja auch einmalig sein).
Dieser Original-Schlüssel kann jedoch auch Absatzendezeichen enthalten [CR] [LF],
speichere ich diesen Schlüssel in einer ini-Datei und lese sie später wieder aus,
kommt nix sinnvolles mehr raus, weil alles nach dem [CR][LF] nicht mehr eingelesen wird.

Beispiel:

Code: Select all

#Include core.ahk ; nnniks Encrypt/Decrypt-Funktionen

c:=encryptstr("dies ist das Haus vom nnnik-olaus","abc")

MsgBox Encrypted String=>>%c%<<

IniWrite, %c%, %A_ScriptDir%\name.ini, miscellaneous, c
Sleep, 1000
IniRead, c, %A_ScriptDir%\name.ini, miscellaneous, c

o:=decryptstr(c,"abc")
Msgbox Original String=>>%o%<<

Welche Vorgehensweise empfiehltst Du mir,
wenn ich den verschlüsselten string in einer Datei abspeichern,
und später wieder auslesen möchte?
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: nnnik's Encrypt/Decrypt V2.1.0

28 Nov 2014, 07:07

Du kannst per FileObject sehr gut auf Dateien zugreifen.
Ich würde Dann die Länge des Passworts in einem integer speichern und darauf folgend das Passwort.
Du kannst so auch verschiedene Daten in einer Datei speichern. Du müsstest dir halt bloß den Typ der Daten in einem zusätzlichen Feld merken.
Dieser Dateityp gefällt mir persönlich am besten,da man damit alle Arten von Daten abspeichern kann.
Recommends AHK Studio

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 24 guests