看到比赛里的加密训练,突发奇想。

加密训练三

使用方法:

  1. 输入密码(初始密码为bcoi);
  2. 选择加密或解密,1为加密,2为解密
  3. 输入要加密或解密的内容
  4. CTRL+Z结束
#include <bits/stdc++.h>
#include <conio.h>
using namespace std;
map <char, char> atob = {{'q', 'p'},{'w', 'q'},{'e', 'w'},{'r', 'e'},{'t', 'r'},{'y', 't'},{'u', 'y'},{'i', 'u'},{'o', 'i'},{'p', 'o'},{'a', 'l'},{'s', 'a'},{'d', 's'},{'f', 'd'},{'g', 'f'},{'h', 'g'},{'j', 'h'},{'k', 'j'},{'l', 'k'},{'z', 'm'},{'x', 'z'},{'c', 'x'},{'v', 'c'},{'b', 'v'},{'n', 'b'},{'m', 'n'},{'1', '!'},{'2', '@'},{'3', '#'},{'4', '$'},{'5', '%'},{'6', '^'},{'7', '&'},{'8', '*'},{'9', '('},{'0', ')'}};
map <char, char> btoa = {{'p', 'q'}, {'q', 'w'}, {'w', 'e'}, {'e', 'r'}, {'r', 't'},{'t', 'y'}, {'y', 'u'}, {'u', 'i'}, {'i', 'o'}, {'o', 'p'},{'l', 'a'}, {'a', 's'}, {'s', 'd'}, {'d', 'f'}, {'f', 'g'},{'g', 'h'}, {'h', 'j'}, {'j', 'k'}, {'k', 'l'},{'m', 'z'}, {'z', 'x'}, {'x', 'c'}, {'c', 'v'}, {'v', 'b'},{'b', 'n'}, {'n', 'm'},{'!', '1'}, {'@', '2'}, {'#', '3'}, {'$', '4'}, {'%', '5'},{'^', '6'}, {'&', '7'}, {'*', '8'}, {'(', '9'}, {')', '0'}};
bool readpass();
char acheb(char c);
char bchea(char c);
int main()
{
	readpass();int cheio;
	cout << "\n1.加密 2.解密:";
	cin >> cheio;
	
   char c;
   while ((c = getchar()) != EOF)
       cout << (cheio == 1 ? acheb(c) : bchea(c));
	return 0;
}
bool readpass()
{
	cout << "输入密码: ";
   string cinpassword;
   char c;
   while((c = _getch()) != '\r')
	{
       cinpassword += c;
       cout << '.';
   }
   string relpassword = "";
   for (int i = 0; i < cinpassword.size(); i++)
   {
   	relpassword += acheb(cinpassword[i]);
	}
	
	if( relpassword != "vxiu")
	{
		for (int i = 1; i <= 1e10; i++)cout << "密码错误!\n";
		exit(0);
	}
}
char acheb(char c)
{
	if (isupper(c))return (char)toupper(atob[tolower(c)]);
   else if (atob.count(c))return atob[c];
   else return c;
}
char bchea(char c)
{
	if (isupper(c))return (char)toupper(btoa[tolower(c)]);
   else if (btoa.count(c))return btoa[c];
   else return c;
}