信息安全
1、仿射密码
#include <stdio.h>
#include <string.h>
char p[100];
int gcd(int x,int y)
{
int t;
while(y)
{
t=x%y;
x=y;
y=t;
}
return x;
}
void code(char m1[],int k1,int k2,int n){
int i;
for(i=0;i<n;i++){
if(m1[i]>='A'&&m1[i]<='Z'){
p[i]=(k1*(m1[i]-'A')+k2)%26+'A';
}
else if(m1[i]>='a'&&m1[i]<='z'){
p[i]=(k1*(m1[i]-'a')+k2)%26+'a';
}
else{
p[i]=m1[i];
}
}
p[i]='\0';
printf("加密后的密文是:\n%s\n",p);
}
void decode(char c[],int k1,int k2,int n){
int i;
int j=1;
int s;
s=(j*k1)%26;
while(s!=1){
j++;
s=(j*k1)%26;
}
for(i=0;i<n;i++){
if(c[i]>='A'&&c[i]<='Z'){
p[i]=(j*(c[i]-'A'-k2+26))%26+'A';
}
else if(c[i]>='a'&&c[i]<='z'){
p[i]=(j*(c[i]-'a'-k2+26))%26+'a';
}
else{
p[i]=c[i];
}
}
p[i]='\0';
printf("解密后的明文是:\n%s\n",p);
}
int main(){
int k1,k2,n;
printf("请输入明文:\n");
gets(p);
printf("请输入密钥k1(与26互素):\n");
scanf("%d",&k1);
while(gcd(k1,26)!=1){
printf("密钥输入非法,请输入密钥k1(与26互素):\n");
scanf("%d",&k1);
}
printf("请输入密钥k2:\n");
scanf("%d",&k2);
n=strlen(p);
code(p,k1,k2,n);
decode(p,k1,k2,n);
return 0;
}
2、移位密码
#include <stdio.h>
#include <string.h>
char p[100];
void code(char *m1,int k,int n){
int i;
if(k>26){
k=k%26;
}
for(i=0;i<n;i++){
if(m1[i]>='A'&&m1[i]<='Z'){
p[i]=(m1[i]-'A'+k+26)%26+'A';
}
else if(m1[i]>='a'&&m1[i]<='z'){
p[i]=(m1[i]-'a'+k+26)%26+'a';
}
else{
p[i]=m1[i];
}
}
p[i]='\0';
printf("加密后的密文是:\n%s\n",p);
}
void decode(char *c,int k,int n){
int i;
if(k>26){
k=k%26;
}
for(i=0;i<n;i++){
if(c[i]>='A'&&c[i]<='Z'){
p[i]=((c[i]-'A')-k+26)%26+'A';
}
else if(c[i]>='a'&&c[i]<='z'){
p[i]=((c[i]-'a')-k+26)%26+'a';
}
else{
p[i]=c[i];
}
}
p[i]='\0';
printf("解密后的明文是:\n%s\n",p);
}
int main() {
int k,n;
printf("请输入明文:\n");
gets(p);
printf("请输入密钥:\n");
scanf("%d",&k);
n=strlen(p);
code(p,k,n);
decode(p,k,n);
return 0;
}