Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Gibt es einen Algorithmus, mit dem man einen Textteil (Namen) so verfremden kann, das der ursprüngliche Text nicht sofort erkennbar ist? Der Algorithmus muss nicht umkehrbar sein, sollte aber UTF-8 kompatibel sein. Also er soll nicht bei Umlauten und diakritischen Zeichen versagen. Die Anwendung eines Zufall Generators geht wohl nicht, da es bei etlichen Hundert Namen, die manchmal recht kurz sind, zu Duplikaten führen kann. Und kryptografische Hash Funktionen liefern viel zu lange Strings (dafür ist mein Bildschirm nicht breit genug).
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28958
Wohnort: WW
|
Hallo, zum Verständnis: Name = Namen von Personen, der restlich Text bleibt gleich? Also z.B. soll aus Susi Meier zieht die Jacke an. Danach trifft sich Susi Meier mit Peter Schmitz zum Einkaufen. soll Karin Albertz zieht die Jacke an. Danach trifft sich Karin Albertz mit Klaus Petersen zum Einkaufen. Gruß, noisefloor
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Das sind nur Namen bzw. Dateinamen (die Dateiendung soll gleich bleiben). Meine erste Idee war ROT13, aber was mache ich da mit Sonderzeichen? Da kommen auch Underline und Smileys vor (Smileys nur am Ende) ☢
|
Neral
Anmeldungsdatum: 3. Oktober 2007
Beiträge: 229
|
@Dakuan: Du könntest zufallsgenerierte Dateinamen benutzen und dir alle vorherigen Dateinamen in einem Set merken, um Duplikate zu vermeiden. Man könnte sich auch eine monoalphabetische Substitution basteln, indem man sich eine Liste mit allen Unicode-Codepoints baut und dann eine Permutation davon berechnet. Bonuspunkte gibt’s, wenn man nur innerhalb eines jeweiligen Blocks permutiert, weil man sonst gefühlt 80 % aller Zeichen zu chinesischen Schriftzeichen machen würde. Drei oder vier zufällige Wörter aus einer Wörterbuchdatei wären auch eine Möglichkeit. Kannst du denn die Dateinamen zuverlässig identifizieren? Das hört sich für mich nach einem schwierigeren Problem an.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Dakuan, kannst du mal konkret den Anwendungsfall beschreiben. Mir zumindest ist gerade voll nicht verständlich, wo das Problem liegt. Wenn der Algorithmus nicht umkehrbar sein muss, dann sehe ich eigentlich überhaupt keinen Grund einen dafür zu benutzen. Aber grundsätzlich, da es sich unabhängig des Algorithmus um eine Dateioperation handelt (rename), musst du auf Duplikate prüfen. Behaupte ich jetzt einfach mal 😀
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Dakuan schrieb: Meine erste Idee war ROT13, aber was mache ich da mit Sonderzeichen? Da kommen auch Underline und Smileys vor (Smileys nur am Ende) ☢
Wie wäre es mit Base64?
| #!/usr/bin/env python3
import base64
import os
import pathlib
d = pathlib.Path('.')
for p in d.iterdir():
p.rename(os.fsdecode(base64.urlsafe_b64encode(os.fsencode(p.stem))) + p.suffix)
|
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Wo seahawk gerade Base64URL erwähnt, man könnte auch einfach Base16, also hexadezimale Kodierung der Zeichenkette verwenden. Das müsste einzigartig sein und verwendet ja nur die Zeichen 0-9 und A-F.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Sind denn eigentlich alle Eingaben eindeutig, also ohne Doubletten? Oder muss man mit doppelten Eingaben rechnen, die aber auf verschiedene Ausgaben abgebildet werden sollen? Was ist der Zweck von "so verfremden kann, das der ursprüngliche Text nicht sofort erkennbar ist"? Ist das ein Sicherheitsfeature oder wozu dient das? Dann wäre ja eine Einwegumwandlung (wie z.B. bei den kryptographischen Hashfunktionen) sinnvoll.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Das sind jetzt mehr Antworten, als ich in der kurzen Zeit erwarte hatte. Das sind alles Dateinamen. Daher können schonmal keine Doubletten auftreten. Die Verfremdung soll nur in der Anzeige stattfinden, nicht im Dateisystem. Die Verfremdung soll stattfinden, damit bei Vorführungen niemand auf die Idee kommt, einen Bezug zu realen Personen herstellen zu wollen. @Neral Man könnte sich auch eine monoalphabetische Substitution basteln, indem man sich eine Liste mit allen Unicode-Codepoints baut und dann eine Permutation davon berechnet.
Hatte ich auch schon überlegt. Allerdings mit einer Tabelle, die nur wenige zusätzliche Sonderzeichen enthält. Alles was da nicht drin ist wird direkt übernommen. Nachdem ich die letzten Posts gelesen habe, tendiere ich zu Base64. Das muss ich mir aber noch genauer ansehen. Ich war gerade dabei, Bilder zu verpixeln. Zu meiner Überraschung ist vieles bei einer 5x5 Matrix noch gut erkennbar.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Man braucht dafür eigentlich kein Python-Skript, denn das base64-Modul lässt sich auch direkt ansprechen:
| echo "Mein Text" | python -m base64
|
Das sollte sich ja leicht auf deine Datenquelle übertragen lassen. Oder einfach Python ganz weglassen und das base64-Kommando nutzen.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
snafu1 schrieb: Oder einfach Python ganz weglassen und das base64-Kommando nutzen.
base64 aus den CoreUtils kann aber keine URL-freundliche Kodierung. Da sind dann auch die Zeichen + , / und = dabei, von denen man insbesondere / nicht im Dateinamen gebrauchen kann. Deswegen hat seahawk1986 in seinem Beispiel auch extra base64.urlsafe_b64encode verwendet. Auf der Befehlszeile sollte man dann base64url aus dem Paket basez (universe) einsetzen 😉 Wenn ich aber wirklich eine Zeichenkette verfremden möchte, dann würde ich die definitiv nicht mit irgendwas kodieren, was man umkehren kann. Da gibt es genügend Leute, die verspielt genug sind, solche Strings in Bildschirmfotos oder Vortragsfolien mal spaßeshalber zu dekodieren. Da würde ich Dateinamen immer durch einen zufällige Zeichenkette ersetzen ggf. auf Basis der Länge der ursprünglichen Zeichenkette. Beispielsweise mit openssl (hier Base16/Hex) oder pwgen: | #!/bin/bash
filename="filename.suffix"
length="$(echo ${filename%%.*} | wc -c)"
openssl rand -hex $length
pwgen $length 1
|
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Wenn ich aber wirklich eine Zeichenkette verfremden möchte, dann würde ich die definitiv nicht mit irgendwas kodieren, was man umkehren kann. Da gibt es genügend Leute, die verspielt genug sind, solche Strings in Bildschirmfotos oder Vortragsfolien mal spaßeshalber zu dekodieren.
Jetzt, wo Du es sagst, erinnere ich mich, dass ich so etwas vor über 20 Jahren selbst probiert hatte (damals gab es noch CompuServe). Ich wollte mich eigentlich schon auf Base64 festlegen, aber Dein Einwand lässt mich noch zögern. Für mein Programm benötige ich kein fertiges Programm, das dieses kann, sondern eine C oder C++ Funktion/Lib. Da habe ich zwar schon libb64 gefunden, aber noch keinen Hinweis darauf, was ich 'incudieren' muss oder wie die Linker Optionen dazu anzugeben sind. Aber da es nur für eine eine Demo Version benötige, könnte ich natürlich auch ein Shell Kommando bemühen. Aber ich habe jetzt gerade mal mit etwa 4000 Dateien getestet. Da kommt dann auch der Faktor Zeit ins Spiel. Also das "in situ" verpixeln der Thumbs dürfte schneller gehen als das Verfremden der Namen über Shell Aufrufe. Da muss ich morgen (ups, ist schon heute) aber nochmal drüber nachdenken. Ich war gerade von Snooker Turnier "Scottish Open" abgelenkt.
|