Verschlüsseln und 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 einziger Aufruf von Powershell ist.Ich dachte, ich hätte es geschafft, aber mir wurde klar, dass einfache oder doppelte Anführungszeichen mich verwirren, 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 machen.Ich glaube, ich bin einfach kaputt, weil ich JSL, C und Powershell entkomme.
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);
Qualitäts- und VerfahrenstechnikBetreff: Verschlüsseln und Entschlüsseln mit PowershellIch dachte eher an das, was unten steht, es sei denn, Sie müssen die äußere Listenstruktur in Powershell beibehalten?Ich glaube nicht, dass Sie das Powershell-Array überhaupt benötigen, es sei denn, die von Ihnen verwendete Verschlüsselungsfunktion erfordert es.
Names default to here(1);
to_pwsh_array = function({input, wrap_string = 1},
{DEFAULT LOCAL},
init_str = "@(\\!"" || substitute(char(input),"\!"","[quote]") || "\\!")";
);
from_pwsh_array = function({input}, {default local},
notrailingnewline = regex(rp,"(.*)\!N","\1");
replacedquotes = substitute(notrailingnewline, "[quote]", "\!"");
parsed = parse(replacedquotes);
parsed;
);
checkvalue = function( {in},
rp = Run Program(
Executable("powershell"),
Options(to_pwsh_array(in)),
ReadFunction("text")
);
out = from_pwsh_array(rp);
show(in, to_pwsh_array(in), rp, out, in == out);
in != out;
);
if(
sum(
checkvalue( Expr( {"Fake", {Empty(), "String"}} ) );
checkvalue( Expr( {"Fa'ke\!"", {Empty(), "Str'\!"ing"}} ) );
) > 0,
write("\!N\!NFailed"),
write("\!N\!NSuccess")
);Betreff: Verschlüsseln und Entschlüsseln mit PowershellIch habe versucht, das mit [Zitat] zu machen, konnte es aber aufgrund der Art und Weise, wie char(Liste mit Zeichenfolgen) funktioniert, 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, die alle Dinge in das umwandelt, was ich brauche, und dann nur die oberste Ebene umschließt.Falls das irgendeinen Sinn ergibt.
Names default to here(1);
ll = {"Fak'e\!"", {Empty(), "Str'\!"ing"}};
char(ll); // "{\!"Fak'e\!\!\!"\!", {Empty(), \!"Str'\!\!\!"ing\!"}}"
Betreff: Verschlüsseln und Entschlüsseln mit PowershellKönnten Sie die Anführungszeichen in JSL durch etwas ersetzen, das kein Anführungszeichen enthält, und sie dann mithilfe von Ersetzen wieder in Powershell ersetzen?
Betreff: Verschlüsseln und Entschlüsseln mit PowershellIch denke, der Knackpunkt liegt darin, zu/von einem Powershell-Array zu wechseln.
Vielleicht erleichtert das das Verständnis
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);