fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <cassert>
  4. using namespace std;
  5.  
  6. string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  7. int toOrdinal(const char& c) {
  8. auto ord = alphabet.find(c);
  9. assert(ord != string::npos);
  10. return ord;
  11. }
  12. char fromOrdinal(int n) {
  13. assert(n < alphabet.length() );
  14. return alphabet[n];
  15. }
  16.  
  17. string cryptVigenere(const string& input, const string& key, bool encrypt = true) {
  18. string res;
  19. for(size_t i = 0; i < input.size(); ++i) {
  20. auto ordInput = toOrdinal( input[i] );
  21. auto ordKey = toOrdinal( key[i % key.size()] ) ;
  22. auto result = ordInput + ordKey * (encrypt ? 1 : -1);
  23. res += fromOrdinal( (result + alphabet.size()) % alphabet.size() );
  24. }
  25. return res;
  26. }
  27.  
  28. int main() {
  29. auto encryptedText = cryptVigenere("THECAKEISALIE", "GLADOS");
  30. cout << encryptedText << "\n";
  31. cout << cryptVigenere(encryptedText, "GLADOS", false) << "\n";
  32. }
Success #stdin #stdout 0s 3020KB
stdin
Standard input is empty
stdout
ZSEFOCKTSDZAK
THECAKEISALIE