Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1590[/thread]

besondere Art einer verschlüsselten Datenbank

Leser: 2


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Ishka
 2004-08-05 03:03
#15760 #15760
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hiho,
erstmal vorweg: Es geht mir nicht darum, wie man mein Problem in welcher Sprache auch immer realisiert, sondern um die theoretische Lösung des Problems:

Ich habe eine Datenbank (f: |N -> |N) in der zu einigen (n Stück) Schlüsseln bestimmte Werte gespeichert sind. Natürlich existieren nicht alle möglichen Schlüssel.

Daraus will ich eine Datenbank (g: |N -> |N) folgender Art erzeugen:
sofern ein Schlüssel in f existiert, soll mir der Aufruf von g den gleichen Wert wie der Aufruf von f geben. Zudem kann ich an g nicht erkennen, welche Schlüssel in f existieren, dh. jeder Schlüssel gibt mir irgendeinen Wert zurück.

Mir ist natürlich klar, daß eine Triviallösung des Problems wäre, zu allen möglichen Schlüsseln irgendwas abzuspeichern, aber das wäre zu speicheraufwendig.

Die Gedanken, die ich mir bislang gemacht hab:
Irgendein Polynom n+1sten Grades nehmen, was an meinen Werten ein korrektes Ergebnis liefert. Das Problem dabei ist es die Koeffizienten zu bestimmen, ohne zu verraten, wie meine Schlüssel aussehen.

Fällt da irgenwem was besseres ein? Oder ne Idee, wie man die Koeffizienten geschickt bestimmen könnte?

edit pq: sieben Schlüßel entfernt und durch Schlüssel ersetzt =)\n\n

<!--EDIT|pq|1091792334-->
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2004-08-05 09:36
#15761 #15761
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
(f: |N -> |N) geht doch schonmal nicht, weil du eine Datenbank hast, oder? :)

was gibt g zurück, wenn f den Schlüssel nicht hat? Und habe ich das richtig verstanden, wenn du g(i) aufrufst, soll dann f(i) zurück gegegeben werden, wenn f(i) existiert, oder wie?
pq
 2004-08-05 11:23
#15762 #15762
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
(ich habe mal den titel geändert. 'verschlüßelt' tat mir in den augen weh... =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Ishka
 2004-08-05 17:09
#15763 #15763
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Jep, hast du richtig verstanden. (f: |N -> |N) soll halt ausdrücken, daß sowol die Schlüssel wie auch die Werte natürlichzahlig sind. Wenn f(i) nicht existiert, dann soll irgendwas zurückgegeben werden, aber bei jedem Aufruf natürlich das gleiche, damit man auch bei mehrmaligem Aufruf nicht erkennt, ob der Wert jetzt in f enthalten ist.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2004-08-05 17:54
#15764 #15764
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
achso; aber

wenn x != y und x,y nicht in f; dann soll wohl auch gelten
g(x) != g(y) oder?

das ist wirklich nicht so einfach...

du könntest, wenn f(x) einen wert liefert, dann gib f(x) zurück, ansonsten gib sha1(x) zurück => dadurch ist g(i) != g(j) für alle i != j und i,j nicht in f
Ishka
 2004-08-05 18:45
#15765 #15765
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
das muß nicht gelten - die Werte in f sind auch nicht eindeutig.

Die von dir angesprochene Lösung setzt vorraus, daß ich ein Programm hab, was in einer Blackbox läuft und Daten raussendet - unter der vorraussetzung wäre es einfach. Ich will aber ein Programm haben, bei dem man alles genau auseinandernehmen kann und ruhig wissen kann, wie es funktioniert und es trotzdem nicht rausbekommt.

sprich - ich kann nicht die richtigen Werte abspeichern.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
murphy
 2004-08-05 18:55
#15766 #15766
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Die erste Frage die da zu klären ist, wäre: Willst du, dass g exakt die gleichen Werte wie f liefert? Wenn dir die Ergebnisse mit einer kleinen Ungenauigkeit reichen ist es viel einfacher! Dann musst du dich noch fragen, wie zuverlässig das Speichersystem sein muss. Wenn du zum Beispiel erlaubst, dass beim Schreiben in g Daten kaputtgehen dürfen, dann wird's auch einfacher. Wenn du aber volle Zuverlässigkeit haben möchtest, weiß ich so auf Anhieb keine Hundertprozentige Lösung, außer die Datenbank eben mit Zufallswerten aufzufüllen.
When C++ is your hammer, every problem looks like your thumb.
renee
 2004-08-05 18:56
#15767 #15767
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
kannst du nicht rsa dafür benutzen??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2004-08-05 19:03
#15768 #15768
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,05.08.2004, 16:56]kannst du nicht rsa dafür benutzen??[/quote]
dann bräuchte er ja public und private key für.
Ishka
 2004-08-05 19:08
#15769 #15769
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Schreiben in g muß nicht möglich sein. Das war vielleicht nicht klar in meiner Erklärung. f ist eine ganz normale Datenbank, aus der - sobald mir die Daten passen - g erzeugt werden soll und g bleibt dann konstant.

RSA geht deshalb nicht, weil der Benutzer zu den geeigneten Werten ja immer noch die richtigen Ergebnisse auslesen können muß. Dh. er muß entweder den Schlüssel haben (bringt dann nichts) oder er vergleicht die verschlüsselten Werte - dann weiß er aber sofort, zu welchem Schlüssel ein Wert existiert.

Mein aktueller Ansatz ist es aus dem übergebenen Schlüssel eine möglichst kurze Prüfsumme zu bilden, die über meiner Schlüsselmenge keine Kollisionen mit unterschiedlichen Werten hat und dort dann alle möglichen Prüfsummen mit Werten versehen. Allerdings reduziert das das Problem nur und löst es nicht.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2004-08-05 03:03.