密码学习题–仿射变换cpp代码实现
#include <iostream>
using namespace std;
int mod(int num, int m)
{
while(num<0) num+=m;
int tmp=num/m;
return num-tmp*m;
} //求模
int get_reverse(int num, int m)
{
for(int i=1; i<=m; i++)
{
if(mod(num*i, m)==1) return i;
}
return -1;
} //求逆
void get_int_Arr(char word[], int num[])
{
for(int i=0; word[i]!=0; i++)
{
num[i]=mod(word[i]-'A'+1, 26);
}
}
int get_TotalNumber(char word[])
{
int cnt=0;
for(int i=0; word[i]!=0; i++) cnt++;
return cnt;
}
void Code(char word[], int a, int b)
{
int* num=new int[get_TotalNumber(word)];
for(int i=0; i<=get_TotalNumber(word)-1; i++)
{
num[i]=word[i]-'a';
int c=mod(a*num[i]+b, 26);
char tmp=c+'a';
cout<<tmp<<' ';
}
delete[] num;
} //编码
void Decode(char word[], int a, int b)
{
int* num=new int[get_TotalNumber(word)];
int r=get_reverse(a, 26);
for(int i=0; i<=get_TotalNumber(word)-1; i++)
{
num[i]=word[i]-'a';
int m=mod(r*(num[i]-b), 26);
char tmp=m+'a';
cout<<tmp<<' ';
}
delete[] num;
} //解码
void main()
{
char word4[]="thenationalsecurityagency";
Code(word4, 11, 23); //ywpkxyhvkxonptjchybxlpktb
cout<<endl;
char word5[]="edsgickxhuklzveqzvkxwkzukvcuh";
Decode(word5, 9, 10);
}