ChatGPT mit mittlerer Aufgabenstellung getestet

Aug 25, 2026 Last reply: 1 week ago 29 Replies

Ich habe mal zum Test eine genaue und vollständige Aufgabenstellung formuliert und diese MS-Copilot vorgelegt:


---------------------------------------------------------------------------------------------------- Nachfolgend wird eine Programmieraufgabe beschrieben. Aufgabenstellung: Ein Skript für das Shell-Programm bash soll hergestellt werden. Dieses Skript soll jeweils eine Datei variabel verschlüsseln oder entschlüsseln. Das Skript soll 2 oder optional 3 Argumente entgegen nehmen. Das erste Argument soll die zu bearbeitende Datei angeben. Das zweite Arg soll 1 bis 6 Zeichen angeben, { die die Verschlüsselungs-Algorithmen kennzeichnen und gleichzeitig die Reihenfolge ihrer Verwendung anzeigen. Jeder Algorithmus kann mehr als 1-mal angegeben werden. Diese 1 bis 6 Zeichen sollen als Endung mit Punkt vorne an den Dateinamen (Arg1) des nun verschlüsselten Inhalts der Datei angehängt werden. Von diesem Inhalt soll ein Hash sha3_256 genommen und aufbewahrt werden. Diese Backup-Inhalte sind für die Aufbewahrung im Internet beabsichtigt. } Es sollen 3 Algorithmen zur Auswahl vorhanden sein. Mindestens 2 der 3 Algorithmen sollen kryptographische Qualität besitzen. Die Algorithmen sollen Argumente für eine Input-Datei und eine Output-Datei entgegen nehmen.



Das zweite Arg soll mit einem geeigneten Zeichen eine Entschlüsselung anzeigen. Das erste Arg enthält hierbei den Dateinamen mit der speziellen Endung aus 1 bis 6 Zeichen. Diese 1 bis 6 Zeichen sollen zur internen Steuerung verwendet werden. Vor dem Entschlüsselungsvorgang soll der zugehörige Hash auf Gleichheit geprüft werden.



Optional kann links als erstes Arg ein wählbares Arbeitsverzeichnis angegeben werden. Die bisherigen Arg1 und Arg2 werden dadurch zu Arg2 und Arg3.



Jemand, der den Dateinamen des verschlüsselten Inhalts betrachtet, soll durch die dort angegebenen 1 bis 6 Zeichen der Endung nicht die verwendeten Algorithmen erkennen können. Es soll hier folglich eine Verschleierung wirken. Der Aufwand dieser Verschleierung soll gering gehalten werden, weil bei Verwendung von mehr als einer Verschlüsselung hintereinander zu keinem Zeitpunkt der Erfolg eines Entschlüsselungs-Versuchs eines Angreifers erkennbar ist.



----------------------------------------------------------------------------------------------------



Prinzipiell hat ChatGPT seine Aufgabe korrekt erfüllt. Das war erwartbar, weil meine Anforderung vollständig und logisch stimmig ist. ChatGPT blieb daher nicht anderes übrig, als brauchbar zu antworten. Ich habe ChatGPT allerdings bewußt einige Freiheiten gelassen.



Vor konkreter Inbetriebnahme als Werkzeug in der Praxis muß seine Ausgabe allerdings einer gründlichen Untersuchung unterzogen werden, die wohl von allerlei Änderungen und Erweiterungen gefolgt werden muß, so scheint mir.


ChatGPT: ==================================================================================================== #!/usr/bin/env bash set -euo pipefail



# ------------------------------------------------------------ # konfigurierbare Zuordnung "verschleierter" Zeichen -> Algorithmen # mind. 2 kryptographisch, 1 optional nicht-kryptographisch # # Wir verwenden hier: # X -> AES-256-CBC (OpenSSL, symmetrisch, kryptographisch) # 7 -> CHACHA20 (OpenSSL, symmetrisch, kryptographisch) # _ -> gzip (Kompression, nicht kryptographisch) # # Die Zeichen X,7,_ verraten die Algorithmen nicht direkt. # ------------------------------------------------------------



# Pfad zu openssl und gzip OPENSSL_BIN=openssl GZIP_BIN=gzip



usage() { cat <<EOF Usage: Verschlüsseln: $0 [arbeitsverzeichnis] <datei> <seq>



<seq> = 1..6 Zeichen aus {X,7,_}, Reihenfolge = Reihenfolge der Algorithmen Ergebnis: <datei>.<seq> und Hash-Datei <datei>.<seq>.sha3

Entschlüsseln: $0 [arbeitsverzeichnis] <datei.muster> d <datei.muster> = Dateiname mit Endung .<seq>



'd' = Entschlüsselungsmodus Vor Entschlüsselung wird Hash aus <datei>.<seq>.sha3 geprüft.



Beispiele: $0 geheim.txt X7_ $0 geheim.txt.X7_ d $0 /tmp geheim.txt X7_ EOF exit 1 }



# ------------------------------------------------------------ # Algorithmus-Funktionen: jeweils in/out-Datei # ------------------------------------------------------------



algo_X_encrypt() { local in="$1" out="$2" pass="$3" "$OPENSSL_BIN" enc -aes-256-cbc -pbkdf2 -salt \ -in "$in" -out "$out" -pass pass:"$pass" }



algo_X_decrypt() { local in="$1" out="$2" pass="$3" "$OPENSSL_BIN" enc -d -aes-256-cbc -pbkdf2 \ -in "$in" -out "$out" -pass pass:"$pass" }



algo_7_encrypt() { local in="$1" out="$2" pass="$3" "$OPENSSL_BIN" enc -chacha20 -pbkdf2 -salt \ -in "$in" -out "$out" -pass pass:"$pass" }



algo_7_decrypt() { local in="$1" out="$2" pass="$3" "$OPENSSL_BIN" enc -d -chacha20 -pbkdf2 \ -in "$in" -out "$out" -pass pass:"$pass" }



algo__encrypt() { local in="$1" out="$2" "$GZIP_BIN" -c "$in" > "$out" }



algo__decrypt() { local in="$1" out="$2" gunzip -c "$in" > "$out" }



# ------------------------------------------------------------ # Hilfsfunktionen # ------------------------------------------------------------



calc_sha3() { local file="$1" hashfile="$2" "$OPENSSL_BIN" dgst -sha3-256 "$file" > "$hashfile" }



check_sha3() { local file="$1" hashfile="$2" if [ ! -f "$hashfile" ]; then echo "Fehler: Hash-Datei '$hashfile' fehlt." >&2 exit 1 fi local current stored current=$("$OPENSSL_BIN" dgst -sha3-256 "$file") stored=$(cat "$hashfile") if [ "$current" != "$stored" ]; then echo "Fehler: Hash-Prüfung fehlgeschlagen (Integrität verletzt)." >&2 exit 1 fi }



apply_encrypt_sequence() { local infile="$1" seq="$2" outfile="$3" pass="$4"



local tmp_in="$infile" local tmp_out



for ((i=0; i<${#seq}; i++)); do local c="${seq:i:1}" tmp_out="$(mktemp)"



case "$c" in X) algo_X_encrypt "$tmp_in" "$tmp_out" "$pass" ;; 7) algo_7_encrypt "$tmp_in" "$tmp_out" "$pass" ;; _) algo__encrypt "$tmp_in" "$tmp_out" ;; *) echo "Unbekanntes Algorithmus-Zeichen: '$c'" >&2 rm -f "$tmp_out" exit 1 ;; esac



# nächster Schritt: tmp_out wird zum neuen tmp_in if [ "$tmp_in" != "$infile" ]; then rm -f "$tmp_in" fi tmp_in="$tmp_out" done



mv "$tmp_in" "$outfile" }



apply_decrypt_sequence() { local infile="$1" seq="$2" outfile="$3" pass="$4"



local tmp_in="$infile" local tmp_out



# Entschlüsselung in umgekehrter Reihenfolge for ((i=${#seq}-1; i>=0; i--)); do local c="${seq:i:1}" tmp_out="$(mktemp)"



case "$c" in X) algo_X_decrypt "$tmp_in" "$tmp_out" "$pass" ;; 7) algo_7_decrypt "$tmp_in" "$tmp_out" "$pass" ;; _) algo__decrypt "$tmp_in" "$tmp_out" ;; *) echo "Unbekanntes Algorithmus-Zeichen: '$c'" >&2 rm -f "$tmp_out" exit 1 ;; esac



if [ "$tmp_in" != "$infile" ]; then rm -f "$tmp_in" fi tmp_in="$tmp_out" done



mv "$tmp_in" "$outfile" }



# ------------------------------------------------------------ # Argumente auswerten (inkl. optionalem Arbeitsverzeichnis) # ------------------------------------------------------------



if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then usage fi



workdir="." file_arg="" seq_or_flag=""



if [ "$#" -eq 3 ]; then workdir="$1" file_arg="$2" seq_or_flag="$3" else file_arg="$1" seq_or_flag="$2" fi



cd "$workdir"



# ------------------------------------------------------------ # Modus bestimmen: Verschlüsseln vs. Entschlüsseln # ------------------------------------------------------------



if [ "$seq_or_flag" = "d" ]; then # Entschlüsselung enc_file="$file_arg"



if [ ! -f "$enc_file" ]; then echo "Fehler: Datei '$enc_file' nicht gefunden." >&2 exit 1 fi



# Dateiname und Sequenz aus Endung extrahieren: # erwartet: name.<seq>



base="${enc_file%.*}" seq="${enc_file##*.}"



if [ -z "$seq" ] || [ "${#seq}" -gt 6 ]; then echo "Fehler: ungültige Sequenz in Dateiendung." >&2 exit 1 fi



hashfile="${enc_file}.sha3" check_sha3 "$enc_file" "$hashfile"



# Passphrase abfragen (für kryptographische Algorithmen) read -r -s -p "Passphrase für Entschlüsselung: " pass echo



out_file="$base" # ursprünglicher Name ohne .<seq>



apply_decrypt_sequence "$enc_file" "$seq" "$out_file" "$pass"



echo "Entschlüsselt: $out_file"



else # Verschlüsselung plain_file="$file_arg" seq="$seq_or_flag"



if [ ! -f "$plain_file" ]; then echo "Fehler: Datei '$plain_file' nicht gefunden." >&2 exit 1 fi



if [ -z "$seq" ] || [ "${#seq}" -gt 6 ]; then echo "Fehler: Sequenz muss 1..6 Zeichen lang sein." >&2 exit 1 fi



# Passphrase abfragen (für kryptographische Algorithmen) read -r -s -p "Passphrase für Verschlüsselung: " pass echo



out_file="${plain_file}.${seq}"



apply_encrypt_sequence "$plain_file" "$seq" "$out_file" "$pass"



# Hash des verschlüsselten Inhalts berechnen und speichern hashfile="${out_file}.sha3" calc_sha3 "$out_file" "$hashfile"



echo "Verschlüsselt: $out_file" echo "Hash gespeichert in: $hashfile" fi ====================================================================================================



Was nun? Copilot oder ChatGPT? Das sind zwei verschiedene Paar Schuhe.

Wenn ich mir den Code, der rausfällt, dann so anschaue, dann hast du nun zwei Optionen: Du vertraust dieser KI blind und führst das einfach aus ODER du hast jetzt erstmal ein/zwei Stunden damit zu tun diesen Code zu reviewen.

Wenn ich mir deinen umfangreichen Prompt und das Resultat (welches ich auf jeden Fall noch Zeile für Zeile reviewen wollen würde BEVOR das zur Ausführung kommt) so anschaue, dann bestärkt mich das in meiner Meinung, dass ich einfache Skripte dann lieber selbst schreibe anstatt erst umfangreich einer KI zu beschreiben was ich haben will.

Gruß

Manuel

Am 25.08.2026 um 12:57 schrieb Helmut Schellong:

Ich habe mal zum Test die Aufgabe ein Mathematica-Script zu erzeugen, dass aus dem Line-In der Soundkarte das DCF77-Signal zu dekodioeren.

Die Aufgabe wurde von ChatGPT gelöst, aber nur nach 10 Maligen zurücksetzen eins Lösungsvorschlage und Neuanforderung.

Fürchterlich!

formatting link

:)

Im Grunde ist das genau mein Ansatz und möchte ich Dir voll zustimmen. Praktisch ist es nicht so einfach.

Ich habe etliche immer noch viel und regelmäßig genutzte Skripte für

4DOS auf Windows98. Die 4DOS Helpfiles sind hervorragend und eignen sich gleich gut als Lehrbuch und Nachschlagewerk. Damit war es kein Problem und kann ich noch heute auf Anhieb laufende Skripte schreiben.

Jetzt ziehe ich zunehmend zu Windows 10 um. Eine auch nur ansatzweise brauchbare Doku zu CMD finde ich nirgends, nur den ungeordneten Wust der Microsoft Website. Ein Skript zu lesen und zu verstehen ist weit einfacher, als es in korrekter und fehlerfreier Syntax zu schreiben. Also lasse ich meine alten Skripte mit bisher gutem Erfolg von ChatGPT übersetzen.

Korrekturlesen und ein erster Test an unkritischem Ort sind selbstverständlich.

Wikipedia: "Copilot nutzt das Large Language Model GPT-5 von OpenAI" Darauf kommt es mir an.

Nach etwa 10 s Ansicht wußte ich, daß das nach Ausführung unter Unix aussieht. Bereits die Shebang-Konstruktion... Ich muß unter FreeBSD mal testen, ob 'Shebang/usr/bin/env bash' und 'openssl' direkt nutzbar sind.

Bei jedem Skript-Aufruf den Key für jede verwendete Verschlüsselung per Hand einzugeben, ist ein NoGo. Außerdem ist nicht klar, wie ein Key (per 'read') inhaltlich aussehen muß. Das Merken des Hashes habe ich selbst viel besser gelöst. Ich bemerkte, daß die KI keine kreativen Eigenentwicklungen (stellenweise) vornahm, auch nicht als Reaktion auf entsprechende Diskussionen - weil die KI solches eben gar nicht kann. Etc.

Wirklich blind vertrauen werde ich anderen Quellen nie. Die sind oft direkt gar nicht lauffähig.

Zumal ich auch Fehler bei Copilot bemerkte. Beispielsweise, daß { ... } ein Subshell-Aufruf sein soll. Als ich stattdessen ( ... ) erwähnte, redete sich die KI heraus, daß in der klassischen Bourne-Shell { ... } nur eine Gruppierung ist, in der bash jedoch nicht, was ich jedoch nicht glaube, weil man auf eine cmd-Gruppierung mittels { } in Shells nicht wirklich verzichten kann.

Ich beherrsche etwa 20 Programmiersprachen mehr oder weniger gut. Schon deshalb bin ich in der Lage, einfach alles selbst kreativ zu entwickeln.

Du vergißt, daß das von mir ein Test der KI war. Ich wollte genau wissen, wie meine Aufgabenstellung umgesetzt wird. Das beeinflußt künftige Fragestellungen von mir.

Meine Beschreibung an die KI finde ich eher nicht umfangreich - etwa 17..22 Minuten.

Das zugrunde liegende Skript 'encode.bish' für meine eigene Shell ist etwa 5 Monate alt und ebenso lange in Gebrauch. Die Lösung der KI ist konzeptionell interessant, weil eine andere Handschrift, jedoch mir nicht so erfreulich und zufriedenstellend, wie der Inhalt meines eigenen Skripts.

Eine Nutzung von KI ist nicht selten anregend und hin und wieder lehrreich. Denn KI kennt die Daten der Welt, beispielsweise wohl alle rfc8888, somit alle Programmiersprachen, und kann das alles superschnell handhaben. Das sind die Vorteile einer Maschine!

Leo Baumann schrieb:

Ich kann ähnliches berichten: Im Carport habe ich einen in der Zeitfolge einstellbaren Eltako Treppenlichtautomaten gehabt, der auf Bewegungsmelder 3 Minuten Licht m,achen sollte, auf Taster ebenfalls, aber auch 2 stundne Dauerlicht, wenn der Taster länger als 2 Sekunden festgehalten wird. Inkl. Bestätigungsflackern zum ein-und Ausschalten.

Der Eltako wich nun einem Shelly Pro2, weil ich vom Haus aus den Bewegungsmelder abschaltbar haben wollt, weil wegen Wind und Carportdach und Blechwand und dauernd Wiedereinschalten des Lichts. (mal flapsig ausgetdrückt)

Da ich keinerlei Ahnung von Jacascript habe und mich auhc gar nicht in Javascript und Shellyprogrammierung einarbeiten wollte, habe ich detailliert beschrieben was ich wollte. Das habe ich Gemini und ChatGPT zu fressen gegeben. Nach dem 10. Versuch bei Gemini habe ich aufgegeben, nach 10 Versuchen hatte ChatGPT ein brauchbares Skript produziert, das nun seit einem knappen Jahr zufriedenstellend das macht was es soll.

Leo Baumann wrote on 25.08.2026 15:03:

Wir haben dann beide typische Nachteile einer KI kennengelernt. Ich bemerke auch immer wieder, daß die KI nicht wirklich kreativ sein kann.

Du bist doch immer vollständig logisch und korrekt. Warum schreibst Du dann ChatGPT; wenn Du doch ein ganz anderes Frontend benutzt hast, das GPT-5 als Backend benutzt?

Ist FreeBSD etwa kein Unix?

Dann war wohl Dein Prompt suboptimal.

Grüße Marc

Hätte ChatGPT eine semantisch _andere_ Aufgaben-Lösung präsentiert, bei Nutzung desselben Modells und desselben Herstellers? Ich halte das (bei meiner Vorgabe) für ausgeschlossen.

Ich wählte die Bezeichnung ChatGPT, weil die jeder semantisch gut kennt. Copilot ist microsoft-spezifisch und weit weniger bekannt, so daß ich in Zukunft Copilot und 'KI' zusätzlich nennen werde. Ist dadurch etwas gewonnen? Ich meine, nein.

Streng gesehen ist FreeBSD ein unixoides System, kein Unix. Auch Linux ist nicht das originale Unix. Das wahre Unix kam zu Beginn von AT&T, oder später Unix386-SystemV von SCO.

Wieso? Mein Prompt hat mit dem NoGo nichts zu tun. Es ist semantisch etwas anderes. Willst Du anregen, daß Vorgaben für die KI künftig aus 0 Zeichen bestehen? Also Vorgabe per direkter Übergabe aus dem Gehirn?

Ich werde weiterhin Copilot von MS verwenden. Es ist in den Browser eingebaut, liest den aktuell offenen Tab, nimmt direkt oder durch Upload Texte entgegen, bietet die Modi 'Smart' und 'Deeper' an.

Du hältst Dich also auch in diesem Thema für unfehlbar, obwohl Du offensichtlich ungefähr keine Erfahrung mit dem Thema hast. Wie peinlich.

Ingenieure bemühen sich um exakte Formulierungen und Terminologie, um Mißverständnisse zu vermeiden. Deine Kommunikation ist uningenieurisch.

Du lenkst vom Thema, deiner mißverständlichen und fehlleitenden Ausdrucksweise ab.

Du redest wirr.

Und es wird von der Fachpresse im Allgemeinen als "unfertig" bezeichnet. Und es ist halt nicht ChatGPT, auch wenn am Ende dasselbe Modell verwendet wird.

Das kommt vielleicht erst mit der bezahlten Profi-Version :-). Oder auch nicht.

Grüße, H.

Meine Vorgabe läßt der KI keinen Raum für eine unbrauchbare Antwort. Das schätze ich so ein, aufgrund meiner immensen Ausbildung und Erfahrung. Ich habe mannigfaltig gelernt, wie so etwas gemacht wird. (Eine korrekte Funktion der KI vorausgesetzt.)

Die KI hatte innerhalb von wenigen Zehntel Sekunden auf meinen Anforderungstext komplett geantwortet, ohne irgendwelche Fragen oder Bemerkungen. Meine Erfahrung damit sagt mir, daß meine Formulierungen ziemlich optimal sind.

Zu Deinen Behauptungen: Ich habe mich noch nie als unfehlbar erklärt. Bei welchen Themen außerdem hatte ich mich mich als unfehlbar erklärt? Ich hätte 'ungefähr keine Erfahrung mit dem Thema', ist falsch.

Demnach sollte ich optimalerweise zu dem Begriff ChatGPT zurückkehren, denn alles andere ist offenbar noch schlimmer. Die Verwendung von 'Copilot' hatte Anderen gegenüber mehrfach Verwirrung ausgelöst. Die Verwendung von 'ChatGPT' jedoch nicht.

Und Du lenkst vom Thema im Subject ab, wie so oft.

Ich antworte immerhin auf Deine Fragen.

Das ist für mich irrelevant, mir kommt es auf dasselbe Modell vom selben Hersteller an. Ich schrieb das bereits. Warum ist das für mich irrelevant? Weil ich KI als Privatmann indirekt hobby-mäßig nutze. Das soll folglich alles möglichst komfortabel ablaufen. Spitzfindigkeiten außerhalb meines Prompt-Themas sind mir reichlich egal.

Ich war schon mal auf chatgpt.com und empfand das Erlebnis dort deutlich schlechter als in Copilot. Deshalb habe ich nennenswerte Erfahrung nur mit Copilot.

Offensichtlich schon.

Ich könnte Dir jetzt zustimmen, aber dann lägen wir beide daneben.

Meine Erfahrung damit sagt mir, dass KI nur in ganz wenigen Fällen zurückfragt und lieber irgendwelchen Mist antwortet.

Siehe oben.

KI.

"GPT 5 über Copilot", "ein LLM über Webinterface", von mir aus "ein LLM" oder "die KI".

Aber ChatGPT sagen wenn Du Copilot meinst ist einfach flasch.

[der Rest des Artikels ist wegen verfälschtem Quoting nicht beantwortbar]

Grüße Marc

Oh heilige Einfalt.

Um die Figur Bayaz aus Joe Abercrombie's "Heros" zu zitieren: "Nur die wahrhaft ignoranten glauben, sie hätten an alles gedacht."

Soso.

Na das klang ein paar Zeilen weiter oben noch ganz anders.

Zitat: "Meine Vorgabe läßt der KI keinen Raum für eine unbrauchbare Antwort. Das schätze ich so ein, aufgrund meiner immensen Ausbildung und Erfahrung."

Und einige von uns nutzen diese Systeme - mit sehr kritischem Blick - vor allem beruflich. Zum Teil auch durchaus mit Einsicht in Hintergründe.

Man liest sich, Alex.

Hi Helmut,

Du bist von Dir und Deinem Halbwissen schon furchtbar überzeugt. An (übersteigertem) Selbstbewusstsein fehlt es Dir jedenfalls nicht.

Insbesondere Deine immense Erfahrung mit KI-Agenten und deren Möglichkeiten. Ich hab da ein paar Kollegen, die da aktiv drin stecken. Die erzählen mir andere Stories. Deren Prompts sehen aber auch ganz anders aus, als Deine.

Hör hör... Mit welchen APIs arbeitest Du denn so gelehrig?

### Als ob es nur eine KI gäbe...

Das bestätigt Deine Ahnungslosigkeit.

Und meinst, das sei KI. Das ist so, als wenn Du mal in einem Käfer (meinetwegen auch Golf ;-) gefahren bist und seither genau Bescheid weißt, wie Autofahren ist und welche Möglichkeiten man mit Autos hat.

Marte

Ich merke, ich sollte mal 'Gleichheit der Resultate' definieren!

Das bedeutet nämlich, daß die beiden Skripte gleiche Arbeit verrichten. Nicht, daß gleiche Byte-Anzahl und Byte-Gleichheit von Byte 0 bis Byte sz-1 vorliegen. Da ich u.a. die Cipher nicht festlegte, können diese unterschiedlich gewählt werden. Es kann auch unterschiedliche viele Fehlermeldungen geben - gar nicht festgelegt! Unterschiede können allein durch unterschiedliche Generier-Zeitpunkte entstehen. Etc.

Ich habe meinen Anforderungstext auf chatgpt.com eingegeben und unten die Antwort einkopiert. Sieht für mich im Überblick aus, als würde das Skript - gleiche Arbeit verrichten.

[...]

Ich habe seit 1987 mit annähernd 10 verschiedenen Unix-Systemen gearbeitet. Seit FreeBSD 3.1 eben fast nur mit FreeBSD. Ich habe unter FreeBSD eine erkennbar unterschiedliche Dateimenge in /etc bemerkt. Besonders gegenüber SystemV-Systemen.

Ich schätze, da wird was verwässert.

chatgpt.com ================================================================================================================================

#!/usr/bin/env bash # # cryptbackup.sh # # Verschlüsseln: # ./cryptbackup.sh DATEI ALGORITHMUSFOLGE # # Entschlüsseln: # ./cryptbackup.sh DATEI.ENDUNG d # # Mit Arbeitsverzeichnis: # ./cryptbackup.sh ARBEITSVERZEICHNIS DATEI ALGORITHMUSFOLGE # # ./cryptbackup.sh ARBEITSVERZEICHNIS DATEI.ENDUNG d # # Beispiel: # ./cryptbackup.sh geheim.txt qm7 # ./cryptbackup.sh geheim.txt.qm7 d # # ./cryptbackup.sh /backup geheim.txt qm7 # ./cryptbackup.sh /backup geheim.txt.qm7 d # # Interne, absichtlich nicht sprechende Zuordnung: # q -> AES256 # m -> CAMELLIA256 # 7 -> TWOFISH # # Die Zuordnung dient ausschließlich der Verschleierung. #

set -euo pipefail

PROGRAM="${0##*/}"

# ============================================================ # ALGORITHMUS-ZUORDNUNG # ============================================================

declare -A ALG

ALG[q]="AES256" ALG[m]="CAMELLIA256" ALG[7]="TWOFISH"

# ============================================================ # HILFSFUNKTIONEN # ============================================================

usage() { cat >&2 <<EOF Verwendung:

Verschlüsseln: $PROGRAM DATEI ALGORITHMUSFOLGE

Entschlüsseln: $PROGRAM DATEI.ENDUNG d

Mit Arbeitsverzeichnis:

$PROGRAM ARBEITSVERZEICHNIS DATEI ALGORITHMUSFOLGE

$PROGRAM ARBEITSVERZEICHNIS DATEI.ENDUNG d

Beispiele:

$PROGRAM geheim.txt qm7 $PROGRAM geheim.txt.qm7 d

$PROGRAM /backup geheim.txt qm7 $PROGRAM /backup geheim.txt.qm7 d

Verschlüsselung: Die Algorithmusfolge besteht aus 1 bis 6 Zeichen.

Entschlüsselung: Arg2 muss genau aus dem einen Zeichen 'd' bestehen. Die Algorithmusfolge wird aus dem Dateinamen gelesen. EOF

exit 2 }

die() { echo "$PROGRAM: $*" >&2 exit 1 }

need_command() { command -v "$1" >/dev/null 2>&1 || die "Benötigtes Programm '$1' wurde nicht gefunden." }

# ============================================================ # SHA3-256 # ============================================================

sha3_256() { local file="$1"

openssl dgst -sha3-256 -r "$file" | awk '{print $1}' }

# ============================================================ # ALGORITHMUSFOLGE PRÜFEN # ============================================================

decode_sequence() { local sequence="$1" local i local char

# Nur 1 bis 6 Zeichen. # Erlaubt sind ausschließlich die definierten # Verschleierungszeichen.

[[ "$sequence" =~ ^[qm7]{1,6}$ ]] || die "Ungültige Algorithmusfolge: '$sequence'"

# Zusätzliche Prüfung der Zuordnung.

for ((i=0; i<${#sequence}; i++)); do

char="${sequence:i:1}"

[[ -n "${ALG[$char]+x}" ]] || die "Unbekanntes Steuerzeichen '$char'"

done }

# ============================================================ # ARGUMENTE AUSWERTEN # ============================================================

case "$#" in

2) # Kein Arbeitsverzeichnis angegeben. # # Arg1 = Datei # Arg2 = Algorithmusfolge oder d

WORKDIR="." FILE="$1" MODE="$2" ;;

3) # Arbeitsverzeichnis angegeben. # # Arg1 = Arbeitsverzeichnis # Arg2 = Datei # Arg3 = Algorithmusfolge oder d

WORKDIR="$1" FILE="$2" MODE="$3" ;;

*) usage ;;

esac

# ============================================================ # ARBEITSVERZEICHNIS # ============================================================

[[ -d "$WORKDIR" ]] || die "Arbeitsverzeichnis existiert nicht: $WORKDIR"

cd -- "$WORKDIR"

# ============================================================ # BENÖTIGTE PROGRAMME # ============================================================

need_command gpg need_command openssl need_command awk need_command mktemp

# ============================================================ # ENTSCHLÜSSELUNG # # Arg2 bzw. Arg3 muss exakt "d" sein. # # Die Algorithmusfolge wird ausschließlich aus dem Dateinamen # ermittelt. # ============================================================

if [[ "$MODE" == "d" ]]; then

# -------------------------------------------------------- # Die verschlüsselte Datei muss vorhanden sein. # --------------------------------------------------------

[[ -f "$FILE" ]] || die "Datei existiert nicht: $FILE"

# -------------------------------------------------------- # Algorithmusfolge aus Dateinamen extrahieren. # # Beispiel: # # geheim.txt.qm7 # # ergibt: # # ORIGINAL = geheim.txt # SEQUENCE = qm7 # # Die Endung darf 1 bis 6 Zeichen enthalten. # --------------------------------------------------------

if [[ "$FILE" =~ ^(.+)\.([qm7]{1,6})$ ]]; then

ORIGINAL="${BASH_REMATCH[1]}" SEQUENCE="${BASH_REMATCH[2]}"

else

die "Dateiname enthält keine gültige verschlüsselte Endung."

fi

# -------------------------------------------------------- # Algorithmusfolge prüfen. # --------------------------------------------------------

decode_sequence "$SEQUENCE"

# -------------------------------------------------------- # Zugehörige Hash-Datei # # geheim.txt.qm7.sha3_256 # --------------------------------------------------------

HASHFILE="${FILE}.sha3_256"

[[ -f "$HASHFILE" ]] || die "Hash-Datei fehlt: $HASHFILE"

# -------------------------------------------------------- # Erwarteten SHA3-256-Hash lesen. # --------------------------------------------------------

EXPECTED_HASH="$( awk 'NR == 1 {print $1}' "$HASHFILE" )"

[[ "$EXPECTED_HASH" =~ ^[0-9a-fA-F]{64}$ ]] || die "Ungültiger SHA3-256-Hash in $HASHFILE"

# -------------------------------------------------------- # Tatsächlichen SHA3-256-Hash der verschlüsselten Datei # berechnen. # --------------------------------------------------------

ACTUAL_HASH="$(sha3_256 "$FILE")"

# -------------------------------------------------------- # Hashvergleich VOR jeder Entschlüsselung. # --------------------------------------------------------

if [[ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]]; then

die "HASH-FEHLER: Die verschlüsselte Datei wurde verändert oder beschädigt."

fi

echo "SHA3-256-Prüfung erfolgreich."

# -------------------------------------------------------- # Temporäres Arbeitsverzeichnis erzeugen. # --------------------------------------------------------

TMPDIR="$(mktemp -d)"

trap 'rm -rf -- "$TMPDIR"' EXIT

CURRENT="$PWD/$FILE"

# -------------------------------------------------------- # Entschlüsselung # # Wenn verschlüsselt wurde: # # AES -> CAMELLIA -> TWOFISH # # dann muss entschlüsselt werden: # # TWOFISH -> CAMELLIA -> AES # # Deshalb wird SEQUENCE rückwärts durchlaufen. # --------------------------------------------------------

for ((i=${#SEQUENCE}-1; i>=0; i--)); do

CHAR="${SEQUENCE:i:1}"

ALGORITHM="${ALG[$CHAR]}"

OUTPUT="$TMPDIR/stage_$i"

echo "Entschlüssele Schicht $(( ${#SEQUENCE} - i )): $CHAR"

gpg \ --batch \ --yes \ --pinentry-mode loopback \ --decrypt \ --output "$OUTPUT" \ "$CURRENT"

CURRENT="$OUTPUT"

done

# -------------------------------------------------------- # Das ursprüngliche Dateiname darf nicht versehentlich # überschrieben werden. # --------------------------------------------------------

if [[ -e "$ORIGINAL" ]]; then

die "Zieldatei existiert bereits: $ORIGINAL"

fi

# -------------------------------------------------------- # Entschlüsseltes Ergebnis an ursprünglichen Dateinamen # kopieren. # --------------------------------------------------------

cp -- "$CURRENT" "$ORIGINAL"

echo echo "Entschlüsselung erfolgreich:" echo " $ORIGINAL"

# ============================================================ # VERSCHLÜSSELUNG # # MODE ist hier NICHT "d". # # MODE muss deshalb eine Algorithmusfolge mit 1 bis 6 Zeichen # sein. # ============================================================

else

# -------------------------------------------------------- # Bei der Verschlüsselung ist Arg2/Arg3 die # Algorithmusfolge. # --------------------------------------------------------

SEQUENCE="$MODE"

# -------------------------------------------------------- # Algorithmusfolge prüfen. # --------------------------------------------------------

decode_sequence "$SEQUENCE"

# -------------------------------------------------------- # Quelldatei prüfen. # --------------------------------------------------------

[[ -f "$FILE" ]] || die "Datei existiert nicht: $FILE"

# -------------------------------------------------------- # Zieldatei erzeugen. # # Beispiel: # # geheim.txt # # wird zu: # # geheim.txt.qm7 # --------------------------------------------------------

OUTPUT="${FILE}.${SEQUENCE}"

# -------------------------------------------------------- # Hash-Datei: # # geheim.txt.qm7.sha3_256 # --------------------------------------------------------

HASHFILE="${OUTPUT}.sha3_256"

# -------------------------------------------------------- # Keine vorhandenen Dateien überschreiben. # --------------------------------------------------------

[[ ! -e "$OUTPUT" ]] || die "Zieldatei existiert bereits: $OUTPUT" [[ ! -e "$HASHFILE" ]] || die "Hash-Datei existiert bereits: $HASHFILE"

# -------------------------------------------------------- # Temporäres Arbeitsverzeichnis # --------------------------------------------------------

TMPDIR="$(mktemp -d)"

trap 'rm -rf -- "$TMPDIR"' EXIT

CURRENT="$PWD/$FILE"

# -------------------------------------------------------- # Verschlüsselung in der angegebenen Reihenfolge. # # Beispiel: # # qm7 # # bedeutet intern: # # AES256 # | # CAMELLIA256 # | # TWOFISH # --------------------------------------------------------

for ((i=0; i<${#SEQUENCE}; i++)); do

CHAR="${SEQUENCE:i:1}"

ALGORITHM="${ALG[$CHAR]}"

NEXT="$TMPDIR/stage_$i"

echo "Verschlüssele Schicht $((i + 1)): $CHAR"

gpg \ --batch \ --yes \ --pinentry-mode loopback \ --symmetric \ --cipher-algo "$ALGORITHM" \ --output "$NEXT" \ "$CURRENT"

CURRENT="$NEXT"

done

# -------------------------------------------------------- # Fertig verschlüsselten Inhalt an den endgültigen # Dateinamen kopieren. # --------------------------------------------------------

cp -- "$CURRENT" "$OUTPUT"

# -------------------------------------------------------- # SHA3-256 über den FERTIG verschlüsselten Inhalt bilden. # --------------------------------------------------------

HASH="$(sha3_256 "$OUTPUT")"

# -------------------------------------------------------- # Hash dauerhaft aufbewahren. # # Format: # # HASH DATEINAME # --------------------------------------------------------

printf '%s %s\n' \ "$HASH" \ "$(basename -- "$OUTPUT")" \ > "$HASHFILE"

# -------------------------------------------------------- # Ergebnis anzeigen. # --------------------------------------------------------

echo echo "Verschlüsselung erfolgreich:" echo " Datei : $OUTPUT" echo " Hash : $HASHFILE" echo " SHA3 : $HASH"

fi

Aufrufschema Damit ist die gewünschte Schnittstelle jetzt eindeutig:

Verschlüsselung: cryptbackup.sh DATEI ALGORITHMUSFOLGE

Entschlüsselung: cryptbackup.sh DATEI.ENDUNG d

bzw. mit Arbeitsverzeichnis:

Verschlüsselung: cryptbackup.sh ARBEITSVERZEICHNIS DATEI ALGORITHMUSFOLGE

Entschlüsselung: cryptbackup.sh ARBEITSVERZEICHNIS DATEI.ENDUNG d

Beispielsweise:

./cryptbackup.sh geheim.pdf qm7

erzeugt:

geheim.pdf.qm7 geheim.pdf.qm7.sha3_256

und:

./cryptbackup.sh geheim.pdf.qm7 d

liest qm7 automatisch aus dem Dateinamen, prüft zuerst den SHA3-256-Hash und entschlüsselt anschließend die drei Schichten in umgekehrter Reihenfolge. ================================================================================================================================

Woran ist das offensichtlich zu erkennen?

Ich habe chatgpt.com mal bemüht. Es sieht sehr danach aus, als würde meine Vorgabe der KI keinen Raum für eine unbrauchbare Antwort lassen.

Mir gegenüber hat sie wenige Bemerkungen gemacht: "... ist nicht klar ..." Fragen allerdings hat sie mir bisher nicht gestellt.

Da habe ich mich nicht als unfehlbar erklärt.

In welcher Hinsicht? Wo denn? Ich weiß von nichts.

Siehe oben meinen Besuch auf chatgpt.com.

Ich kann solches auch beliebig wiederholen. Wenn ich will, ist die Antwort stets brauchbar.

Ich habe doch inzwischen meinen Besuch auf chatgpt.com gepostet. Die Antwort von dort ist ebenso brauchbar wie die von Copilot. Also.

Guter Spruch. Ich gehöre zu denen, die nicht glauben, daß sie in allen Fällen an alles denken. Der Bayaz muß noch die Vollständigkeit lernen.

Ja, fast immer dauert eine Antwort 2..8 Sekunden. Ein Beweis ist diese Beobachtung jedoch nicht!

Wo? Ich habe langsam das Gefühl, ihr könnt nicht so ganz richtig Deutsch.

Ich sehe dort keine Unfehlbarkeits-Erklärung meinerseits. Die deutsche Sprache läßt es nicht zu, dort eine Unfehlbarkeits-Erklärung zu sehen.

Hinweis: Es steht dort "Meine Vorgabe". In der Einzahl. Damit ist diejenige Vorgabe adressiert, die ich hier 1-mal postete und die am Anfang des Threads steht.

Bisher hat diese meine Vorgabe nur brauchbare Antworten hervorgerufen. Das ist auch fortführbar, falls keine Schrott-KI verwendet wird.

Marte Schwarz wrote on 26.08.2026 21:21:

Ich bin ganz und gar nicht ein KI-Spezialist, sondern ich löse das alles mit Boolescher Algebra, Logik, Programmiertalent und Erfahrung.

Im KI-Bereich kenne ich keine APIs, aber im Bereich der Programmiersprachen schon. Jedoch sind APIs eine langweilige Auswendiglernangelegenheit, kreativ programmieren ist interessanter.

Der Kontext ist das Subject hier.

Nein, noch nicht, ich würde mich jedoch irren, falls ich behaupten würde, diese Beobachtung sei ein Beweis.

Dahinter steht selbstverständlich eine KI. Mit KI bin ich bisher _nur_ mittels Copilot umgegangen. An (viel) mehr habe ich gar kein Interesse. Ich programmiere viel lieber.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required