Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 23:13

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Ceasar-Verschlüsslung Flasches Zeichen?!

Discussion on Ceasar-Verschlüsslung Flasches Zeichen?! within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2012
Posts: 3
Received Thanks: 0
Ceasar-Verschlüsslung Flasches Zeichen?!

Hey Epvp-Mitglieder

Ich wollte mal die Ceasar-Verschlüsslung in C++ schreiben und bin auf ein problem gestossen beim verschlüsseln kommen bei immer Sonderzeichen raus wen die Chiffre größer als 30 ist.

Hier der Code :
Code:
#include <iostream>
#include <string>

char zver(char c,int vers)                     //Zeichen Verschlüsseln
{
    int i = c;
    i += vers;
    if(i > 122)                       //soll 25 von dem Buchstaben abziehen wen er größer als 97 ist
        i -= 25;
    c = i;
    return c;
}

char zent(char c,int vers)                     //Zeichen Entschlüsseln
{
    int i = c;
    i -= vers;
    if(i < 97)                       //soll 25 zu dem Buchstaben addieren wen er kleiner als 97 ist
       i += 25;
    c = i;
    return c;
}

std::string txtver(std::string s,int vers)               //Soll für jeden Buchstaben des Textes die Funktion "zver" aufrufen
{
    for(unsigned int i = 0; i < s.length(); i++)
    {
        s[i] = zver(s[i],vers);
    }
    return s;
}

std::string txtent(std::string s,int vers)                   //Das gleiche wie oben nur halt Entschlüsseln
{
    for(unsigned int i = 0; i < s.length(); i++)
    {
        s[i] = zent(s[i],vers);
    }
    return s;
}

int main()                                       //hauptprogramm
{
    int vers;
    std::string s;
    int eingabe;

    do
    {

        std::cout << "---Ceasar-Verschluesslung---" << std::endl;
        std::cout << "<1> Verschluesseln" << std::endl;
        std::cout << "<2> Entschluesseln" << std::endl;
        std::cout << "<3> Beenden" << std::endl;
        std::cout << std::endl << "Eingabe : ";
        std::cin >> eingabe;

        std::cin.ignore();

        switch(eingabe)
        {
        case 1 :
            std::cout << std::endl << "Text : ";
            getline(std::cin,s);
            std::cout << std::endl << "Chiffre : ";
            std::cin >> vers;
            std::cout << std::endl << "Verschluesselter Text : " << txtver(s,vers) << std::endl << std::endl;
            break;
        case 2 :
            std::cout << std::endl << "Test : ";
            getline(std::cin,s);
            std::cout << std::endl << "Chiffre : ";
            std::cin >> vers;
            std::cout << std::endl << "Entschluesselter Text : " << txtent(s,vers) << std::endl << std::endl;
            break;

        }

    }
    while(eingabe != 3);
    return 0;
}
Ihr könnt es ja mal ausprobieren dan versteht ihr was ich meine!

Bin mir nicht sicher ob das euch hilft ich arbeite unter Linux!

Danke im vorraus!
Chromex3 is offline  
Old 05/17/2012, 11:58   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
nicht so genau angeschaut, aber 2 möglichkeiten seh ich so auf anhieb:

1.
Du erwischst ein Sonderzeichen zwischen den groß und kleinbuchstaben:


2.
if(i > 122)
i -= 25;

aus dem if nen while machen, wenn das zeichen == 122 ist und dann noch 30 raufkriegt ists bei 152 - 25 = 127 was ebenfalls außerhalb der zugelassenen zeichen befindet.
(wobei ich mir dann nicht sicher bin ob deine entschlüsselung noch funktioniert, wenn du nur kleinbuchstaben nimmst ist ein schlüssel > 25 sinnlos, den sollte man dann am besten schon vorher auf die entsprechende zahl runterrechnen)

EDIT1:
außerdem grad noch was eingefallen, chars sind signed, d.h. dass es durchaus vorkommen kann, dass ein key in den Minus bereich rutscht, ist wahrscheinlich auch dein Fehler.
Machst am besten am Anfang:
Key %= 26;
und prüfst dann:
if(i > 'z' || i < 'a')
i -= 25;

EDIT2:
und natürlich +/- 26, nicht 25.
Dr. Coxxy is offline  
Old 05/17/2012, 16:36   #3
 
elite*gold: 0
Join Date: May 2012
Posts: 3
Received Thanks: 0
Danke für die Antworten haben mir echt geholfen
Chromex3 is offline  
Old 05/17/2012, 20:07   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by 5anku View Post
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Crypt(char Array[], int Key);
char CryptKey(char Letter, int Key);

void Encrypt(char Array[], int Key);
char EncryptKey(char Letter, int Key);

#define LENGTH 100

int main(void)
{
    int Key;
    char String[LENGTH];
    
    // String und Key einlesen, keine Sonderzeichen nur Kleinbuchstaben
    gets(String);
    // Der Key darf nur Zwischen 1-26 sein
    scanf("%d", &Key);
    
    // Verschlüssele und Ausgabe
    Crypt(String, Key);
    printf("%s\n", String);
    
    // Entschlüssele und Ausgabe
    Encrypt(String, Key);
    printf("%s\n", String);
    
    system("PAUSE");
    return(0);
}

void Crypt(char Array[], int Key)
{
    int Index;
     
    for(Index = 0; Index < strlen(Array); Index++)
    {    
        Array[Index] = CryptKey(Array[Index], Key);
    }
}

char CryptKey(char Letter, int Key)
{
   int CryptKey;
   
   if((int)Letter == 32)
   {
       CryptKey = 32;
   }
   else
   {
       CryptKey = (int)Letter + Key;
       if(CryptKey > 122)
       {
          CryptKey = 97 + (CryptKey - 122 - 1);
       }
   }
   return((char)CryptKey);
}


void Encrypt(char Array[], int Key)
{
    int Index;     

    for(Index = 0; Index < strlen(Array); Index++) 
    {
        Array[Index] = EncryptKey(Array[Index], Key);       
    }  
}

char EncryptKey(char Letter, int Key)
{
   int EncryptKey;
   
   if((int)Letter == 32)
   {
       EncryptKey = 32;
   }
   else
   {
       EncryptKey = (int)Letter - Key;
       if(EncryptKey < 97)
       {
           EncryptKey = (122 + ((int)Letter - 97 + 1)) - Key;
       }
   }
   return((char)EncryptKey);
}
Ich habe meine Funktion noch einmal verbessert. Diesmal aber im guten alten C.

und dann mach ich es jetzt mal "richtig" vor:

Code:
void CryptString(char* String, char* Out, char Key)
{
	Key %= 26;
	while(*String)
	{
		if (*String == ' ')
		{
			*Out = *String;
		}
		else
		{
			*Out = *String + Key;
			if (*Out > 'z' || *Out < 'a')
			{
				*Out -= 26;
			}
		}
		Out++;
		String++;
	}
	*Out = '\0';
}
wobei ich mir das decrypt jetzt mal spare...

wers "sicher" machen will muss noch gucken dass der outbuffer net überläuft, aber das ist eigtl. sache des aufrufers.
Dr. Coxxy is offline  
Reply


Similar Threads Similar Threads
Verschlüsslung & Gamedatei
01/19/2012 - Metin2 Private Server - 1 Replies
Guten Abend liebe Community. Ich suche eine 2010er Gamedatei, die entbuggt sein sollte und wo man nur bis Level 120 leveln kann. EXP Bugs etc. sollten am besten gefixxt sein.Und dann noch ein Tool womit ich mein Client Verschlüsseln kann und die Exe muss mit den Pong von der Game übereinstimmen. Wäre nett wenn mir einer dabei hilft.
[Help][TeLock]Verschlüsslung
10/23/2011 - General Coding - 0 Replies
Hallo, wie der Titel schon sagt brauche ich Hilfe bei der TeLock Verschlüsslung (TeLock v0.98b1). Ich habe Google lang durchgesucht, viele Foren abgeklappert, dennoch hat es mir nicht geholfen, weil viele Feiles deleted waren. Ich hoffe hier auf Hilfe von euch, oder auf ein paar hilfreiche Raatschläge. kind regards, MB
Verschlüsslung? nur wie
01/26/2011 - Metin2 Private Server - 11 Replies
Hallo hab da mal eine frage wie kann ich meinen Client verschlüsslen das niemand mehr denn endpacken kann? will auch nicht denn verschlüssler denn Puplic ist ambesten das ich es auch nimmer endpacken kann ist das einfachste weiß das jemand wie? Hoffe ihr könnt mir hilfen! mfg holzi



All times are GMT +1. The time now is 23:13.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.