As people who are new to hackathons, we decided to take on the hardest project. It started off going really well. We thought we turned Enigma into a machine. However, we were unable to decode any messages, because we failed to realize the fact that the rotors do not turn the next rotor when it goes from Z to A. If we had known about that before 3 hours before the project was due, perhaps we would have had a working decryptor. However, we did create a machine that would have baffled the Bombe because it is not like other enigma machines. Considering the fact that we have only started learning C++ a few months ago, and that we are new to the world of hackathoning, I think we did well. I definitely had fun staying up for a whole 30 hours and I cannot wait to go to another hackathon!
Oh, and here is our code...
(we had a decryption code too but it didn't work quite right)
include
using namespace std;
int validnumber(int); int letter2num(char); char num2letter(int); char rotorI(int); char rotorII(int); char rotorIII(int); char rotorIV(int); char rotorV(int); char rotorVI(int); char rotorVII(int); char rotorVIII(int); char Rrotors(int,char); char RrotorI(char); char RrotorII(char); char RrotorIII(char); char RrotorIV(char); char RrotorV(char); char RrotorVI(char); char RrotorVII(char); char RrotorVIII(char); char reflectorB(int); char reflectorA(int); char reflectorC(int); int rotorNum(int, int); char BigR(char, int, int, int, int,int,int); char plug(char,char[2][10]); //char[] cToABC(int);
int main() { int rotor1, rotor2, rotor3, refNum; char start1, start2, start3, num1, num2, num3, refLetter; char plugs[2][10]; string message;
cout << "Enigma M3 Machine Application:\r\nEnter Reflector:";
cin >> refLetter;
if(toupper(refLetter) == 'B')
refNum = 11;
else if(toupper(refLetter) == 'A')
refNum = 10;
else if(toupper(refLetter) == 'C')
refNum = 12;
cout << "Enter Rotor 1: ";
cin >> rotor3;
cout << "Enter Rotor 2: ";
cin >> rotor2;
cout << "Enter Rotor 3: ";
cin >> rotor1;
cout << "Enter Ringstellung Value 1: ";
cin >> start1;
cout << "Enter Ringstellung Value 2: ";
cin >> start2;
cout << "Enter Ringstellung Value 3: ";
cin >> start3;
cout << "Enter Grundstellung Value 1: ";
cin >> num1;
cout << "Enter Grundstellung Value 2: ";
cin >> num2;
cout << "Enter Grundstellung Value 3: ";
cin >> num3;
// for(int i = 0;i < 10;i++) // { // for(int j = 0;j < 2;j++) // { // cout << "Enter Plug " << i + 1 << " Letter " << j + 1 << ": "; // cin >> plugs[j][i]; // plugs[j][i]=toupper(plugs[j][i]); // for(int k = 0;k <= i;k++) // { // for(int p = 0;p <= j;p++) // { // if(plugs[j][i]!=plugs[p][k] || (i== k && j==p)) // continue; // else{ // cout << "That plug is already chosen. Try again!" << endl; // j--; // } // } // } // } // } cout << "Enter code you wish to encrypt:" << endl; getline(cin, message); getline(cin, message); int r, g;
r = letter2num(num1) + (letter2num(num2) * 26 - 26) + (letter2num(num3) * 676 - 676);
g = (letter2num(start1)-1) + (letter2num(start2)* 26 - 26) + (letter2num(start3)* 676 - 676);
cout << "Encrypted Code: ";
string encrypted = "";
aa for(int c = 0; c < message.size();c++) { encrypted += /plug/(BigR(/plug/(toupper(message.at(c))/,plugs/),r+c,g,rotor1,rotor2,rotor3,refNum)/,plugs/); } cout << encrypted << endl;
return 0; }
/* char[] cToABC(int c) { char a[3]; a[0] = num2letter(c/676); c= c%676; a[1] = num2letter(c/26); c= c%26; a[2]=num2letter(c);
return a;
} */
char plug(char input, char array[2][10]) { char buddy; for(int i = 0;i < 10;i++) { if(array[0][i] == input){ buddy = array[1][i]; return buddy;} else if(array[1][i] == input){ buddy = array[0][i]; return buddy;} else buddy = input; } return buddy; }
char BigR(char inLetter, int iteration,int interation2, int a, int b, int c, int refNum) { int rotor1 = a; int rotor2 = b; int rotor3 = c; int tmp;
tmp=(rotorNum(rotor1,validnumber(letter2num(inLetter)+iteration-interation2))-iteration+interation2);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=(rotorNum(rotor2,validnumber(tmp+(iteration/26)-interation2/26))-(iteration/26)+interation2/26);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=(rotorNum(rotor3,validnumber(tmp+(iteration/676)-interation2/676))-(iteration/676)+interation2/676);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=rotorNum(refNum,tmp);
//cout << num2letter(validnumber(tmp)) << "reflector" << endl;
tmp=letter2num(Rrotors(rotor3,num2letter(validnumber(tmp+(iteration/676)-interation2/676)))-iteration/676+interation2/676);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=letter2num(Rrotors(rotor2,num2letter(validnumber(tmp+(iteration/26)-interation2/26)))-iteration/26+interation2/26);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=letter2num(Rrotors(rotor1,num2letter(validnumber(tmp+(iteration)-interation2)))-iteration+interation2);
//cout << num2letter(validnumber(tmp)) << endl;
tmp=num2letter(validnumber(tmp));
return tmp;
}
int letter2num(char a) { int num = (int)toupper(a) - 64; return num; }
char num2letter(int a) { int b = a + 64; char letter = (char)b; return b; }
int validnumber(int a) { while(a > 26 || a < 1) { if(a > 26) a = a - 26; else a = a + 26; } return a; }
int rotorNum(int rotorNum, int valueInserted) { switch(rotorNum){ case 1: return letter2num(rotorI(valueInserted)); break; case 2: return letter2num(rotorII(valueInserted)); break; case 3: return letter2num(rotorIII(valueInserted)); break; case 4: return letter2num(rotorIV(valueInserted)); break; case 5: return letter2num(rotorV(valueInserted)); break; case 6: return letter2num(rotorVI(valueInserted)); break; case 7: return letter2num(rotorVII(valueInserted)); break; case 8: return letter2num(rotorVIII(valueInserted)); break; case 10: return letter2num(reflectorA(valueInserted)); break; case 11: return letter2num(reflectorB(valueInserted)); break;
case 12:
return letter2num(reflectorC(valueInserted));
break;
}}
char Rrotors(int rnum, char in) {
string ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
switch(rnum)
{
case 1:
return RrotorI(in);
break;
case 2:
return RrotorII(in);
break;
case 3:
return RrotorIII(in);
break;
case 4:
return RrotorIV(in);
break;
case 5:
return RrotorV(in);
break;
case 6:
return RrotorVI(in);
break;
case 7:
return RrotorVII(in);
break;
case 8:
return RrotorVIII(in);
break;
}
}
char RrotorVII(char a) { switch(a) { case 'N': return 'A'; break; case 'Z': return 'B'; break; case 'J': return 'C'; break; case 'H': return 'D'; break; case 'G': return 'E'; break; case 'R': return 'F'; break; case 'C': return 'G'; break; case 'X': return 'H'; break; case 'M': return 'I'; break; case 'Y': return 'J'; break; case 'S': return 'K'; break; case 'W': return 'L'; break; case 'B': return 'M'; break; case 'O': return 'N'; break; case 'U': return 'O'; break; case 'F': return 'P'; break; case 'A': return 'Q'; break; case 'I': return 'R'; break; case 'V': return 'S'; break; case 'L': return 'T'; break; case 'P': return 'U'; break; case 'E': return 'V'; break; case 'K': return 'W'; break; case 'Q': return 'X'; break; case 'D': return 'Y'; break; case 'T': return 'Z'; break; }
}
char RrotorVI(char a) { switch(a) { case 'J': return 'A'; break; case 'P': return 'B'; break; case 'G': return 'C'; break; case 'V': return 'D'; break; case 'O': return 'E'; break; case 'U': return 'F'; break; case 'M': return 'G'; break; case 'F': return 'H'; break; case 'Y': return 'I'; break; case 'Q': return 'J'; break; case 'B': return 'K'; break; case 'E': return 'L'; break; case 'N': return 'M'; break; case 'H': return 'N'; break; case 'Z': return 'O'; break; case 'R': return 'P'; break; case 'D': return 'Q'; break; case 'K': return 'R'; break; case 'A': return 'S'; break; case 'S': return 'T'; break; case 'X': return 'U'; break; case 'L': return 'V'; break; case 'I': return 'W'; break; case 'C': return 'X'; break; case 'T': return 'Y'; break; case 'W': return 'Z'; break; }
}
char RrotorVIII(char a) { switch(a) { case 'F': return 'A'; break; case 'K': return 'B'; break; case 'Q': return 'C'; break; case 'H': return 'D'; break; case 'T': return 'E'; break; case 'L': return 'F'; break; case 'X': return 'G'; break; case 'O': return 'H'; break; case 'C': return 'I'; break; case 'B': return 'J'; break; case 'J': return 'K'; break; case 'S': return 'L'; break; case 'P': return 'M'; break; case 'D': return 'N'; break; case 'Z': return 'O'; break; case 'R': return 'P'; break; case 'A': return 'Q'; break; case 'M': return 'R'; break; case 'E': return 'S'; break; case 'W': return 'T'; break; case 'N': return 'U'; break; case 'I': return 'V'; break; case 'U': return 'W'; break; case 'Y': return 'X'; break; case 'G': return 'Y'; break; case 'V': return 'Z'; break; }
}
char RrotorIV(char a) { switch(a) { case 'E': return 'A'; break; case 'S': return 'B'; break; case 'O': return 'C'; break; case 'V': return 'D'; break; case 'P': return 'E'; break; case 'Z': return 'F'; break; case 'J': return 'G'; break; case 'A': return 'H'; break; case 'Y': return 'I'; break; case 'Q': return 'J'; break; case 'U': return 'K'; break; case 'I': return 'L'; break; case 'R': return 'M'; break; case 'H': return 'N'; break; case 'X': return 'O'; break; case 'L': return 'P'; break; case 'N': return 'Q'; break; case 'F': return 'R'; break; case 'T': return 'S'; break; case 'G': return 'T'; break; case 'K': return 'U'; break; case 'D': return 'V'; break; case 'C': return 'W'; break; case 'M': return 'X'; break; case 'W': return 'Y'; break; case 'B': return 'Z'; break; }
}
char RrotorV(char a) { switch(a) { case 'V': return 'A'; break; case 'Z': return 'B'; break; case 'B': return 'C'; break; case 'R': return 'D'; break; case 'G': return 'E'; break; case 'I': return 'F'; break; case 'T': return 'G'; break; case 'Y': return 'H'; break; case 'U': return 'I'; break; case 'P': return 'J'; break; case 'S': return 'K'; break; case 'D': return 'L'; break; case 'N': return 'M'; break; case 'H': return 'N'; break; case 'L': return 'O'; break; case 'X': return 'P'; break; case 'A': return 'Q'; break; case 'W': return 'R'; break; case 'M': return 'S'; break; case 'J': return 'T'; break; case 'Q': return 'U'; break; case 'O': return 'V'; break; case 'F': return 'W'; break; case 'E': return 'X'; break; case 'C': return 'Y'; break; case 'K': return 'Z'; break; }
}
char RrotorIII(char a) { switch(a) { case 'B': return 'A'; break; case 'D': return 'B'; break; case 'F': return 'C'; break; case 'H': return 'D'; break; case 'J': return 'E'; break; case 'L': return 'F'; break; case 'C': return 'G'; break; case 'P': return 'H'; break; case 'R': return 'I'; break; case 'T': return 'J'; break; case 'X': return 'K'; break; case 'V': return 'L'; break; case 'Z': return 'M'; break; case 'N': return 'N'; break; case 'Y': return 'O'; break; case 'E': return 'P'; break; case 'I': return 'Q'; break; case 'W': return 'R'; break; case 'G': return 'S'; break; case 'A': return 'T'; break; case 'K': return 'U'; break; case 'M': return 'V'; break; case 'U': return 'W'; break; case 'S': return 'X'; break; case 'Q': return 'Y'; break; case 'O': return 'Z'; break; }
}
char RrotorI(char a) { switch(a) { case 'E': return 'A'; break; case 'K': return 'B'; break; case 'M': return 'C'; break; case 'F': return 'D'; break; case 'L': return 'E'; break; case 'G': return 'F'; break; case 'D': return 'G'; break; case 'Q': return 'H'; break; case 'V': return 'I'; break; case 'Z': return 'J'; break; case 'N': return 'K'; break; case 'T': return 'L'; break; case 'O': return 'M'; break; case 'W': return 'N'; break; case 'Y': return 'O'; break; case 'H': return 'P'; break; case 'X': return 'Q'; break; case 'U': return 'R'; break; case 'S': return 'S'; break; case 'P': return 'T'; break; case 'A': return 'U'; break; case 'I': return 'V'; break; case 'B': return 'W'; break; case 'R': return 'X'; break; case 'C': return 'Y'; break; case 'J': return 'Z'; break; }
}
char RrotorII(char a) { switch(a) { case 'A': return 'A'; break; case 'J': return 'B'; break; case 'D': return 'C'; break; case 'K': return 'D'; break; case 'S': return 'E'; break; case 'I': return 'F'; break; case 'R': return 'G'; break; case 'U': return 'H'; break; case 'X': return 'I'; break; case 'B': return 'J'; break; case 'L': return 'K'; break; case 'H': return 'L'; break; case 'W': return 'M'; break; case 'T': return 'N'; break; case 'M': return 'O'; break; case 'C': return 'P'; break; case 'Q': return 'Q'; break; case 'G': return 'R'; break; case 'Z': return 'S'; break; case 'N': return 'T'; break; case 'P': return 'U'; break; case 'Y': return 'V'; break; case 'F': return 'W'; break; case 'V': return 'X'; break; case 'O': return 'Y'; break; case 'E': return 'Z'; break; }
}
char rotorII(int a) { switch(a) { case 1: return 'A'; break; case 2: return 'J'; break; case 3: return 'D'; break; case 4: return 'K'; break; case 5: return 'S'; break; case 6: return 'I'; break; case 7: return 'R'; break; case 8: return 'U'; break; case 9: return 'X'; break; case 10: return 'B'; break; case 11: return 'L'; break; case 12: return 'H'; break; case 13: return 'W'; break; case 14: return 'T'; break; case 15: return 'M'; break; case 16: return 'C'; break; case 17: return 'Q'; break; case 18: return 'G'; break; case 19: return 'Z'; break; case 20: return 'N'; break; case 21: return 'P'; break; case 22: return 'Y'; break; case 23: return 'F'; break; case 24: return 'V'; break; case 25: return 'O'; break; case 26: return 'E'; break; }
}
char rotorIII(int a) { switch(a) { case 1: return 'B'; break; case 2: return 'D'; break; case 3: return 'F'; break; case 4: return 'H'; break; case 5: return 'J'; break; case 6: return 'L'; break; case 7: return 'C'; break; case 8: return 'P'; break; case 9: return 'R'; break; case 10: return 'T'; break; case 11: return 'X'; break; case 12: return 'V'; break; case 13: return 'Z'; break; case 14: return 'N'; break; case 15: return 'Y'; break; case 16: return 'E'; break; case 17: return 'I'; break; case 18: return 'W'; break; case 19: return 'G'; break; case 20: return 'A'; break; case 21: return 'K'; break; case 22: return 'M'; break; case 23: return 'U'; break; case 24: return 'S'; break; case 25: return 'Q'; break; case 26: return 'O'; break; } }
char rotorV(int a) { switch(a) { case 1: return 'V'; break; case 2: return 'Z'; break; case 3: return 'B'; break; case 4: return 'R'; break; case 5: return 'G'; break; case 6: return 'I'; break; case 7: return 'T'; break; case 8: return 'Y'; break; case 9: return 'U'; break; case 10: return 'P'; break; case 11: return 'S'; break; case 12: return 'D'; break; case 13: return 'N'; break; case 14: return 'H'; break; case 15: return 'L'; break; case 16: return 'X'; break; case 17: return 'A'; break; case 18: return 'W'; break; case 19: return 'M'; break; case 20: return 'J'; break; case 21: return 'Q'; break; case 22: return 'O'; break; case 23: return 'F'; break; case 24: return 'E'; break; case 25: return 'C'; break; case 26: return 'K'; break; } }
char rotorIV(int num) { switch(num) { case 1: return 'E'; break; case 2: return 'S'; break; case 3: return 'O'; break; case 4: return 'V'; break; case 5: return 'P'; break; case 6: return 'Z'; break; case 7: return 'J'; break; case 8: return 'A'; break; case 9: return 'Y'; break; case 10: return 'Q'; break; case 11: return 'U'; break; case 12: return 'I'; break; case 13: return 'R'; break; case 14: return 'H'; break; case 15: return 'X'; break; case 16: return 'L'; break; case 17: return 'N'; break; case 18: return 'F'; break; case 19: return 'T'; break; case 20: return 'G'; break; case 21: return 'K'; break; case 22: return 'D'; break; case 23: return 'C'; break; case 24: return 'M'; break; case 25: return 'W'; break; case 26: return 'B'; break;
}
return '0';
}
char rotorI(int num) { switch(num) { case 1: return 'E'; break; case 2: return 'K'; break; case 3: return 'M'; break; case 4: return 'F'; break; case 5: return 'L'; break; case 6: return 'G'; break; case 7: return 'D'; break; case 8: return 'Q'; break; case 9: return 'V'; break; case 10: return 'Z'; break;
case 11:
return 'N';
break;
case 12:
return 'T';
break;
case 13:
return 'O';
break;
case 14:
return 'W';
break;
case 15:
return 'Y';
break;
case 16:
return 'H';
break;
case 17:
return 'X';
break;
case 18:
return 'U';
break;
case 19:
return 'S';
break;
case 20:
return 'P';
break;
case 21:
return 'A';
break;
case 22:
return 'I';
break;
case 23:
return 'B';
break;
case 24:
return 'R';
break;
case 25:
return 'C';
break;
case 26:
return 'J';
break;
}
return '0';
}
char reflectorB(int num) { switch(num) { case 1: return 'Y'; break; case 2: return 'R'; break; case 3: return 'U'; break; case 4: return 'H'; break; case 5: return 'Q'; break; case 6: return 'S'; break; case 7: return 'L'; break; case 8: return 'D'; break; case 9: return 'P'; break; case 10: return 'X'; break; case 11: return 'N'; break; case 12: return 'G'; break; case 13: return 'O'; break; case 14: return 'K'; break; case 15: return 'M'; break; case 16: return 'I'; break; case 17: return 'E'; break; case 18: return 'B'; break; case 19: return 'F'; break; case 20: return 'Z'; break; case 21: return 'C'; break; case 22: return 'W'; break; case 23: return 'V'; break; case 24: return 'J'; break; case 25: return 'A'; break; case 26: return 'T'; break;
}
return '0';
}
char reflectorA(int num) { switch(num) { case 1: return 'E'; break; case 2: return 'J'; break; case 3: return 'M'; break; case 4: return 'Z'; break; case 5: return 'A'; break; case 6: return 'L'; break; case 7: return 'Y'; break; case 8: return 'X'; break; case 9: return 'V'; break; case 10: return 'B'; break; case 11: return 'W'; break; case 12: return 'F'; break; case 13: return 'C'; break; case 14: return 'R'; break; case 15: return 'Q'; break; case 16: return 'U'; break; case 17: return 'O'; break; case 18: return 'N'; break; case 19: return 'T'; break; case 20: return 'S'; break; case 21: return 'P'; break; case 22: return 'I'; break; case 23: return 'K'; break; case 24: return 'H'; break; case 25: return 'G'; break; case 26: return 'D'; break;
}
return '0';
}
char reflectorC(int num) { switch(num) { case 1: return 'F'; break; case 2: return 'V'; break; case 3: return 'P'; break; case 4: return 'J'; break; case 5: return 'I'; break; case 6: return 'A'; break; case 7: return 'O'; break; case 8: return 'Y'; break; case 9: return 'E'; break; case 10: return 'D'; break; case 11: return 'R'; break; case 12: return 'Z'; break; case 13: return 'X'; break; case 14: return 'W'; break; case 15: return 'G'; break; case 16: return 'C'; break; case 17: return 'T'; break; case 18: return 'K'; break; case 19: return 'U'; break; case 20: return 'Q'; break; case 21: return 'S'; break; case 22: return 'B'; break; case 23: return 'N'; break; case 24: return 'M'; break; case 25: return 'H'; break; case 26: return 'L'; break;
}
return '0';
}
char rotorVI(int num) { switch(num) { case 1: return 'J'; break; case 2: return 'P'; break; case 3: return 'G'; break; case 4: return 'V'; break; case 5: return 'O'; break; case 6: return 'U'; break; case 7: return 'M'; break; case 8: return 'F'; break; case 9: return 'Y'; break; case 10: return 'Q'; break; case 11: return 'B'; break; case 12: return 'E'; break; case 13: return 'N'; break; case 14: return 'H'; break; case 15: return 'Z'; break; case 16: return 'R'; break; case 17: return 'D'; break; case 18: return 'K'; break; case 19: return 'A'; break; case 20: return 'S'; break; case 21: return 'X'; break; case 22: return 'L'; break; case 23: return 'I'; break; case 24: return 'C'; break; case 25: return 'T'; break; case 26: return 'W'; break;
}
return '0';
}
char rotorVII(int num) { switch(num) { case 1: return 'N'; break; case 2: return 'Z'; break; case 3: return 'J'; break; case 4: return 'H'; break; case 5: return 'G'; break; case 6: return 'R'; break; case 7: return 'C'; break; case 8: return 'X'; break; case 9: return 'M'; break; case 10: return 'Y'; break; case 11: return 'S'; break; case 12: return 'W'; break; case 13: return 'B'; break; case 14: return 'O'; break; case 15: return 'U'; break; case 16: return 'F'; break; case 17: return 'A'; break; case 18: return 'I'; break; case 19: return 'V'; break; case 20: return 'L'; break; case 21: return 'P'; break; case 22: return 'E'; break; case 23: return 'K'; break; case 24: return 'Q'; break; case 25: return 'D'; break; case 26: return 'T'; break;
}
return '0';
}
char rotorVIII(int num) { switch(num) { case 1: return 'F'; break; case 2: return 'K'; break; case 3: return 'Q'; break; case 4: return 'H'; break; case 5: return 'T'; break; case 6: return 'L'; break; case 7: return 'X'; break; case 8: return 'O'; break; case 9: return 'C'; break; case 10: return 'B'; break;
case 11:
return 'J';
break;
case 12:
return 'S';
break;
case 13:
return 'P';
break;
case 14:
return 'D';
break;
case 15:
return 'Z';
break;
case 16:
return 'R';
break;
case 17:
return 'A';
break;
case 18:
return 'M';
break;
case 19:
return 'E';
break;
case 20:
return 'W';
break;
case 21:
return 'N';
break;
case 22:
return 'I';
break;
case 23:
return 'U';
break;
case 24:
return 'Y';
break;
case 25:
return 'G';
break;
case 26:
return 'V';
break;
}
return '0';
}
Built With
- blood-sweat-and-tears
- c++
- hard-work
- more-tears
- zero-sleep
Log in or sign up for Devpost to join the conversation.