Προς το περιεχόμενο

Κρυπτογράφηση και κωδικοποίηση σε C++


Jaco

Προτεινόμενες αναρτήσεις

O AES δεν έχει "αυθεντικό" ή κάτι άλλο είναι απλά ένας αλγόριθμος κρυπτογράφησης... το πώς θα τον υλοποιήσεις και με ποιό τρόπο ορίζεται σαφέστατα από τον ίδιο τον αλγόριθμο και δεν μπορείς να κάνεις κάτι διαφορετικό γιατί δεν θα είναι AES...

 

τον κώδικα μπορείς να τον δεις εδώ..: http://www.hoozi.com/Articles/AES_Encryption.htm

 

Δουλεύει παντού και πάντα... είναι σε C (δηλαδή δουλεύει αυτούσια στην C++)...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 125
  • Δημ.
  • Τελ. απάντηση

Σε ευχαριστώ πολύ για την άμεση απάντηση σου Jaco. Συγνώμη για την ανόητη διατύπωση του αυθεντικού απλά δεν έβρισκα κάποιον άλλο τροπο να εκφράσω ότι ήθελα έναν λυτό και απέρριτο κώδικα που θα υλοποιεί τον AES.

 

Ευχαριστώ και πάλι..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Kαθώς σέρφαρα είδα τυχαία αυτό το thread,και είπα να ποστάρω το παρακάτω πρόγραμμα που είχα φτιάξει πριν κάποιο καιρό.Το πρόγραμμα μου κωδικοποιεί ένα κείμενο και το αντίθετο για ένα κείμενο που έχει κωδικοποιηθεί με το πρόγραμμα μου. Δεν έχω διαβάσει κάτι σχετικά με την κωδικοποιήσει απλά μου ήρθε να το φτιάξω ξεκάρφωτα μια ωραία πρωία:P.Δεν έχω γράψει και καθόλου σχολεια, δεν ξέρω αν θα βγάλετε άκρη άμα το κοιτάξετε :o . :shock:

 

>
#include<iostream>
#include<conio.h>
#include <string>
#include <fstream>


using namespace std;


class kod
{
public:

void kwdikopoihths()
{
orismos();
do
{
do
{
system("cls");
st="";
sv="";
strcpy(sf,"");
cout << "1|Kwdikopoihsh--2|Apokwdikopoihsh--3|exit" << endl;
l=getch();
if(l=='3')
	{
	goto end;
	}
}
while(l!='1'&&l!='2');
cout << "1|Apo keyboard--2|Apo arxeio" << endl;
do
{
k=getch();
}
while(k!='1'&&k!='2');
if(k=='1')
{
cout<< "Grapse thn protash: ";
getline(cin,st);
}
else if(k=='2')
{
m=1;
cout<< "Plikrologise to arxeio pou thes na anixeis: ";
cin.getline(sf,256);
if(srfile()==1)
	goto end;
}

len=st.length();
len=len-1;
if(l=='1')
{
trans();
cout << sv <<endl;
}
else if(l=='2')
{
untrans();
cout << sv <<endl;
}
cout<<"Thes na to apothikefseis? y/n" << endl;
do
{
b=getch();
tolower(;
}
while(b!='y'&&b!='n');
if(b=='n')
goto end;
do
{
cout<< "Plikrologise to arxeio pou thes na apothikeftei: ";
cin.getline(sf,256);
}
while(sf==NULL);
m=0;
srfile();
end:cout << endl;
system("pause");
}while(l!='3');
}

private:
void orismos()
{
a [ 0 ] = 31 ;

for(i=1;i<=95;i++)
	{
	a[i]=a[i-1]+1;
	}
for(i=1;i<=95;i++)
	{
	for(j=1;j<=95;j++)
		{
		z[i][j]=static_cast<char>((a[i]+a[j])%95+32);
		}
	}
for(i=1;i<=95;i++)
	{
	z1[i]=static_cast<char>((a[i]+666)%95+32);
	}
}

void trans()
{
n=0;
sv="";

for(i=1;i<=95;i++)
{
if(st[n]==a[i])
	{
	sv=sv+z1[i];
	i=95;
	}
}
for(n=1;n<=len;n++)
{

for(i=1;i<=95;i++)
	{
	for(j=1;j<=95;j++)
		{
		if(st[n]==a[j]&&st[n-1]==a[i])
			{
			sv=sv+z[i][j];
			i=j=95;
			}
		}
	}
}
}

void untrans()
{

n=0;
sv="";

for(i=1;i<=95;i++)
{
if(st[n]==z1[i])
	{
	sv=sv+static_cast<char>(a[i]);
	i=95;
	}
}

for(n=1;n<=len;n++)
{
for(i=1;i<=95;i++)
	{
	for(j=1;j<=95;j++)
		{
		if(st[n]==z[i][j]&&sv[n-1]==static_cast<char>(a[i]))
			{
			sv=sv+static_cast<char>(a[j]);
			i=j=95;
			}
		}
	}
}
}

int srfile()
{
if(m==0)
{
ofstream outfile( sf , ios :: out );
outfile << sv;
}
else if(m==1)
{
ifstream infile( sf , ios::in );
if(infile==NULL)
	{
	cout << "To arxeio den iparxei" << endl;
	return 1;
	goto error;
	}
while(infile.eof()!=1)
	{
	getline(infile,st2);
	st=st+st2;
	}


}
return 0;
error:system("pause");
}

int a[97],i,j,k,l,len,m,n,b;
string st,sv,st2;
char z[97][97],z1[97];
char sf[256];
};



int main()
{
kod kodip;
kodip.kwdikopoihths();
return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Καλησπέρα σας...

 

Παρακαλώ αν είναι δυνατόν μπορεί κάποιος να ποστάρει σε C

το ceasar cipher και το affine cipher?

(όσο απλό αν γίνεται καλύτερα)

(κρυπτογράφηση κ αποκρυπτογράφηση)

Είναι μεγάλη ανάγκη...

 

Σας ευχαριστώ προκαταβολικά και συγνώμη για το request.. :fear:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα σας...

 

Παρακαλώ αν είναι δυνατόν μπορεί κάποιος να ποστάρει σε C

το ceasar cipher και το affine cipher?

(όσο απλό αν γίνεται καλύτερα)

(κρυπτογράφηση κ αποκρυπτογράφηση)

Είναι μεγάλη ανάγκη...

 

Σας ευχαριστώ προκαταβολικά και συγνώμη για το request.. :fear:

 

Ακολουθεί με απλό όσο το δυνατόν τρόπο το κρυπτογράφημα του Καίσαρα σε C γραμμένο σε MS Visual C++ 2008 Express Edition IDE το οποίο είναι και free από το διαδίκτυο σε MS Windows XP Pro SP2. Απλά αυτό που δεν καταλαβαίνω είναι γιατί να μην προσπαθεί κανείς να μάθει λίγο C, να νιώσει λίγο τον προγραμματισμό. Φίλε μου δεν σου γράφω την αποκρυπτογράφηση, δεν είναι δύσκολο να φτιάξεις ένα brute force attacker να σπάει τον Καίσαρα, αλλά θα μου πεις εδώ δεν φτιάχνουν το ευθύ θα φτιάξουν το αντίστροφο;

Τέλος πάντων για να μείνει και στο φόρουμ ορίστε:

>
/* Caesar Cipher Encryption by BokDB-Bokarinho.*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

/* Encrypt Function. */
char *CaeserCiperEncrypt(const char *PlainText, const int Key)
{
char *CipherText = NULL;
if(!PlainText)
	return NULL;
if(Key < 0 || Key > 25)
{
	printf("You should enter the correct key.\nAborting....\n");
	return NULL;
}
else
{
	/* Start the encryption procedure. */
	static unsigned int Idx;
	if((CipherText = calloc((int)strlen(PlainText)+1, sizeof(char))) == NULL)
	{
		printf("Can not allocate enough heap memory for the cipher text..\n");
		return NULL;
	}
	for(Idx = 0; Idx < strlen(PlainText); Idx++)
		CipherText[idx] = PlainText[idx] != ' ' ? PlainText[idx] + fmod(Key, 26) : PlainText[idx];
	CipherText[idx] = '\0';
	return CipherText;
}
}
/* Main Code. */
int main(int argc, char *argv[])
{
char *PlText = "Hello Cruel World.";
char *CipherText = CaeserCiperEncrypt(PlText, 3); 
printf("PlainText: %s\n", PlText);
printf("CipherText:%s\n", CipherText);
/* Free memory gained on heap. */
free(CipherText);
getchar();
return EXIT_SUCCESS;
}

 

Εκτυπωμένα αποτελέσματα:

 

PlainText: Hello Cruel World.

CipherText:Khoor Fuxho Zruog1

 

Δεν ξέρω τώρα, θα το δώσεις στον καθηγητή σου και θα σου πει μπράβο; Για πες μου;

 

 

-----Προστέθηκε 23/11/2008 στις 03 : 18 : 44-----

 

 

Πραγματικά ξέχασα και σαν νιουμπάς και εγώ έγραψα κώδικα όταν ο φίλτατος DirectX έχει δώσει recital στις προηγούμενες σελίδες, προς θεού τα πάντα υπάρχουν σε αυτό το φόρουμ, ούτε καν στον κόπο να ψάξουν κάποιοι δεν μπαίνουν. Φίλε, η άσκηση σου είναι έτοιμη..Μην το πεις ούτε του παπά.

:X:X:X

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πραγματικά ξέχασα και σαν νιουμπάς και εγώ έγραψα κώδικα όταν ο φίλτατος DirectX έχει δώσει recital στις προηγούμενες σελίδες, προς θεού τα πάντα υπάρχουν σε αυτό το φόρουμ, ούτε καν στον κόπο να ψάξουν κάποιοι δεν μπαίνουν. Φίλε, η άσκηση σου είναι έτοιμη..Μην το πεις ούτε του παπά.

:X:X:X

 

επειδή ζήτησε και το affine θα υποθέσω με κάθε επιφύλαξη ότι πρόκειται για πληροφορική τει αθηνών η κάνω λάθος? :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@Bokarinho:

Σε ευχαριστώ πολύ ;)

 

@PhreakeR :

 

Ακολουθεί μια υλοποίηση του Affine Cipher / Decipherer σε ANSI-C απλά διότι δεν το είχα υπόψη μου και μου κέντρισε το ενδιαφέρον, ειδικά όλα όσα αφορούν τα coprime και multiplicand inversions που απαιτεί για να επιτευχθεί η αποκρυπτογράφηση. Για περισσότερες πληροφορίες μελετήστε τα σχόλια του source:

 

>
/*-Affine Cipher / Decipher by Directx in ANSI-C-----------------------------
*
* Για περισσότερο ψάξε το Google! Το Google είναι φίλος σου!! 
*/

#include <stdio.h>
#include <string.h>
#ifdef	__BORLANDC__	/* Εντολές pragma για CodeGear/Borland compilers */
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
void AffineEnc(char *pszInput, int nKeyA, int nKeyB);
void AffineDec(char *pszInput, int nKeyA, int nKeyB);
int	 BruteMInv(int nKeyA, int nMod);

#define	_KEYA	11		/* Το κλειδί Affine */
#define	_KEYB	7		/* Το κλειδί Καϊσαρ */
#define _MODBASE 26		/* Τα γράμματα της αλφάβητου */

#ifdef	__BORLANDC__    /* Εντολές pragma για CodeGear/Borland compilers */
#pragma argsused
#endif
int main()
{
/* Τοπικές μεταβλητές */
char *pszPlainText = "THISISASIMPLETEST";
int	nMulInv;

/*
 * Το κλειδί μας είναι ( (Affine) _KEYA * pszPlainText + _KEYB (Ceasar shift) ) % _MODBASE
 */
AffineEnc(pszPlainText, _KEYA, _KEYB);
printf("Encrypted:\t%s\n", pszPlainText);

/* Υπολογισμός του multiplicative inverse για το nKeyA */
if((nMulInv = BruteMInv(_KEYA, _MODBASE)) == -1)
	printf(" KeyA (%d) not coprime within mod %d\n", nMulInv, _MODBASE);
else
 {
	/*
	 * Το κλειδί αποκρυπτογράφησης μας είναι ( (Affine) nMulInv * pszPlainText - _KEYB (Ceasar shift) ) % _MODBASE
	 */
	AffineDec(pszPlainText, nMulInv, _KEYB);
	printf("Decrypted:\t%s\nMulInv = %d\n", pszPlainText, nMulInv);
 }

/* Τέλος προγράματος */
printf("\nPress Enter to resume..");
getchar();
return 0;
}
/*---------------------------------------------------------------------------*/
void AffineEnc(char *pszInput, int nKeyA, int nKeyB)
{
int	nCharIdx = 0;

/*
 * Σε πρώτη φάση εφαρμόζουμε το κρυπτόγραμμα του Καίσαρα με βάση το nKeyB
 * και ύστερα πολλαπλασιάζουμε το κρυπτογράφημα του Καίσαρα με το nKeyA (Affine).
 *
 * Το nKeyA οφείλει να είναι coprime (πρώτος) μεταξύ των γραμμάτων / τιμών
 * του αλφάβητου (coprime).
 *
 * Σε κάθε περίπτωση φροντίζουμε ώστε να ανακυκλώνουμε το γινόμενο των
 * παραπάνω υπολογισμών μεταξύ των _MODBASE γραμμάτων του αλφαβήτου (μοδιακά μαθηματικά modulo).
 */
for(; nCharIdx < strlen(pszInput); nCharIdx++)
	pszInput[nCharIdx] = 'A' + ((nKeyA * pszInput[nCharIdx] - 'A' + nKeyB) % _MODBASE);
}

void AffineDec(char *pszInput, int nKeyA, int nKeyB)
{
int nCharIdx = 0;

/*
 * Αντιστρέφουμε την διαδικασία της ρουτίνας AffineEnc με την προϋπόθεση  όμως
 * ότι γνωρίζουμε το multiplicative inverse του nKeyA που χρησιμοποιήσαμε κατά
 * την διαδικασία κρυπτογράφησης.
 */
for(; nCharIdx < strlen(pszInput); nCharIdx++)
	pszInput[nCharIdx] = 'A' + (nKeyA * ((pszInput[nCharIdx] + 'A') - nKeyB) % _MODBASE);
}

int	 BruteMInv(int nKeyA, int nMod)
{
/*
 * Επέστρεψε το Modulo Multiplicative Inverse του nKeyA.
 *
 * Η μέθοδος υπολογισμού είναι Brute-Force καθώς το εύρος τιμών είναι
 * μικρό (_MODBASE γράμματα / αριθμοί).
 *
 * Για μεγαλύτερους αριθμούς δες την μέθοδο του Ευκλείδη / GCD.
 */
int	nMulInv = 0;
for(; nMulInv < nMod; nMulInv++)
	if((nMulInv * nKeyA) % nMod == 1)
		return	nMulInv;

return	-1; /* Το nKeyA δεν είναι coprime στο εύρος nMod */
}

 

Τεχνικά ως κρυπτογραφική μέθοδος δεν είναι καθόλου ασφαλής, πρόκειται για ένα ενισχυμένο κρυπτογράφημα Καίσαρα και μπορεί να αναλυθεί με την βοήθεια συχνοτήτων (απλό κρυπτογράφημα αντικατάστασης) και άλλες εξελιγμένες μαθηματικές τεχνικές.

 

Για ακόμα περισσότερες πληροφορίες σχετικά με αυτό τον απλό στο να σπάσει Cipher ψάξτε στο Google.

 

Υ.Γ.

Μαθηματικός δεν είμαι οπότε πιθανόν να υπάρχουν bugs ή άλλες αβλεψίες.

 

Ελπίζω να φανεί χρήσιμος ή τουλάχιστον ενδιαφέρον στους fans της Κρυπτογραφίας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδιά επειδη και εγω κανω κατι τετοιες εργασίες, ξερει κανεις που μπορω να βρώ τον Extended Greatest Common Divisor του ευκλείδη σε C ,C++ . Η ακομα καλητερα σε visual basic. TO χρειάζομαι άμεσα κάθε βοήθεια είναι πολύτιμη.

 

Thanks kai pali.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδιά επειδη και εγω κανω κατι τετοιες εργασίες, ξερει κανεις που μπορω να βρώ τον Extended Greatest Common Divisor του ευκλείδη σε C ,C++ . Η ακομα καλητερα σε visual basic. TO χρειάζομαι άμεσα κάθε βοήθεια είναι πολύτιμη.

 

Thanks kai pali.

 

Γιατί δεν φτιάχνεται ένα νέο thread που θα ποστάρουν άτομα που θέλουν να τους κάνουν τους εργασίες; Θα βόλευε πιστεύω...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καταρχήν ευχαριστώ όσους απάντησαν και τους ζητώ συγνώμη...

 

Φυσικά και ξέρω προγραμμστισμό (τουλάχιστον δεν είμαι τελείως άσχετος)

 

Σπουδάζω πληροφορική απλώς δεν προλάβαινα μέσα στο deadline

 

Βλέπετε έχουν μαζευτεί τόσες εργασίες (έδωσα μεγαλύτερη σημασία στην Ψηφιακή επεξεργασία Σήματος κ Εικόνας άλλωστε όσοι ασχολούνται με το άθλημα ξέρουν τι παλούκι είναι ;))

 

Πραγματικά είναι η πρώτη φορά που ζητάω κάτι τέτοιο σε φόρουμ...κ ντρέπομαι γι αυτο

 

Απλά τους χρειαζόμουν τους κώδικες όσο το δυνατόν πιο γρήγορα..και ρώτησα γτ είδα ότι κ άλλοι έχουν ασχοληθεί με το ζήτημα..

 

Σαφώς κ ξενερώνω με όσους (ακόμα κ μένα σε αυτήν την περίπτωση) ζητάνε κώδικα χωρίς να φτιάξουν κάτι οι ίδιοι πρώτα...

Πιστεύω μέσα από τα επόμενα ποστ μου να μπορέσω να επανορθώσω...

Πραγματικά συγνώμη...

 

 

-----Προστέθηκε 23/11/2008 στις 06 : 53 : 23-----

 

 

όπως και σαφώς δεν θα δώσω τον κώδικα στον καθηγητή μου αυτούσιο

 

μια κ ο καθηγητής κρυπτογραφίας είναι κατα βάση μαθηματικός

 

(κ δεν ξέρει τι του γίνεται)

 

οπότε ακόμα κ οι ντιρεκτίβες math.h θα του φανούν βουνό ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Μια απλή και αρκετά διαδεδομένη στους κύκλους των μυστικιστών κρυπτογραφική μέθοδος είναι το κρυπτογράφημα “Atbash”.

 

Πρόκειται για ένα κρυπτογράφημα υποκατάστασης των χαρακτήρων με τα αντίστροφα γράμματα του αλφάβητου που μας ενδιαφέρει.

 

Έτσι για παράδειγμα το Α γίνεται Ω, το Β γίνεται Ψ ενώ το Γ γίνεται Χ κτλ (ΑΒΓ -> ΧΨΩ). Η αποκρυπτογράφηση επιτυγχάνεται με αντίστροφη διαδικασία (ΧΨΩ -> ΑΒΓ).

 

Ο “Atbash” χρησιμοποιήθηκε αρκετά αποτελεσματικά (για την εποχή του καθώς σήμερα δεν προσφέρει καμιά ουσιαστική ασφάλεια!) σε διάφορα σημεία της Εβραϊκής βίβλου κεντρίζοντας μετέπειτα το ενδιαφέρον των Ευρωπαίων μελετητών – ερευνητών (αποκρυφιστών).

 

Ακολουθεί μια γρήγορη υλοποίηση του σε C++ για το λατινικό αλφάβητο:

 

>
/*
*-ATBASH CODEC in C++ (c) directx-------------------------------------------
*/
#include <iostream>
#include <string>
#include <locale>

#ifdef __BORLANDC__
#pragma hdrstop
#endif
//---------------------------------------------------------------------------

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
   //	Usage: ATBASHCODEC \"text\"
if(argc == 1)
 {
	std::cout << "ATBASHCODEC \"TEXT\"" << std::endl;
	return	1;
 }
else
 {
	std::string	strCipher = argv[1];

	//	On ATBASH input you get plain-text else you get ATBASH ciphered-text
	for(int	nCharIdx = 0; nCharIdx < strCipher.length(); nCharIdx++)
		if(std::isalpha(strCipher.at(nCharIdx)))
			std::cout << (char) ('Z' - ( ( 'Α' + std::toupper(strCipher.at(nCharIdx)) ) - 1) + 1);
		else // Invalid character - "spit" space
			std::cout << " ";
 }

//	End of program
return 0;
}
//---------------------------------------------------------------------------

 

Αν εισαχθεί (ως παράμετρος) κρυπτογραφημένο κείμενο θα πάρετε την αποκρυπτογράφηση του, αν εισαχθεί αποκρυπτογραφημένο κείμενο θα πάρετε την κρυπτογράφηση του.

 

Παράδειγμα:

>
Εντολή: ATBASHCODEC TEST
Αποτέλεσμα: GVHG

 

>
Εντολή: ATBASHCODEC GVHG
Αποτέλεσμα: TEST

 

Ο κώδικας έχει δοκιμασθεί σε ET/CodeGear C++ Builder (ενδεχομένως να χρειασθούν μικρές μετατροπές στις δηλώσεις std:: σε άλλους compilers).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 μήνες μετά...

Καλησπερα παιδια. Μηπως μπορει καποιος να ποσταρει καποιους, απλους οσο γινεται, κωδικες σε C για καποιους συγκεκριμενους αλγοριθμους?

Συγκεκριμενα χρειαζομαι (για εργασια της σχολης):

1)Monoalphabetic Substitution cipher

2)Transposition cipher

3)Homophonic Substitution cipher

4)Vigenere cipher

5)Beauford cipher

 

Ευχαριστω!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ακολουθεί μία υλοποίηση του Beaufort cipher κρυπτογραφήματος σε C, επεκτείνοντας έτσι το thread της κρυπτογράφησης με επιπλέον κώδικα και γνώση. Είναι μία δοκιμαστική έκδοση θα βελτιωθεί με μία καλύτερη main function, φυσικά μπορεί να περιέχει bugs ή άλλου είδους αβλεψίες.

>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define LCOUNT 26

/* Main Functions. */

char *CreateAlphabetText(int _offset, int nLetters)
{
static int i = 0;
unsigned short int _LSUM;
char *Alphabet = NULL;
if(!(Alphabet = (char *)calloc(nLetters+1, sizeof(char))))
{
	printf("Error, unable to allocate memory:%s\n", strerror(errno));
	return NULL;
}
for(i = 0; i < nLetters; i++)
{
	_LSUM = i+_offset; 
	if(_LSUM >= nLetters)
	{
		Alphabet[i] = 'A' + (_LSUM % nLetters);
		continue;
	}
	Alphabet[i] = 'A'+_LSUM;
}
/* Terminate the alphabet. */
Alphabet[nLetters] = '\0';
return i == nLetters ? Alphabet : NULL;
}
/* Creates the array tableau that consists the letter struct, sse wikipedia. */
char **Tabula_Recta(int RowCnt, int ColCnt)
{
static int i = 0, j = 0;
char **tableau = NULL;
if(!(tableau = (char **)calloc(RowCnt, sizeof(char*))))
{
	printf("Error, unable to allocate memory:%s\n", strerror(errno));
	return NULL;
}
else
{
	for(i = 0; i < RowCnt; i++)
	{
		if(!(tableau[i] = CreateAlphabetText(i, ColCnt)))
			break;
	}
	if(i != RowCnt)
	{
		free(tableau);
		return NULL;
	}
	return tableau;
	
}
}
/* Dumps a string array. */
void DumpArray(char **A, int RowCnt, int ColCnt)
{
static int i, j;
for(i=0; i < RowCnt; i++)
{
	for(j = 0; j < ColCnt; j++)
	{
		printf("%2c ", A[i][j]);
	}
	printf("\n");
}
}
/* Frees an array. */
void FreeArray(char **A)
{
unsigned short int i = 0;
if(A)
{
	while(i < LCOUNT)
	{
		
		free(A[i]);
		i++;
	}
	free(A);
	A = NULL;
}
}
/* Trims the space character. */
char* TrimSP(char *Text)
{
if(Text)
{
	unsigned short int i = 0, j = 0;
	char *rText = NULL;
	if(!(rText = calloc(strlen(Text)+1, sizeof(char))))
	{
		printf("Memory Error: %s\n",strerror(errno));
		return NULL;
	}
	for(i = 0; i < (unsigned int)strlen(Text); i++)
	{
		if(Text[i] == ' ')
			continue;
		rText[j++] = Text[i];
	}
	if(j < i)
	{
		rText = realloc(rText, (j+1) * sizeof(char));
		rText[j] = '\0';
		return rText;
	}
}
}
/* Basic encode function, encodes the plain text. */
char *EncodeBC(char *PText, char *KText)
{
if(PText && KText)
{
	/* This array will hold the encoded value of PText string using the Beaufort Cipher according to KText key value. */
	char *CipherText = NULL;
	/* Firstly we need to trim whitespaces from the input string. */
	char *tPText = TrimSP(PText);
	CipherText = strdup(tPText);
	memset(CipherText, 0, strlen(CipherText));
	if(tPText)
	{
		/* We create the Tabula Recta array here, english alphabet LCOUNT letters. */
		char **TRecta = Tabula_Recta(LCOUNT,LCOUNT);
		if(TRecta)
		{
			int index = 0, nIndex = 0;
			static int iDx, jDx;
			for(iDx = 0,jDx = 0; iDx < strlen(tPText); iDx++)
			{
				if(jDx == strlen(KText))
					jDx = 0;
				for(index = 0; index < LCOUNT; index++)
				{
					if(TRecta[0][index] == tPText[iDx])
						break;
				}
				for(nIndex = 0; nIndex < LCOUNT; nIndex++)
				{
					if(TRecta[nIndex][index] == KText[jDx])
						break;
				}
				/* Fetch me the key. */
				CipherText[iDx] = TRecta[nIndex][0];
				/* Reset the values. */
				nIndex = 0; index = 0;
				jDx++;
			}
			/* Terminate message. */
			CipherText[iDx] = '\0';
			/* Free used memory. */
			FreeArray(TRecta);
			free(tPText);
		}
		else
		{
			printf("Memory Fault: %s\n", strerror(errno));
			free(tPText);
			return NULL;
		}
	}
	/* Return the Cipher Text. */
	return CipherText;

}
else
{
	printf("Invalid function arguments: %s\n", strerror(errno));
	return NULL;
}

}

/* Main Code. */
int main(int argc, char *argv[])
{
char *Cipher = EncodeBC("DEFEND THE EAST WALL OF THE CASTLE", "FORTIFICATION");
printf("Bokarinho Beaufort Cipher Encode Implementation.\n\n");
printf("PlainText:DEFEND THE EAST WALL OF THE CASTLE\n");
printf("Key:FORTIFICATION\n");
printf("CipherText:%s\n", Cipher);
free(Cipher);
printf("Hit enter to continue...\n");
getchar();
return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...