Verschlüsseln Entschlüsseln mit PowershellIch versuche, eine Liste gültiger JSL mit Runprogram/Powershell zu verschlüsseln.Aus Leistungsgründen ist es wichtig, dass dies nur ein einzelner Aufruf von Powershell ist.Ich dachte, ich hätte es funktioniert, habe aber festgestellt, dass einfache oder doppelte Anführungszeichen mich durcheinander bringen, wenn es sich um verschachtelte Listen handelt.
Außerdem kann ich NICHT in eine Datei schreiben und diese von Powershell lesen lassen.Funktioniert super, darf es aber nicht.Ich glaube, ich bin einfach kaputt, als ich JSL und C und Powershell entkommen bin.
Names default to here(1);
encryption_key = J(16, 1, randominteger(0, 255));
unencrypted_input = {"Fa'ke\!"", {Empty(), "Str'\!"ing"}}; // this one breaks me
unencrypted_input = {"Fake", {Empty(), "String"}}; // this one is fine
print("encryptng");
init_str = "@("; // creating a powershell array
for(i=1, i<=nitems(unencrypted_input), i++,
if(i!=1, init_str ||= ", ");
item = unencrypted_input[i];
// for encrypt we want to put it in quotes so we can pull it out later so we can parse;
if( isstring(item), item = "\!""||char(item)||"\!"");
// because of the way runprogram works we have to C escape the quotes as well
init_str ||= "\\!""||substitute(char(item), "\!"", "'")||"\\!"";
);
init_str ||= ")";
exec_str = init_str || " | ConvertTo-SecureString -AsPlainText -Force"
|| " | ConvertFrom-SecureString -Key " || Substitute(char(encryption_key), "[", "(", "]", ")");
write("\!n"||exec_str);
rp = Run Program(
Executable("powershell"),
Options(exec_str),
ReadFunction("text")
);
print("");
show(rp);
encrypted_list = words(rp, "\!n\!r");
print("decrypting");
// now to decrypt
init_str = "@("; // creating a powershell array
for(i=1, i<=nitems(encrypted_list), i++,
if(i!=1, init_str ||= ", ");
item = encrypted_list[i];
// because of the way runprogram works we have to C escape the quotes as well
init_str ||= "\\!""||substitute(char(item), "\!"", "'")||"\\!"";
);
init_str ||= ")";
exec_str = init_str || " | ConvertTo-SecureString -Key " || Substitute(char(encryption_key), "[", "(", "]", ")")
|| " | ForEach-Object {"// doing this in a loop in case of multiple lines
|| "$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($_);"
|| "[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)}";
write("\!n"||exec_str);
rp = Run Program(
Executable("powershell"),
Options(exec_str),
ReadFunction("text")
);
print("");
show(rp);
dec_list = Words(rp, "\!n\!r");
for(i=1, i<=nitems(dec_list), i++,
r = substitute(dec_list[i], "'", "\!"");
r = parse(r); // parse it because we wrapped everything
dec_list[i] = r;
);
show(dec_list, unencrypted_input);
show(dec_list == unencrypted_input);
SkriptingBetreff: Verschlüsseln Entschlüsseln mit PowershellIch denke, der Knackpunkt liegt darin, zu / von einem Powershell-Array zu gehen.
Vielleicht ist das verständlicher
Names default to here(1);
//unencrypted_input = {"Fa'ke\!"", {Empty(), "Str'\!"ing"}}; // this one breaks me
unencrypted_input = {"Fake", {Empty(), "String"}}; // this one is fine
to_pwsh_array = function({input, wrap_string = 1},
// wrap string because the inputs for decrypt aren't valid JSL so we don't want to wrap those
{DEFAULT LOCAL},
init_str = "@("; // creating a powershell array
for(i=1, i<=nitems(input), i++,
if(i!=1, init_str ||= ", ");
item = input[i];
// for encrypt we want to put it in quotes so we can pull it out later so we can parse;
if( wrap_string & isstring(item), item = "\!""||char(item)||"\!"");
// because of the way runprogram works we have to C escape the quotes as well
init_str ||= "\\!""||substitute(char(item), "\!"", "'")||"\\!"";
);
init_str ||= ")";
);
from_pwsh_array = function({input},
final_list = Words(input, "\!n\!r");
for(i=1, i<=nitems(final_list), i++,
r = substitute(final_list[i], "'", "\!"");
r = parse(r); // parse it because we wrapped everything
final_list[i] = r;
);
return(final_list);
);
rp = Run Program(
Executable("powershell"),
Options(to_pwsh_array(unencrypted_input)),
ReadFunction("text")
);
out = from_pwsh_array(rp);
show(out == unencrypted_input);Betreff: Verschlüsseln Entschlüsseln mit PowershellKönnten Sie die Anführungszeichen in JSL durch etwas ersetzen, das kein Anführungszeichen enthält, und sie dann mit Ersetzen wieder in Powershell ersetzen?
Betreff: Verschlüsseln und Entschlüsseln mit PowershellIch habe versucht, das mit [quote] zu tun, aber ich konnte es wegen der Funktionsweise von char (Liste mit Zeichenfolgen) nicht zum Laufen bringen.Ich kann Powershell nicht dazu bringen, mir Anführungszeichen zurückzugeben, es entfernt nur die Anführungszeichen. Wenn ich es also wieder einziehe (wenn es auch Anführungszeichen enthält), vermasselt es die Analyse.Ich könnte vielleicht eine rekursive Funktion mit Tiefe erstellen, damit sie hineingeht und alle Dinge in das verwandelt, was ich brauche, und dann nur die oberste Ebene umschließt.Falls das Sinn macht.
Names default to here(1);
ll = {"Fak'e\!"", {Empty(), "Str'\!"ing"}};
char(ll); // "{\!"Fak'e\!\!\!"\!", {Empty(), \!"Str'\!\!\!"ing\!"}}"