01/10/2018, 10:35
Hỏi đáp về mật mã Caesar
Xin chào các bạn. Mình đang làm tool để mã hóa và giải mã Caesar. Tuy đã hoàn thành nhưng vẫn còn gặp một vấn đề nhỏ là code mình auto chuyển bất kỳ số tự nhiên nào thành ký tự A trong bản mã ASCII dù mình đã giới hạn chỉ mã hóa các ký tự từ 65 -> 90 (A -> Z). Mong các bạn chỉ đáp giúp ạ. Đây là code của mình.
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int position(char a);
char encrypt(int x, int n);
char decrypt(int x,int n);
int main()
{
cout<<"Plaintext in upper: ";
string plain;
getline(cin,plain);
cout<<"Shift: ";
int n;
cin >> n;
for(int i=0;i<plain.length();i++)
{
if((int)plain.at(i)==32)
{
cout<<" ";
continue;
}
else if(64<(int)plain.at(i)<91)
{
cout<<encrypt(position(plain.at(i)),n);
}
else cout<<plain[i];
}
cout<<endl;
cout<<"Ciphertext in upper: ";
fflush(stdin);
string cipher;
getline(cin,cipher);
cout<<"Shift: ";
int n2;
cin >> n2;
for(int i=0;i<cipher.length();i++)
{
if((int)cipher.at(i)==32)
{
cout<<" ";
continue;
}
else if(64<(int)cipher.at(i)<91)
{
cout<<decrypt(position(cipher.at(i)),n2);
}
else cout<<cipher[i];
}
system("pause>nul");
return 0;
}
int position(char a)
{
char alphabet[25];
int S;
int x=0;
for(int i=65;i<91;i++)
{
alphabet[x]= (char)i;
x=x+1;
}
for(int i=0;i<26;i++)
{
if(alphabet[i]== a)
{
S=i;
break;
}
}
return S;
}
char encrypt(int x, int n)
{
int E;
E = (x+n)%26;
return (char) E+65;
}
char decrypt(int x,int n)
{
int D;
D = (x+26*1000-n)%26;
return (char) D+65;
}
Bài liên quan
Dòng này không ổn này
64<(int)plain.at(i)<91
phải là64<(int)plain.at(i) && (int)plain.at(i)<91
Cảm ơn bạn nhé