BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- C++ - Frage Geheimsprache (http://www.black-board.net/thread.php?threadid=13494)


Geschrieben von bluesky am 16.08.2003 um 21:20:

  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 ? smile

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 Augenzwinkern

schonmal thx ...



Geschrieben von phlox81 am 16.08.2003 um 21:44:

 

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



Geschrieben von bluesky am 17.08.2003 um 12:53:

 

"STL Container Map" ??? <- sagt mir nichts



Geschrieben von phlox81 am 17.08.2003 um 14:37:

 

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



Geschrieben von CDW am 17.08.2003 um 16:32:

 

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 Augenzwinkern 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



Geschrieben von phlox81 am 17.08.2003 um 18:53:

 

einen Buchstaben durch einen anderen zu ersetzen ist aber keine sehr gute Idee.
So etwas lässt sich schon mit papier und bleistift sehr leicht decodieren.

Die Frage ist ja, ob er Zeichenweise codieren will, oder ganze Wörter durch
die Wörter der Geheimsprache ersetzen will.

Devil



Geschrieben von bluesky am 17.08.2003 um 20:22:

 

ne ich möchte zeichenweise codieren ...
also jeden buchstaben durch den der geheimsprache ersetzen ..



Geschrieben von Compuholic am 17.08.2003 um 21:47:

 

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.



Geschrieben von CDW am 18.08.2003 um 15:28:

 

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 Augenzwinkern )
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) .



Geschrieben von bluesky am 18.08.2003 um 17:34:

 

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 :\ `?



Geschrieben von Compuholic am 18.08.2003 um 17:46:

 

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.



Geschrieben von CDW am 18.08.2003 um 20:43:

 

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 Augenzwinkern ...
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...



Geschrieben von Kalka am 19.08.2003 um 04:13:

 

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 Augenzwinkern

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 Zunge raus

cu Kalka



Geschrieben von bluesky am 20.08.2003 um 14:29:

 

@Kalka thx das sieht ja schon gut aus aber :
ich raff da so einiges nich :
-wo kommen die "Geheimzeichen" hin
-wie funzt das ??????????? großes Grinsen



Geschrieben von Kalka am 21.08.2003 um 14:40:

 

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



Geschrieben von Cracker am 21.08.2003 um 15:40:

Augenzwinkern Geheimsprache in Visual Basic

Kann mir jemand den ganzen c++ Quellcode in VB umschreiben??
---> Ich benutze Visual Basic 6.0



Geschrieben von bluesky am 22.08.2003 um 12:55:

 

@ Kalka in welcher "form" müssen die zeichen in die datei ?
zb so : "'a','b','c'..." oder so : "a , b , c , d..." oder ka smile ..
ach ja : wnen ich das prog bei mir compiliere und starte kommt das :

"Crypter by Klaka" is klar ... Augenzwinkern
"Usage ...."
"Example ..."
"Press any key to continue"

so und wenn man dann was drückt schließt der das prog ..



Geschrieben von Kalka am 24.08.2003 um 00:26:

 

@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 Augenzwinkern

cu Kalka



Geschrieben von phlox81 am 24.08.2003 um 01:15:

 

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



Geschrieben von bluesky am 26.08.2003 um 20:07:

 

@ 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 ...


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH