栅栏的原理也很简单
大概步骤:
1.将明文去空格处理
2.将得到的串每key个字符分割成key列矩阵
3.按列递增开始读取得到的串
4.插入空格
举例说明:
假设key为3,明文为:
ab cd ef
1.去空格
abcdef
2.分割
1 | 2 | 3 | |
1 | a | b | c |
2 | d | e | f |
3.按列读取
adbecf
4.插入空格
ad be cf
下面是代码 每一列不足的部分本来应该插入其他字符 只是加密的话没有必要 就不写了 如有需要 下一篇置换加密里面有写
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string FenceEncrypt(string s, int key){
vector<int> a;
string primal,result;
for (int i = 0; i < s.size(); i++){//将原来字符串中的空格位置记录下来 新的串中无空格
if(s[i] == ' ')a.push_back(i);
else primal.push_back(s[i]);
}
for (int i = 0; i < key; i++)
for (int j = i; j < primal.size(); j += key)
result.push_back(primal[j]);
if(a.size())
for (int i = 0, t = 0; i < s.size(); i++){//将记录下来的空格位置插入
if(a[t] == i){
result.insert(result.begin() + i,' ');
t++;
}
}
return result;
}
int main(){
string s;
int key;
cin>>key;
cin.get();
getline(cin,s);
cout<<FenceEncrypt(s,key);
return 0;
}