diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher.sln b/SW01-XTEA-Cipher/SW01-XTEA-Cipher.sln new file mode 100644 index 0000000..945b8a1 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33103.184 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SW01-XTEA-Cipher", "SW01-XTEA-Cipher\SW01-XTEA-Cipher.vcxproj", "{0A55D2C2-29E0-459E-9D86-975DAA49A8FC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Debug|x64.ActiveCfg = Debug|x64 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Debug|x64.Build.0 = Debug|x64 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Debug|x86.ActiveCfg = Debug|Win32 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Debug|x86.Build.0 = Debug|Win32 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Release|x64.ActiveCfg = Release|x64 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Release|x64.Build.0 = Release|x64 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Release|x86.ActiveCfg = Release|Win32 + {0A55D2C2-29E0-459E-9D86-975DAA49A8FC}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CA2079FF-CD2C-483D-B0DF-6DD4087A38E0} + EndGlobalSection +EndGlobal diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj new file mode 100644 index 0000000..e866c0c --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + 16.0 + Win32Proj + {0a55d2c2-29e0-459e-9d86-975daa49a8fc} + SW01XTEACipher + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj.filters b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj.filters new file mode 100644 index 0000000..6389907 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/SW01-XTEA-Cipher.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.c b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.c new file mode 100644 index 0000000..e69aa8d --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.c @@ -0,0 +1,75 @@ +#include /* Funktionsbibliothek: Integer */ +#include /* Funktionsbibliothek: Hilfsfunktionen */ +#include /* Funktionsbibliothek: Standard Ein- Ausgabe */ + +#include "main.h" +#include "decrypt.h" + +// disable deprecated warning +#pragma warning(disable : 4996) + +void decipher(uint32_t num_cycles, uint32_t v[2], uint32_t const k[4]) +{ + unsigned int i; + const uint32_t delta = 0x9E3779B9; // decipher changes: + uint32_t v0 = v[0], v1 = v[1], sum = delta * num_cycles; // sum = delta * num_cycles; + for (i = 0; i < num_cycles; i++) + { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); //-= + sum -= delta; //-=, exchange lines above and below + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); //-= + } + v[0] = v0; + v[1] = v1; +} + +int decrypt(char *LoadFName, char *SaveFName, uint32_t key[4]) +{ + int ErrorCode = NO_ERROR; /* Error-Code-Variable */ + FILE *LoadFile; /* File welches geladen wird */ + FILE *SaveFile; /* File welches gespeichert wird */ + char block[2] = {0}; + uint32_t block_uint32[2] = {0}; + uint32_t num_cycles = 16; + + /* Kontrolliertes oeffnen der Files */ + if ((LoadFile = fopen(LoadFName, "rb")) == NULL) + ErrorCode = ERROR_OPEN_LOAD_FILE; + if ((SaveFile = fopen(SaveFName, "wb")) == NULL) + ErrorCode = ERROR_OPEN_SAVE_FILE; + + /* Alle Filezugriffe moeglich ? */ + if (ErrorCode == NO_ERROR) + { + do + { + // reset vars + block_uint32[0] = 0; + block_uint32[1] = 0; + + // get 2 blocks from file + int x = 0; + while (x < 2) + { + fscanf(LoadFile, "%u ", &block_uint32[x]); + x++; + } + + decipher(num_cycles, block_uint32, key); + + // store decrypted block to file + fputc((char)block_uint32[0], SaveFile); + fputc((char)block_uint32[1], SaveFile); + + } while (!feof(LoadFile)); + } + + /* Wenn Orignalfile geoffnet werden konnte */ + if (ErrorCode != ERROR_OPEN_LOAD_FILE) + fclose(LoadFile); + /* Wenn Ausgabefile geschrieben werden konnte */ + if (ErrorCode != ERROR_OPEN_SAVE_FILE) + fclose(SaveFile); + + return (ErrorCode); /* Rueckgabe des Fehlercodes */ +} diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.h b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.h new file mode 100644 index 0000000..9d2fef5 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/decrypt.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +int decrypt(char* LoadFName, char* SaveFName, uint32_t key[4]); \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.c b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.c new file mode 100644 index 0000000..6a8e426 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.c @@ -0,0 +1,90 @@ +#include /* Funktionsbibliothek: Integer */ +#include /* Funktionsbibliothek: Hilfsfunktionen */ +#include /* Funktionsbibliothek: Standard Ein- Ausgabe */ + +#include "main.h" +#include "encrypt.h" + +// disable deprecated warning +#pragma warning(disable : 4996) + +void encipher(uint32_t num_cycles, uint32_t v[2], uint32_t const k[4]) +{ + unsigned int i; + const uint32_t delta = 0x9E3779B9; // decipher changes: + uint32_t v0 = v[0], v1 = v[1], sum = 0; // sum = delta * num_cycles; + for (i = 0; i < num_cycles; i++) + { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); //-= + sum += delta; //-=, exchange lines above and below + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); //-= + } + v[0] = v0; + v[1] = v1; +} + +int encrypt(char *LoadFName, char *SaveFName, uint32_t key[4]) +{ + int ErrorCode = NO_ERROR; /* Error-Code-Variable */ + FILE *LoadFile; /* File welches geladen wird */ + FILE *SaveFile; /* File welches gespeichert wird */ + char block[2] = {0}; + uint32_t block_uint32[2] = {0}; + uint32_t num_cycles = 16; + + /* Kontrolliertes oeffnen der Files */ + if ((LoadFile = fopen(LoadFName, "rb")) == NULL) + ErrorCode = ERROR_OPEN_LOAD_FILE; + if ((SaveFile = fopen(SaveFName, "wb")) == NULL) + ErrorCode = ERROR_OPEN_SAVE_FILE; + + /* Alle Filezugriffe moeglich ? */ + if (ErrorCode == NO_ERROR) + { + do + { + // reset vars + block[0] = 0; + block[1] = 0; + block_uint32[0] = 0; + block_uint32[1] = 0; + + block[0] = fgetc(LoadFile); + // if eof => quit + if(block[0] == EOF) + { + break; + } + block[1] = fgetc(LoadFile); + // if eof => replace with space to get previous character within encryption + if(block[1] == EOF) + { + block[1] = ' '; + } + + // convert + block_uint32[0] = (uint32_t)block[0]; + block_uint32[1] = (uint32_t)block[1]; + + encipher(num_cycles, block_uint32, key); + + // write encrypted block to file + int x = 0; + while (x < 2) + { + fprintf(SaveFile, "%u ", block_uint32[x]); + x++; + } + + } while (!feof(LoadFile)); + } + + /* Wenn Orignalfile geoffnet werden konnte */ + if (ErrorCode != ERROR_OPEN_LOAD_FILE) + fclose(LoadFile); + /* Wenn Ausgabefile geschrieben werden konnte */ + if (ErrorCode != ERROR_OPEN_SAVE_FILE) + fclose(SaveFile); + + return (ErrorCode); /* Rueckgabe des Fehlercodes */ +} diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.h b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.h new file mode 100644 index 0000000..8736115 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/encrypt.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +int encrypt(char* LoadFName, char* SaveFName, uint32_t key[4]); \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.c b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.c new file mode 100644 index 0000000..2ba0235 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.c @@ -0,0 +1,130 @@ +/******************************************************************************* + * How to run script: + * Run exe with following arguments in this order: + * 1. encrypt or decrypt (keyword) + * 2. file name (without extension) + * 3. path to folder where file is located in + * 4. file extension (e.g. ".TXT" - incl. dot!) + * Example Batch: + * ~dp0\SW01-XTEA-Cipher.exe encrypt test ~dp0 .TXT + * ~dp0\SW01-XTEA-Cipher.exe decrypt test_ENCR ~dp0 .CIP + *******************************************************************************/ + +/******************************************************************************* +* Include Files +*******************************************************************************/ +#include /* Funktionsbibliothek: Integer */ +#include /* Funktionsbibliothek: Hilfsfunktionen */ +#include /* Funktionsbibliothek: Standard Ein- Ausgabe */ +#include /* Funktionen zur Stringbearbeitung */ + +#include "main.h" +#include "decrypt.h" +#include "encrypt.h" + +// disable deprecated warning +#pragma warning(disable : 4996) + +/******************************************************************************* +******************************* HAUPTPROGRAMM ********************************** +*******************************************************************************/ +main(argc, argv) /* Argumente an main-Funktion */ +int argc; +char* argv[]; +{ + int Error = NO_ERROR; /* Errorcode der Filezugriffe */ + char LoadFileName[NAMENSGROESSE + 1]; /* Variable fuer Originalfile */ + char SaveFileName[NAMENSGROESSE + 1]; /* Variable fuer Sicherungsfile */ + char key[4] = { 0 }; + uint32_t key_uint32[4] = { 0 }; + int mode = MODE_UNKNOWN; // 0 = unknown, 1 = encrypt, 2 = decrypt + + if (strcmp(MODE, "encrypt") == 0) + { + mode = MODE_ENCRYPT; + } + else if (strcmp(MODE, "decrypt") == 0) + { + mode = MODE_DECRYPT; + } + // mode not recognized + else + { + printf("Modus nicht erkannt. Bitte encrypt oder decrypt bei Aufruf der Software angeben.\n"); + return -1; + } + + system("cls"); + puts("XTEA Cipher"); + puts("-----------------------\n"); + puts("Please type your key here: (ENTER key will start the process!)"); + + fflush(stdin); // Flush + fgets(key, 4, stdin); // Text einlesen (max. 4 Zeichen) + // convert array to uint32 + int i = 0; + while (i < 4) + { + key_uint32[i] = (uint32_t)key[i++]; + } + + /* Original file zusammensetzen */ + strcpy(LoadFileName, PFAD); + strcat(LoadFileName, DATEINAME); + strcat(LoadFileName, DATEIENDUNG); + + /* Output file zusammensetzen */ + strcpy(SaveFileName, PFAD); + strcat(SaveFileName, DATEINAME); + if (mode == MODE_ENCRYPT) + { + strcat(SaveFileName, ENCRYPTED_ADD); + strcat(SaveFileName, ENCRYPTED_ENDING); + printf("Encryption processing..."); + Error = encrypt(LoadFileName, SaveFileName, key_uint32); + } + else if (mode == MODE_DECRYPT) + { + strcat(SaveFileName, DECRYPTED_ADD); + strcat(SaveFileName, DECRYPTED_ENDING); + printf("Decryption processing..."); + Error = decrypt(LoadFileName, SaveFileName, key_uint32); + } + + system("cls"); + + /* Errors auswerten */ + if (Error == NO_ERROR) + { + printf("\n-> Ausgabefile konnte erstellt werden.\n"); + } + else + { + printf("ACHTUNG: Der Sicherungsvorgang konnte nicht umgesetzt werden!\n"); + printf("-> Errorcode: %d\n", Error); + switch (Error) + { + case ERROR_OPEN_LOAD_FILE: + { /* Problem mit Originalfile */ + printf("-> Originalfile konnte nicht geoeffnet werden!\n"); + printf(" Lesezugriff fuer Originalfile nicht moeglich!\n"); + break; + } + case ERROR_OPEN_SAVE_FILE: + { /* Problem mit Sicherungsfile */ + printf("-> Das Ausgabefile konnte nicht erstellt werden!\n"); + printf(" Schreibzugriff fuer Ausgabefile wurde verweigert!\n"); + break; + } + case ERROR_OPEN_VERSCHL_FILE: + { /* Problem mit PW-File */ + printf("-> Das Passwort-File konnte nicht erstellt werden!\n"); + printf(" Schreibzugriff fuer Passwort-File wurde verweigert!\n"); + break; + } + } + } + + system("pause"); + return (0); +} diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.h b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.h new file mode 100644 index 0000000..70bb12b --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/main.h @@ -0,0 +1,33 @@ +#pragma once +/******************************************************************************* + * Globale Deklarationen und Definitionen + *******************************************************************************/ +#define DECRYPTED_ENDING ".TXT" +#define ENCRYPTED_ENDING ".CIP" +#define DECRYPTED_ADD "_DECR" +#define ENCRYPTED_ADD "_ENCR" + + /* ErrorCodes */ +#define ERROR_OPEN_LOAD_FILE 11 /* Originalfile kann nicht gelesen werden */ +#define ERROR_OPEN_SAVE_FILE 21 /* Ausgabefile kann nicht geschr. werden */ +#define ERROR_OPEN_VERSCHL_FILE 31 /* Passwort-File kann nicht geschr. wertden */ +#define NO_ERROR 0 /* Kein Fehler vorhanden */ + +#define NAMENSGROESSE 120 /* Namensgroesse f?r Fileangabe */ + +#define CHECK_BIT(var, pos) ((var) & (1 << (pos))) +#define CLEAR_BIT(var, pos) ((var) &= ~(1 << pos)) +#define SET_BIT(var, pos) ((var) |= (1 << pos)) + +/* Parameteruebergabe Definition */ +#define MODE argv[1] +#define DATEINAME argv[2] +#define PFAD argv[3] +#define DATEIENDUNG argv[4] + +/* modes */ +#define MODE_UNKNOWN 0 +#define MODE_ENCRYPT 1 +#define MODE_DECRYPT 2 + +typedef unsigned char byte; \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/decrypt.bat b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/decrypt.bat new file mode 100644 index 0000000..9216a94 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/decrypt.bat @@ -0,0 +1 @@ +%~dp0\SW01-XTEA-Cipher.exe decrypt test_ENCR %~dp0 .CIP \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/encrypt.bat b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/encrypt.bat new file mode 100644 index 0000000..39da490 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/encrypt.bat @@ -0,0 +1 @@ +%~dp0\SW01-XTEA-Cipher.exe encrypt test %~dp0 .TXT \ No newline at end of file diff --git a/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/test.txt b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/test.txt new file mode 100644 index 0000000..5b64822 --- /dev/null +++ b/SW01-XTEA-Cipher/SW01-XTEA-Cipher/test-files/test.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \ No newline at end of file