Chiffrierung
-
Ich bin noch totaler noob in c++. Ich würde gerne ein Programm machen, wo man Buchstaben gegen andere ersetzen kann. Wenn ich auf Button1 drücke, dass dann alle Buchstaben von Edit1 vertauscht werden.
a->b->c->d->e->...->z->a
z.B. abcdefg zu zabcdef
Kann mir da jemand weiterhelfen, also hier nen code hinschreiben? Ich habe überall gesucht, doch nix passendes gefunden.
-
Sieh dich im Netz mal nach Beispielen für rot13 um. Das ist dasselbe Prinzip, nur dass dort statt um einen immer um dreizehn Buchstaben weitergesprungen wird.
-
Bitte gib mir doch einer nen Code-Schnipsel, wie ich nen Buchstaben gegen einen Anderen eintauschen kann

-
http://www.planet-source-code.com/URLSEO/vb/scripts/ShowCode!asp/txtCodeId!8249/lngWId!3/anyname.htm
-
String str = "Halli"; str[5] = 'o'; ShowMessage(str);
-
Dankeschön für den Codeschnipsel Jansen
!!!
Aber ich wollte eigentlcih nicht wissen, wie ich das 5te Zeichen eines Strings durch einen Buchstaben ersetzen kann, sondern dass immer ein bestimmter Buchstabe innerhalb eines Strings ersetzt wird. Hab auch schon etliche Sachen selbst ausprobiert, aber nichts hat geklappt.
Einnen meiner Versuche, habe ich so gemacht, aber die Fehlermeldung bekomen, dass nicht genügend Speicher vorhanden sei:
String str, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15, str16, str17, str18, str19, str20, str21, str22, str23, str24, str25, str26, str27; str = Edit1->Text; str2 = str['a'] = 'b'; str3 = str['b'] = 'c'; str4 = str['c'] = 'd'; str5 = str['d'] = 'e'; str6 = str['e'] = 'f'; str7 = str['f'] = 'g'; str8 = str['g'] = 'h'; str9 = str['h'] = 'i'; str10 = str['i'] = 'j'; str11 = str['j'] = 'k'; str12 = str['k'] = 'l'; str13 = str['l'] = 'm'; str14 = str['m'] = 'n'; str15 = str['n'] = 'o'; str16 = str['o'] = 'p'; str17 = str['p'] = 'q'; str18 = str['q'] = 'r'; str19 = str['r'] = 's'; str20 = str['s'] = 't'; str21 = str['t'] = 'u'; str22 = str['u'] = 'v'; str23 = str['v'] = 'w'; str24 = str['w'] = 'x'; str25 = str['x'] = 'y'; str26 = str['y'] = 'z'; str27 = str['z'] = 'a'; Edit2->Text = String (str2 + str3 + str4 + str5 + str6 + str7 + str8 + str9 + str10 + str11 + str12 + str13 + str14 + str15 + str16 + str17 + str18 + str19 + str20 + str21 + str22 + str23 + str24 + str25 + str26 + str27);Weiss jemand hier, wie ich immer ein bestimmtes Zeichen innerhalb eines Strings durch ein anderes ersetzen lassen kann
?
-
uluru schrieb:
Weiss jemand hier, wie ich immer ein bestimmtes Zeichen innerhalb eines Strings durch ein anderes ersetzen lassen kann
?Klar:
int zu_ersetzendes_zeichen_index_int = 5; String str = "Halli"; str[zu_ersetzendes_zeichen_index_int] = 'o'; ShowMessage(str);
-
@uluru
Deinem Code nach zu urteilen, meinste etwa sowas ? Ansonsten ***nixverschtäh***int len, x; char c; AnsiString str; str="Hallo dies ist ein Vertauschtest"; len=str.Length(); for(x=1; x<=len; x++) { c=str[x]; if(c=='z') c='a'; else if(c=='Z') c='A'; else c+=1; str[x]=c; }
-
int iLength = Edit1->Text.Length(); char* cText = new char[iLength + 1]; strcpy(cText, Edit1->Text.c_str()); for (int i = 0; i < iLength; i++) { if (cText[i] >= 'a' && cText[i] < 'z') cText[i]++; if (cText[i] == 'z') cText[i] = 'a'; } Edit1->Text = AnsiString(cText); delete[] cText;Du mußt natürlich noch überprüfen, ob 'Z' oder '9', und die ganze 'Sonderzeichenbehandlung' (äöüß...)
EDIT: Hatte das delete vergessen. Und hab' noch eine Beschränkung auf die Kleinbuchstaben eingebaut...
-
Sieh dir mal die Vigenere-Chiffrierung an, evtl suchst du ja das?? (oh Gott wurde der Name so geschrieben?)
-
junix:

uluru:
Einzelne Zeichen eines Strings sind vom Typ char, intern werden sie jedoch als Integer repräsentiert. Festgelegt ist der Wert jedes Zeichens in der sogenannten ASCII-Tabelle.
Um jetzt z.B. aus einem 'a' (ASCII 97) ein 'b' (ASCII 98) zu machen reicht es aus, 1 zu 'a' zu addieren.Ich hoffe, du hast jetzt einen Ansatz. Eigentlich hätte dir das Prinzip beim Studium der besagten ROT13-Beispiele selbst klarwerden sollen.
-
Erstmal ein großes "Danke" an euch alle, die mir helfen wollen, doch leider hab ichs immer noch nicht hingekriegt.
Dierser Code Funktioniert nicht, weil aus dem String "abcdefghijklmnopqrstuvwxyz" nicht "bcdefghijklmnopqrstuvwxyza" sondern "bcdefghijklmnopqrstuvwxyaa" wird.
int iLength = Edit1->Text.Length(); char* cText = new char[iLength + 1]; strcpy(cText, Edit1->Text.c_str()); for (int i = 0; i < iLength; i++) { if (cText[i] >= 'a' && cText[i] < 'z') cText[i]++; if (cText[i] == 'z') cText[i] = 'a'; } Edit1->Text = AnsiString(cText); delete[] cText;Die erklärung von Jansen war da schon eine kleine Hilfe, um zu durschauen, wie das mit ASCII funktioniert.
Naja, dann hab ich selber wieder was versucht, was aber auch nicht gefunzt hat:if (Edit1->Text == 'a') {Edit1->Text = 'z')Nur um klar zu stellen, was ich eigentlich machen will, da das hier einige missverstanden haben denke ich. Also, ich möchte ein Programm schreiben, wo verschiedene Zeichen innerhalb eines Strings durch andere ersetzt werden.
Als Beispiel habe ich eine ganz einfache Methode hier angeführt, um diese später dann weiterzuentwickeln.
Ich denke, dass das was Jansen agerissen hat, vielleicht eine große Rolle dabei spielen könnte.Wenn man die Zeichen nicht so vertauschen kann, dass man Beispielsweise so etwas in der Art schreibt wie:
"Ersetze in dem String alle 'a' durch 'z' und alle 'z' durch 'a'".
Dann denke ich dass es möglich ist, etwas wie folgt zu schreiben:
"Alle 'a' aus dem String +25 und alle 'z' -25)Dadurch wäre es dann auch möglich eine Chiffrierung ohne "wirkliche Logik" zu machen, also wild durcheinander gewurschtelt (Z.B a->c & c->a t->l & l->t x->y & y->x)
Hier jedoch würde erstmal ein einfaches Beispiel weiterhelfen.
z.B.Wie ich aus allen 'z' innerhalb eines Strings 'a' machen könnte.
Beispiel:
"hallo hier ist ein zirkus" würde dann zu "hzllo hier ist ein airkus" werden.
Und wenn man das alles in Button1 hineinschreibt und als String Edit1 verwendet und wie hier logisch tauchen lässt, würde beim zweiten drücken auf den Button wieder der Ursprung entstehen (dechiffrieren) "hallo hier ist ein zirkus".Vielleicht kann mir jetzt jemand weiterhelfen
?
-
Hallo,
wie Du schon gemerkt hast, ist ein Fehler in meinem Beispiel. Finde doch mal heraus warum da am Ende '...yaa' steht.
Zu der 'Chiffrierung'. Sobald Du damit mehr als ein paar Worte 'codierst', wird das knacken nicht mehr als ein paar Sekunken dauern. Da Du vorhast immer nur Buchstabenpaare zu tauschen, wird das schon durch die statistische Auswertung der Häufigkeit der vorkommenden Zeichen möglich. Grundsätzlich komprimiert man die Daten vor der Verschlüsselung um die Entropie zu erhöhen. Dann erst verschlüsselt man die Daten. Dazu gibt's sogar Freewarekomponenten die das können. Das ist auf jeden Fall sicherer, als das was Du vorhast. Wirklich unknackbare Verschlüsslungsmethoden gibt es m.E. sowieso nicht (von einem unpraktikablen Einmalcode abgesehen).
-
wie wär's damit, so mal als grober Anhaltspunkt:
int feld[256]; for ( int i=0; i < 256; i++) feld[i]=0; feld['a']='b'; feld['b']='a'; feld['c']='z'; feld['z']='d'; feld['d']='c'; usw..... String Ausgang = Edit1->Text; for ( int i=1;i<=Ausgang.Length(); i++) Ausgang[i]=feld[Ausfang[i]]; Edit2->Text=Ausgang;
-
@ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin. Und meine Chiffrierung soll ja auch nicht "unknackbar" sein. Julius Caesar hat es zu seiner Zeit sogar als völlig ausreichend gefunden einfach nur alle Buchstaben des Alphabets drei stellen nach rechts zu verschieben (Cäsar-Chiffrierung). In deinem Code, finde ich aber den Fehler nicht.
int iLength = Edit1->Text.Length(); char* cText = new char[iLength + 1]; strcpy(cText, Edit1->Text.c_str()); for (int i = 0; i < iLength; i++) { if (cText[i] >= 'a' && cText[i] < 'y') // hier wird gesagt: Wenn der Wert //größer oder gleich 'a' und kleiner als 'z' cText[i]++; // , soll der nächste Buchstabe gewählt werden if (cText[i] == 'z') und wenn der Buchstabe z ist cText[i] = 'a'; dann der Buchstabe durch a ersetzt werden. } Edit1->Text = AnsiString(cText); delete[] cText;Gut, man könnte unter den Zeilen von if noch Klammern setzen {}, aber das hilft nichts.
Mit deinem Code kann ich ja auch nicht z.B. willkürlich vertauschen.
Wenn ich ne Liste davon anlege funztes auch nichtif (cText[i] == 'a') { cText[i] = 'b'; } ... if (cText[i] == 'z') { cText[i] = 'a'; }Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte.

-
Der Fehler ist eigentlich recht dumm...
Nimm nur mal den relevanten Teil: 'yz'
if (cText[i] >= 'a' && cText[i] < 'z') cText[i]++; // hier wird aus dem 'y' ein 'z' gemacht if (cText[i] == 'z') // hier wird aus dem gerade erzeugten 'z' fälschlicherweise ein 'a' gemacht cText[i] = 'a';Mögliche Lösungen:
if (cText[i] >= 'a' && cText[i] <= 'z') cText[i]++; if (cText[i] == 'z' + 1) cText[i] = 'a';oder:
int iLength = Edit1->Text.Length(); char* cText = new char[iLength + 1]; bool bHandled; strcpy(cText, Edit1->Text.c_str()); for (int i = 0; i < iLength; i++) { bHandled = false; if (cText[i] >= 'a' && cText[i] < 'z') // hier wird gesagt: Wenn der Wert //größer oder gleich 'a' und kleiner als 'z' { cText[i]++; bHandled = true; } if (cText[i] == 'z' && !bHandled) cText[i] = 'a'; } Edit1->Text = AnsiString(cText); delete[] cText;
-
uluru schrieb:
@ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin.
Der erste Griff wäre dann also zum Debugger...
-junix
-
uluru schrieb:
Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte.
na dann schau dir einfach mal meine lösung an :p
-
Jo Danke an euch alle, hab mir mal das Beispiel von Zwerg23 angeguckt und es hat geklappt, genau so wie ich es mir vorgestellt hab. Die anderen Sachen schaue ich mir bei Gelegenheit auch mal an.

Hier der Code (zu dem Beispiel alle Buchstaben einen Platz weiter nach rechts zu schieben):
int feld[256]; for ( int i=0; i < 256; i++) feld[i]=0; feld['a']='b'; feld['b']='c'; feld['c']='d'; feld['d']='e'; feld['e']='f'; feld['f']='g'; feld['g']='h'; feld['h']='i'; feld['i']='j'; feld['j']='k'; feld['k']='l'; feld['l']='m'; feld['m']='n'; feld['n']='o'; feld['o']='p'; feld['p']='q'; feld['q']='r'; feld['r']='s'; feld['s']='t'; feld['t']='u'; feld['u']='v'; feld['v']='w'; feld['w']='x'; feld['x']='y'; feld['y']='z'; feld['z']='a'; String Ausgang = Edit1->Text; for ( int i=1;i<=Ausgang.Length(); i++) Ausgang[i]=feld[Ausgang[i]]; Edit1->Text=Ausgang;thx auch allen. Ihr seid echt nett.

-
@Joe_M:
Hi,
ein einfaches else vor der 2. if hätte nicht gereicht?
MfG
Alexander Sulfrian