Clever-Excel-Forum

Normale Version: [LAMBDA] CRYPT
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
CRYPT

Beschreibung:
Verschlüsselt oder entschlüsselt einen Text mit Schlüssel

Syntax:
=CRYPT(Text;Schlüssel;verschlüsseln)

Beispiel:
=CRYPT("Das ist zu verschlüsseln";"This is a passphrase";1) ergibt: x©¼s²Æµp»ÈsÆÄ´¶ d¼Æ®¿¯
=CRYPT("x©¼s²Æµp»ÈsÆÄ´¶ d¼Æ®¿¯";"This is a passphrase";0) ergibt: Das ist zu verschlüsseln

Code:
=LAMBDA(c;k;x;LET(
e;SEQUENZ(LÄNGE( c));f;CODE(TEIL(c;e;1))-32;
l;WECHSELN(k;" ";);m;LÄNGE(l);n;CODE(TEIL(l;REST(e-1;m)+1;1))-32;
TEXTVERKETTEN(;;ZEICHEN(REST(f+n*(1-2*x);224)+32))))


Anmerkungen:
Hier findet nur die nackte Ver- und Entschlüsselung eines Bezugs oder Texts statt. Wünschenswert wäre natürlich die Verschlüsselung eines Excel-Ranges als Text, toll z.B. für einen E-Mail-Text. Verminderte Sicherheit besteht dadurch, dass ein bloßes Falschschreiben des Schlüssels noch zu lesbarer Entschlüsselung führen kann. Sonst hätten die einzelnen Schlüsselzeichen-Codes iterativ voneinander abhängig gemacht werden müssen, was eine Iterationseinstellung nötig machen würde. Daher kommt alles auf den Gebrauch eines guten Schlüssels an, der selbst lang und verschlüsselt sein sollte (Ascii 32-255 nötig, wie auch beim Text). Im LAMBDA()-Code finden in der 2. Zeile Text-Berechnungen statt, in der 3. Zeile Schlüssel-Berechnungen und in der 4. Zeile die Ver-/Entschlüsselung.

Ich hatte zuerst ohne das manuelle 3. Argument formuliert, aber bei jener "Automatik" bestand die Gefahr, dass das Schlüsselwort durch geschicktes Manipulieren herausgekommen wäre!
=LAMBDA(c;k;x;LET( 
d;WENN(SPALTEN( c)*ZEILEN( c)>1;MATRIXZUTEXT(WENN(c="";"";c);1);c); 
e;SEQUENZ(LÄNGE(d));f;CODE(TEIL(d;e;1))-32; 
l;WECHSELN(k;" ";);n;CODE(TEIL(l;REST(e-1;LÄNGE(l))+1;1))-32; 
TEXTVERKETTEN(;;ZEICHEN(REST(f+n*(1-2*x);224)+32))))


ist die Erweiterung von CRYPT auf einen Range 
(vielen Dank an MS für MATRIXZUTEXT; damit erst ist die Funktion sprach/regionsunabhängig).

Der zurück entschlüsselte Range wird jedoch, da ich wegen angestrebtem .xlsx kein =AUSWERTEN() verwenden kann, als 

={"a".1;"b".3}

zurückgegeben, nicht gleich als

a 1
b 3

Man muss den Range somit manuell dann (aufgrund AUSWERTEN-Verzichts) nacheinander
a) als Inhalte einfügen - Werte
b) mit F2-Enter dynamisch in die Zellen füllen

Ich denke, dass diese Schritte akzeptabel sind (oder sein können), wenn man bedenkt, dass man durchaus größere Arrays verschlüsselt als Text z.B. in E-Mails überführen kann.
_______________________

Wer mit .xlsm oder .xlsb arbeiten kann, kann es sich aber mit der bloßen Erweiterung um AUSWERTEN wie folgt gemütlich machen:

=LAMBDA(c;k;x;LET( 
d;WENN(SPALTEN( c)*ZEILEN( c)>1;MATRIXZUTEXT(WENN(c="";"";c);1);c); 
e;SEQUENZ(LÄNGE(d));f;CODE(TEIL(d;e;1))-32; 
l;WECHSELN(k;" ";);n;CODE(TEIL(l;REST(e-1;LÄNGE(l))+1;1))-32; 
AUSWERTEN(TEXTVERKETTEN(;;ZEICHEN(REST(f+n*(1-2*x);224)+32)))))


Wird diese Funktion in einer .xlsx nicht abgespeichert, klappt sie auch dort (also flüchtig). Vorsicht: Arbeit sichern wegen Absturzgefahr bei Auto-Speichern.
Moin,

sehr schön :-)

Gruß