Algorithmus gesucht
-
Hi,
auch wenn mein Problem seltsam klingen mag, aber ich suche eine Möglichkeit, um folgendes zu tun:Gegeben sind etwa 2 bis 4 Bytes, auf jeden Fall aber nur sehr wenige.
Aus diesen wenigen Bytes soll nun eindeutig ein zufälliger, viel viel größerer String (idealerweise variabler Länge) erzeugt werden.
Beispiel:
AB -> fsdjfskkjf
AC -> 3453578787Wichtig ist, dass man bei der Angabe von AB immer wieder denselben String erhält. Auch sollte der Algo bzw. die Funktion Längen für den Zielstring annehmen, dabei aber die Eindeutigkeit beibehalten. Sodass also AB mit der Länge 1024 (immer!) den String X (der Länge 1024), und mit einer Länge 8192 den String Y liefert usw.
Wichtig ist vor allem die Performance, meine Ideen sind alle zu langsam und führen über viele Schleifen, das sollte vermieden werden.
Fragt nicht wozu ich das brauche
Neo
-
Hallo,
NeoInferno schrieb:
Aus diesen wenigen Bytes soll nun eindeutig ein zufälliger, viel viel größerer String (idealerweise variabler Länge) erzeugt werden.
Meinst Du mit eindeutig: wenn zwei verschiedene Eingaben kommen, dann gibt's auch verschiedene Ausgaben, oder daß einer Eingabe immer die selbe Ausgabe zugeordnet wird?
NeoInferno schrieb:
Fragt nicht wozu ich das brauche
Die Frage wirst Du Dir wohl gefallen lassen müssen:
Es hängt nämlich stark davon ab wofür Du das brauchst. Für ein Krypto-System brauchste was anderes als für's hashen.
Wenn's wirklich völlig egal ist: Nimm die Zeichenkette selbst und füll sie mit irgendnem beliebigen Zeichen auf.MfG Jester
-
NeoInferno schrieb:
Gegeben sind etwa 2 bis 4 Bytes
dann geh immer von 4 bytes aus.
füll die fehlernden bits mit nullen.Aus diesen wenigen Bytes soll nun eindeutig ein zufälliger, viel viel größerer String (idealerweise variabler Länge) erzeugt werden.
und das macht ein zufallszahlengenerator.
also
string bla(char *seed, seize_t seedlen,int resultlen){ int s=0; for(int i=0;i<seedlen;++i) s=s*256+seed[i]; srand(s); string result; for(int i=0;i<resultlen;++i) result+='0'+rand()%96; return result; }
aber wisse, daß das nur alle knacker abhält, die deinen code nicht analysieren. (also minstestens 99%). wer deinen code liest (evtl deine exe analysiert), sieht die max 4 bytes eingang und bruteforced das. bei nur 4 bytes dauert das nue nen tag.
es wäre entschieden besser, mehr als 4 bytes eingang zu haben, und den ausgang wie üblich su groß wie den eingang.
-
oder daß einer Eingabe immer die selbe Ausgabe zugeordnet wird?
Genau so. Die Eindeutigkeit ist hier wichtig, also in der Tat eine Art von Hashing.
Es hängt nämlich stark davon ab wofür Du das brauchst.
Kingt zwar vielleicht etwas seltsam, aber ich brauche es für kleinere Experimente mit Kompression. Von daher ist die Sicherheit *völlig* vernachlässigbar, aber die Performance sehr wichtig.
@volkard:
Sehe ich das richtig, dass seed und seendlen die Eingabe-Bytes & deren Länge sind, und diese *beliebig* lang sein können? Die erste Schleife sieht aus, als würde sie wirklich eindeutige s's generieren, um damit einzigartige und stets wiederholbare Zufallswerte zu kriegen. Genau das was ich brauche also, danke
Geht das ganze jedoch etwas effizienter, wie gesagt mit weniger Schleifen? Das ist auch das Problem bei meiner Lösung. Bezweifle ich aber fast, und wirklich langsam siehts es ja auch nicht aus, da heißt es wohl testen..Ich frage mich aber, ob folgende Zeile wirklich alle 256 Zeichen erzeugen kann:
result+='0'+rand()%96;
Und wozu die führende Null? Eine Art cast? Ist ein (unsigned char)(x) langsamer?
Vielen Dank,
Neo
-
NeoInferno schrieb:
Es hängt nämlich stark davon ab wofür Du das brauchst.
Kingt zwar vielleicht etwas seltsam, aber ich brauche es für kleinere Experimente mit Kompression.
Von einem Zufallsgenerator erzeugte Ketten lassen sich kaum komprimieren.
-
NeoInferno schrieb:
@volkard:
Sehe ich das richtig, dass seed und seendlen die Eingabe-Bytes & deren Länge sind, und diese *beliebig* lang sein können?nein. nur bis 4 bytes sind wirksam.
Die erste Schleife sieht aus, als würde sie wirklich eindeutige s's generieren, um damit einzigartige und stets wiederholbare Zufallswerte zu kriegen. Genau das was ich brauche also, danke
aber nur 4 bytes sind wirksam.
willste beliebig lange seede-eingabe, machs=s*31+seed[i];
Geht das ganze jedoch etwas effizienter, wie gesagt mit weniger Schleifen?
nein. ja. also schleifen brauchste schon. natürlich kann man noch nen konstanten faktor rausholen,sagen wir mal faktor 4 oder 5, wenn man in int-schrittenm über's ergebnis hoppelt. und wenn man nen extrem schnellen (schwachen) zufallszahlengenerator nimmt. also unfug.
<idee>
aha, du nimmst die folge für verschlüsseler. nach eingabe des keywords wrd ne folge erzeugt, die so lang wie die nachricht ist und mit xor verschlüsselt.
</idee>Ich frage mich aber, ob folgende Zeile wirklich alle 256 Zeichen erzeugen kann:
result+='0'+rand()%96;
Und wozu die führende Null?
ich dachte die ausgabe soll auf dem bildscirm anzeigbar sein. du willst eher
result+=char(rand());
-
aha, du nimmst die folge für verschlüsseler. nach eingabe des keywords wrd ne folge erzeugt, die so lang wie die nachricht ist und mit xor verschlüsselt.
Nein, wie gesagt habe ich keine Verschlüsselung, sondern Spielereien mit Komprimierung im Sinn. Mit XOR hat das aber natürlich auch etwas zu tun.
result+=char(rand());
Ich dachte Rand gibt Zahlen zwischen 1 und 0 aus? Kann man darauf wirklich chars machen? Wenn nicht, weiß ich aber, wie ich zufällige Zeichen kriege.