|
|
Geheimsprache |
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
|
|
Geheimsprache |
|
HI ...
Ich wollte ein programm schreiben das normalen Text in eine selbst ausgedachte "geheimsprache" umsetzt ...
einzelne buchstaben sind ja kein problem nur ich hab keine ahnung wie ich das mit ganzen wörtern machen soll : dafür müsste das wort doch eigentlich in alle buchstaben zerlegt werden dann die buchstaben durch die von der geheimsprache ersetzt werden und dann wieder zusammengesetzt werden ... oder seh ich das falsch ?
und ich hab ehrlich gesagt voll keine ahnung wie man das mit C++ macht !
ach ja : ich progge mit dem Borland C++ Builder ( damit alles nachher was schöner is
schonmal thx ...
|
|
16.08.2003 21:20 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Hm, also wenn du ganze wörter in andere Wörter umwandeln willst,
schau dir mal den STL Container Map an, da kannst du strings miteinander
verknüpfen.
Devil
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
16.08.2003 21:44 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
"STL Container Map" ??? <- sagt mir nichts
|
|
17.08.2003 12:53 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Hm, du weist was die STL ist ?
Da gibts ne datenstruktur die nennt sich map<key, value>;
Damit kannst du dann zwei strings miteinander Verknüpfen.
Devil
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
17.08.2003 14:37 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
hm, mach doch nen char array (zum beispiel von char array[80]), dann ließt du deinen Text immer blockweise in diesen array ein - und dann kannst du ihn ganz bequem bearbeiten(z.b):
for (int i=0;i<=80;i++)
{
if (toupper(array[i])=='C' ) { array[i]='G(eheimzeichen)' }
if (toupper(array[i])=='A' ) { array[i]='G(eheimzeichen)' }
}
und dann wieder den nächsten Block einlesen...
(nun ja, ich wusste nicht mehr, wie man case in C richtig schreibt
deshalb auch die ifs.
betrachte doch die Wörter als abfolgen von Zeichen - streng genommen brauchts du die doch nicht auseinander zu zerlegen - nur auf jeden Buchstaben zugreifen können. Und ich würde mir die Sache mit den zeigern auf Strings usw nicht antun. Denn wenn ich dich richtig verstanden hab, willst du nur die Buchstaben ersetzen durch eigendefenierte und nicht die Wörter.
allgemeingültig würde ich ungefähr so was verwenden (lässt sich meines Wissens nach auch in C relativ einfach umsetzen):
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
datenstruktur:
Array von 80 zeichen;
Ablauf:
öffne die Textdatei;
lese die ersten 80 zeichen in den Array ein
gehe zeichen für zeichen durch, ersetze falls notwendig
speichere den Array in einer neuen datei;
mach so lange weiter bis Textdatei zu ende
|
|
|
|
17.08.2003 16:32 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
ne ich möchte zeichenweise codieren ...
also jeden buchstaben durch den der geheimsprache ersetzen ..
|
|
17.08.2003 20:22 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
Wenn es ein bestimmtes Muster gibt, nachdem die Buchstaben vertauscht werden sollen, dann gibt es eine sehr effiziente Lösung. Ich hab einfach den einfachsten Fall programmiert. Es fehler natürlich eine Menge Überprüfungen (z.B. was passiert, wenn das ASCII-zeichen 255 verschlüsselt wird). So wie ich das jetzt programmiert habe ist das Programm nicht binary safe. Außerdem muß immer Sorge getragen werden, daß der String NULL-terminiert ist (was aber kein Problem darstellen sollte):
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
char Plaintext[] = "BlahBlubb";
char *ptr = Plaintext;
while (*ptr)
{
*ptr += 3; //wenn jeder Buchstabe durch das ASCII-Zeichen ersetzt werden soll, was 3 Zeichen hinter ihm liegt.
ptr++;
}
|
|
Wenn Du die Buchstabenreihenfolge selbst wählen willst, mußt Du zwangsläufig ein Array, wie CDW es vorgeschöagen hat verwendet. C++ für so ein kleines Programm zu verwenden ist eigentlich Unsinn. Da tut es normales C genauso.
|
|
17.08.2003 21:47 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
|
|
nein, ich kann kein C, aber diese kleine Lösung funktioniert bei mir ganz gut (Icc 32 Compiler,fast ANSI-C):
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
|
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_BUCHSTABEN 26
#define MAX_BUF 80
char tabelle[MAX_BUCHSTABEN]={'A','C','B','D','O','F','G','H','I','J',
'K','L','M','N','E','P','Q','R','S','T','U',
'V','W','X','Y','Z'};
char buffer[MAX_BUF];
void einlesen (char *buf)
{
gets(buf);
}
void ersetzen (char *buf)
{
int i=0;
do
if (isalpha(buf[i])) /*leerzeichzen usw werden ignoriert*/
buf[i]=tabelle[(toupper(buf[i])-'A')]; /*jeder buchstabe besitzt nen ASCII Wert,*/
while(buf[i++]); /*davon ziehen wir den Wert von A ab (erster buchstabe)*/
} /*so können wir auf die Tabelle direkt zugreifen*/
void ausgeben (char *buf)
{
printf("Ersetzter Text \n");
puts(buf);
getchar(); /*damit das programm sich nicht sofort schließt und wir die Ausgabe bewundern können*/
}
int main(void)
{
einlesen(buffer);
ersetzen(buffer);
ausgeben(buffer); /*stattdessen kann man auch irgendwo speichern*/
return 0;
}
|
|
Hm, kleine Erklärung:
Tabelle ist ein char array von 26, wo die ganzen 'Geheimzeichen' in Alphabetreihenfolge stehen (das heißt original A,B,C,D usw) - ich habe nur einige vertauscht, damit man es noch sieht.Vertauschen kann man nach belieben.
vom Prinzip basiert es darauf, dass ja jeder buchstaben einen ASCII Wert hat ('A' fängt bei 65 an), somit hab ich mir gedacht, machst du einfach ne Tabelle, wo du den Buchstabenwert als Index benutz. Damit man keine Tabelle von 91 braucht (da die Großbuchstaben erst beim Wert von 65 anfangen), ziehe ich den Wert von 'A' vorher ab - es gibt auch nur großbuchstaben und keine überprüfung beim Einlesen auf eventuellen Überlauf (ist aber im Prinzip nicht schwer zu realisieren).Man kann stattdessen auch einen File einlesen und auch abspeichern (bei C++ ist sicherlich cin/cout bequemer, jedoch wollte ich jetzt nicht noch in C++ Büchern blättern
)
Auf jeden fall wird in :
code: |
1:
|
buf[i]=tabelle[(toupper(buf[i])-'A')] |
|
nachgeschaut, welche Zeichen bei Eingabe 'B' für eben dieses 'B' eingesetzt werden soll - in der Tabelle steht für 'B' ein 'C' (Buchstabenreihenfolge beachten)
Edit: wenn ich mich nicht irre, ist es ANSI-C und müsste deshalb auch mit jedem anderen compiler/plattform laufen(jedenfalls den Icc-win32 auf ANSI-C Code gestellt und der hat nicht gemekert) .
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von CDW: 18.08.2003 15:42.
|
|
18.08.2003 15:28 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
vielen dank @ CDW - dein code funzt perfekt da gibt es nur ein problem :
die zeichen aus meiner "sprache" beinhalten mehr als nur ein zeichen...
also sagen wir einfach mal für "a" = "3--" <- wenn ich das so mache also für das a ein "3--" einsetze kommt nachher ein "-" raus , wie kommt das :\ `?
|
|
18.08.2003 17:34 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
Das kommt daher, weil man in C eine "echte" Programmiersprache hat *g*.
Wenn man mit Strings (Zeichenketten) arbeitet, hat man immer einen Pointer (eine Variable die eine Speicheradresse anthält) auf das erste Zeichen des Strings. Von da aus wird dann byteweise weitergelesen, bis man auf eine Speicherzelle stößt in der der Wert NULL steht. Das Problem tritt auch in deinem Programm auf.
Das Array in dem die "Geheimzeichen" stehen ist ein Array vom Typ char. Daß heißt jedes Element in diesem Array ist ein Byte groß und kann daher 1 Buchstaben fassen. Ich vermute, daß wenn Du einem Element versuchst einen Wert '3--' zuzuweisen, daß der Compiler dann einfach den letzten Wert nimmt. Mit mehreren Buchstaben wird das Programm schon wesentlich komplizierter, weil Du
1. Nicht voraussehen kannst, wie groß der Ciphertext wird. Daher mußt du mit dynamischer Speicherverwaltung arbeiten.
2. Das Array mit den Geheimzeichen als char[2][] oder char [3][] oder was auch immer (auf jeden aber Fall 2-dimensional) deklarieren mußt.
3. Wenn du 2. anwendest Du auch die Zeile zum Ersetzen ändern mußt, weil sich dadurch auch der Offset der Array-Elemente ändert.
|
|
18.08.2003 17:46 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
es war eine Lösung von vielen - man könnte es auch mit vielen Case Anweisungen oder IFS umsetzen.
Hm, mehrere Zeichen könnte man auch umsetzen, dafür muss man beim ersetzen die Zeigergröße entsprechend anpassen(z.b über einen selbstdefenierten Type von 3 Byte Größe) und noch einen zusätzlichen Buffer für die "übersetzung" schaffen (etwa so: if (buffer[i]=='A') (uebersetzungs_buf[i]='3--') (dabei die übersetzungs_buffergröße anpassen);
ich überlasse hier das Feld denen, die des C mächtig sind, jedenfalls wäre das in Asm oder Pascal kein Problem
...
aber: das größte Problem wäre bei dieser Art der Geheimsprache die Übersetzung - wenn man nicht mehr Buchstabe für Buchstabe durchgehen kann, muss man sich was einfallen lassen - auf jeden fall viel mehr Aufwand(besonders wenn es nicht nur 3 Zeichen sein sollen, sondern auch mehr oder weniger gleichzeitig) und wofür? - das Verfahren lässt sich relativ einfach entschlüsseln...
|
|
18.08.2003 20:43 |
|
|
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
|
|
|
|
hmm, ich hab im Moment nichts zu tun da hab ich einfach mal nen kleines Verschlüsselungs-Programm geschrieben, vielleicht hilft es weiter..und verbessern kann man es auch noch
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
|
#include <stdio.h>
#include <string.h>
#include <windows.h>
FILE *f;
FILE *f2;
bool decrypt=true;
//zum (de)crypten
int crypt(char key)
{
char zeichen;
while ( (zeichen = getc(f)) != EOF)
{
switch(zeichen)
{
case '\n': //aus Zeilenumbrüche mache Tabs
{
zeichen = '\t';
fputc(zeichen,f2);
break;
}
case '\t':
{
zeichen = '\n'; //aus Tabs mache Zeilenumbrüche
fputc(zeichen,f2);
break;
}
default:
{
if (decrypt) //Welche Richtung? Crypten oder decrypten?
zeichen += key;
else
zeichen -= key;
fputc(zeichen,f2);
}
}
}
return 0;
}
int main(int argc, char *argv[])
{
int t1;
int t2;
//Hilfe!
if (argc != 5)
{
printf("Crypter(c) by Kalka\n");
printf("Usage %s <File1> <File2> <Key> <c(rypt)/d(ecrypt)>\n",argv[0]);
printf("Example: %s c:\\test.txt c:\\test2.txt A c\n",argv[0]);
return 0;
}
f = fopen(argv[1],"r");
f2 = fopen(argv[2],"w");
if (argv[4][0] == 'c')
{
decrypt = false;
}
//Datei vorhanden?
if (f == NULL)
{
printf("Error: File not found.");
return 1;
}
t1 = GetTickCount();
crypt(argv[3][0]);
t2 = GetTickCount();
printf("\nTime: %d milliseconds\n",t2-t1);
fclose(f);
fclose(f2);
return 0;
}
|
|
über die Eingabeaufforderung (Windows) aufrufen und zwar so:
[Programm] c:\zu crypten.txt c:\outpu.txt X c
Parameter:
1: die datei, die Ver/Ent-schlüsselt werden soll
2: da soll sie hingeschrieben werden (die ent/ver-schlüsselte Datei)
3: einen Key, aber nur ein Zeichen - welcher ist egal (1,2,a,",.,...)
4: ein "c" oder "d" zum crypten oder decrypten...
ich weiß, schlimmer Stil :-s..aber er functioniert
cu Kalka
__________________ In wirklichkeit sind wir alle kleine grüne Kaninchen!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kalka: 21.08.2003 14:42.
|
|
19.08.2003 04:13 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
@Kalka thx das sieht ja schon gut aus aber :
ich raff da so einiges nich :
-wo kommen die "Geheimzeichen" hin
-wie funzt das ???????????
|
|
20.08.2003 14:29 |
|
|
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
|
|
die Geheimzeichen kommen in die Datei, die man als zweiten Parameter angibt. Der liest immer ein Zeichen aus der Orginalen (oder Verschlüsselten) Datei aus, und schreibt es dann verändert (mit dem Key addiert) in die zweite datei..
cu Kalka
__________________ In wirklichkeit sind wir alle kleine grüne Kaninchen!
|
|
21.08.2003 14:40 |
|
|
Cracker
Neuling
Dabei seit: 21.08.2003
Beiträge: 8
Herkunft: aus'm Internet ;)
|
|
Geheimsprache in Visual Basic |
|
Kann mir jemand den ganzen c++ Quellcode in VB umschreiben??
---> Ich benutze Visual Basic 6.0
__________________ Ich lerne zur Zeit die Sprache Visual Basic 6.0. Mein Hobby ist zu hacken. Ich knacke zu gerne Passwörter und schreibe für mein Leben gern Viren und Würmer.
|
|
21.08.2003 15:40 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
@ Kalka in welcher "form" müssen die zeichen in die datei ?
zb so : "'a','b','c'..." oder so : "a , b , c , d..." oder ka
..
ach ja : wnen ich das prog bei mir compiliere und starte kommt das :
"Crypter by Klaka" is klar ...
"Usage ...."
"Example ..."
"Press any key to continue"
so und wenn man dann was drückt schließt der das prog ..
|
|
22.08.2003 12:55 |
|
|
Kalka
BlackBoarder
Dabei seit: 16.03.2002
Beiträge: 856
|
|
@bluesky:
ja das ist auch so richtig, denn du musst das Programm dann nachher über die EIngabeaufforderung starten (Start/Programme/Zubehöhr/Eingabeaufforderung oder W2k: Start/Ausführen cmd.exe)
Die Zeichen in die Datei? Na so:
code: |
1:
2:
3:
|
Das ist der Inhalt einer Textdatei
|
|
also im Grunde ganz normal
cu Kalka
__________________ In wirklichkeit sind wir alle kleine grüne Kaninchen!
|
|
24.08.2003 00:26 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Hm, schaut doch mal im bb unter Projekte.
Da gibts von mir ein Programm (nennt sich Cipher)
welches Dateien mit Passwort und Xor verschlüsselt,
ist ein wenig sicherer als die hier propagierten Methoden...
Devil
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
24.08.2003 01:15 |
|
|
bluesky
Aufsteiger
Dabei seit: 08.11.2002
Beiträge: 59
Herkunft: Willich
Themenstarter
|
|
@ Devil81
thx aber :
mein prog soll einfach nur einen text in einen anderen umwandeln so das man den umgewandelten Text z.b.: per eMail verschicken kann ...
|
|
26.08.2003 20:07 |
|
|
|
|
|
|