I try to implement the encryption by Columnar transposition.
Input: key_secret and Text_to_encrypt, both of them are in lower.
Output: encrypted_text.
The code works fine but I have some questions:
- it warns: "Function 'begin' could not be resolved", Function 'end' could not be resolved, Function 'copy_if' could not be resolved. How can I get rid of it?
- it creates
mapOriginAlphabet
slowly. How can I improve it?
I use gcc 5.3.0
Here the code: .h file
#ifndef TRANSPOSITIONCIPHER_H_
#define TRANSPOSITIONCIPHER_H_
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#define log(s) std::cout << s << std::endl
class transpositioncipher {
private:
std::map<char,bool> mapOriginAlphabet;
std::map<char,char> mapAlphabet;
std::vector<int> vecOrder;
std::string mKeySecret;
std::string removeDuplicates(const std::string strOrigin);
void createOrder();
void createSubstitution();
public:
transpositioncipher(std::string KeySecret);
virtual ~transpositioncipher();
std::string encrypt(const std::string strOrigin);
std::string decrypt(const std::string strOrigin);
void print();
};
#endif /* TRANSPOSITIONCIPHER_H_ */
.cpp file
#include "transpositioncipher.h"
transpositioncipher::transpositioncipher(std::string KeySecret) {
mKeySecret = removeDuplicates(KeySecret);
createOrder();
for (int i = 97; i < 123; ++i) {
char c = (char) i;
std::size_t found = mKeySecret.find(c);
if (found != std::string::npos) {
mapOriginAlphabet[c] = false;
} else {
mapOriginAlphabet[c] = true;
}
}
createSubstitution();
}
transpositioncipher::~transpositioncipher() {
}
std::string transpositioncipher::removeDuplicates(const std::string strOrigin) {
std::set<char> moved;
std::string result;
result.reserve(strOrigin.size());
//Only copy one character of each type to the new string
std::copy_if(std::begin(strOrigin), std::end(strOrigin),
std::back_inserter(result),
[&moved](const auto& value) {return moved.insert(value).second;});
return result;
}
void transpositioncipher::createOrder() {
std::set<char> chars { mKeySecret.begin(), mKeySecret.end() };
std::string strTemp = std::string(chars.begin(), chars.end());
for (auto& x : strTemp) {
std::size_t found = mKeySecret.find(x);
vecOrder.push_back(found);
}
}
void transpositioncipher::createSubstitution() {
int iCols = mKeySecret.length();
int iRows = 26 / iCols + 1;
std::vector<std::vector<char>> vecTemp;
std::vector<char> vecFirstRow;
for (auto& x : mKeySecret) {
vecFirstRow.push_back(x);
}
vecTemp.push_back(vecFirstRow);
int index = 97;
int iNumRow = 0;
while (iNumRow < iRows) {
std::vector<char> row;
int iNumCol = 0;
while (iNumCol < iCols) {
if (mapOriginAlphabet[(char) index]) {
row.push_back((char) index);
iNumCol++;
}
index++;
if (index > 123) {
break;
}
}
vecTemp.push_back(row);
iNumRow++;
}
index = 97;
for (auto& indexCol: vecOrder) {
for (auto& vec: vecTemp) {
if (indexCol >= vec.size())
continue;
else {
mapAlphabet[(char)index] = vec.at(indexCol);
index ++;
}
}
}
}
std::string transpositioncipher::encrypt(const std::string strOrigin) {
std::string ret;
for (auto& x: strOrigin) {
ret += mapAlphabet[x];
}
return ret;
}