Der Code implementiert mehrere Verschlüsselungsmethoden, die über eine grafische Benutzeroberfläche in Delphi verfügbar gemacht werden. Hier sind die Hauptmethoden und ihre Implementierung:
Die Caesar-Verschlüsselung verschiebt jeden Buchstaben im Klartext um eine feste Anzahl von Positionen im Alphabet.
void __fastcall TForm2::Button1Click(TObject *Sender) {
String sText = Memo1->Lines->Text;
String sVerText;
int iVerCode = StrToInt(Edit1->Text);
for (char cBuchstabe : sText) {
if (isupper(cBuchstabe)) {
cBuchstabe = (cBuchstabe - 'A' + iVerCode) % 26 + 'A';
} else if (islower(cBuchstabe)) {
cBuchstabe = (cBuchstabe - 'a' + iVerCode) % 26 + 'a';
}
sVerText += cBuchstabe;
}
Memo2->Lines->Add(sVerText);
}
void __fastcall TForm2::Button2Click(TObject *Sender) {
String sText = Memo1->Lines->Text;
String sVerText;
int iVerCode = StrToInt(Edit1->Text);
for (char cBuchstabe : sText) {
if (isupper(cBuchstabe)) {
cBuchstabe = (cBuchstabe - 'Z' - iVerCode) % 26 + 'Z';
} else if (islower(cBuchstabe)) {
cBuchstabe = (cBuchstabe - 'z' - iVerCode) % 26 + 'z';
}
sVerText += cBuchstabe;
}
Memo2->Lines->Add(sVerText);
}
Die XOR-Verschlüsselung verwendet einen Schlüssel, um jeden Buchstaben des Klartexts zu verschlüsseln. Jeder Buchstabe wird mit dem entsprechenden Buchstaben im Schlüssel mittels XOR verknüpft.
void __fastcall TForm2::xor_btnClick(TObject *Sender) {
String sText = xor_memo1->Lines->Text;
String sVerCode = xor_key->Text;
int sVerCodeLength = sVerCode.Length();
int sVerCodeIndex = 1;
String sVerText;
for (char cBuchstabe : sText) {
sVerText += static_cast(cBuchstabe ^ sVerCode[sVerCodeIndex]);
sVerCodeIndex++;
if (sVerCodeIndex > sVerCodeLength) {
sVerCodeIndex = 1;
}
}
xor_memo2->Lines->Add(sVerText);
}
Die Vigenere-Verschlüsselung verwendet einen Schlüsselwort, um die Buchstaben des Klartexts zu verschlüsseln. Jeder Buchstabe im Klartext wird um die Position des entsprechenden Buchstabens im Schlüsselwort verschoben.
UnicodeString VigenereEncrypt(const UnicodeString &text, const UnicodeString &key) {
UnicodeString result;
int keyIndex = 0;
int keyLength = key.Length();
for (int i = 1; i <= text.Length(); i++) {
char ch = text[i];
char keyChar = key[(keyIndex % keyLength) + 1];
if (isalpha(ch) && isalpha(keyChar)) {
char offset = (toupper(keyChar) - 'A');
result += ShiftChar(ch, offset, true);
keyIndex++;
} else {
result += ch;
}
}
return result;
}
void __fastcall TForm2::pw_encryptClick(TObject *Sender) {
UnicodeString key = pw_password->Text.UpperCase();
UnicodeString plaintext = pw_memo1->Text.UpperCase();
pw_memo2->Text = VigenereEncrypt(plaintext, key);
}
UnicodeString VigenereDecrypt(const UnicodeString &text, const UnicodeString &key) {
UnicodeString result;
int keyIndex = 0;
int keyLength = key.Length();
for (int i = 1; i <= text.Length(); i++) {
char ch = text[i];
char keyChar = key[(keyIndex % keyLength) + 1];
if (isalpha(ch) && isalpha(keyChar)) {
char offset = (toupper(keyChar) - 'A');
result += ShiftChar(ch, offset, false);
keyIndex++;
} else {
result += ch;
}
}
return result;
}
void __fastcall TForm2::pw_decryptClick(TObject *Sender) {
UnicodeString key = pw_password->Text.UpperCase();
UnicodeString ciphertext = pw_memo1->Text.UpperCase();
pw_memo2->Text = VigenereDecrypt(ciphertext, key);
}
RSA ist eine asymmetrische Verschlüsselungsmethode, die einen öffentlichen Schlüssel zum Verschlüsseln und einen privaten Schlüssel zum Entschlüsseln verwendet. Der Code zur Generierung der Primzahlen und zur eigentlichen Verschlüsselung und Entschlüsselung ist umfangreich und nicht vollständig in deinem Beispiel enthalten. Hier ist ein kurzer Überblick über die typischen Schritte in RSA:
// Wähle zwei große Primzahlen p und q.
// Berechne n = p * q.
// Berechne φ(n) = (p-1) * (q-1).
// Wähle eine Zahl e, die teilerfremd zu φ(n) ist.
// Berechne d als das multiplikative Inverse von e modulo φ(n).
// ciphertext = plaintext^e mod n
// plaintext = ciphertext^d mod n
Der RSA-Code in deinem Beispiel zeigt die Generierung der Primzahlen und die Einbindung in die Benutzeroberfläche.
// Hilfsfunktion zur Primzahlgenerierung
bool IsPrime(int num) {
if (num <= 1) return false;
if (num == 2) return true;
if (num % 2 == 0) return false;
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) return false;
}
return true;
}
std::vector GeneratePrimes(int a, int b) {
std::vector primes;
int num = 2;
while (primes.size() < a + b) {
if (IsPrime(num)) {
primes.push_back(num);
}
num++;
}
return primes;
}