Page 1 of 1

nnnik's Encrypt/Decrypt V2.1.0

Posted: 22 Dec 2013, 15:06
by nnnik
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

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 05:47
by Alibaba
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?

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 06:06
by nnnik
Assembly NASM slang.

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 06:20
by Alibaba
Inwiefern ist 'slang' in dem Zusammenhang zu verstehen? :D

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 06:27
by nnnik
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.

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 06:32
by Alibaba
Ok, alles klar. Danke. Ich werd das heute noch ausprobieren... :)

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 10:57
by Alibaba
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. ;)

Re: nnnik's Encrypt/Decrypt V2

Posted: 23 Dec 2013, 13:08
by nnnik
Oh ja und ich sollte erwähnen, dass es für 64 Bit noch nicht gemacht ist.

Re: nnnik's Encrypt/Decrypt V2.1.0

Posted: 26 Dec 2013, 09:23
by nnnik
Update auf v2.1
Ein bug fix der auftreten könnte.
64 bit Code hinzugefügt
Keine Includes mehr notwendig.

Re: nnnik's Encrypt/Decrypt V2.1.0

Posted: 28 Nov 2014, 04:49
by Gurkentoepfer
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?

Re: nnnik's Encrypt/Decrypt V2.1.0

Posted: 28 Nov 2014, 07:07
by nnnik
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.