#include<stdio.h>
#include<string.h>


//仿射加密 传入明文和输出的结果 和 倍数 k1及相加的k2 
void fangshe_jiami(char *text,char *result,int k1,int k2){
    int i,z=0;
    int l = strlen(text); //获取明文的长度
    for(i=0;i<l;i++)
    {
        //判断大小写,也可用ASCII来判断 
        if (text[i] >= 'A' && text[i] <= 'Z'){
            result[z]=(k1*(text[i]-'A')+k2)%26+'A';    //进行取模运算 ,去让明文*k1再加上k2 整体取模 
        } else if (text[i] >= 'a' && text[i] <= 'z'){
            result[z]=(k1*(text[i]-'a')+k2)%26+'a';    //进行取模运算
        }
        z++;
    }
}
//仿射解密 此时的text为密文 
void fangshe_jiemi(char *text,char *result,int k3,int k2){
    int i,result_index=0;
    int length = strlen(text); //获取明文的长度 ,获取长度进行每一位的解密 
    for(i=0;i<length;i++)
    {
        //判断大小写
        if (text[i] >= 'A' && text[i] <= 'Z'){
                                
            result[result_index]=(k3*((text[i]-'A')-k2))%26+'A'; //让密文*k1的 
            if(k3*((text[i]-'A')-k2) < 0){
                result[result_index] = result[result_index] + 26;
            }
        } else if (text[i] >= 'a' && text[i] <= 'z'){
            result[result_index]=(k3*((text[i]-'a')-k2))%26+'a';
            if(k3*((text[i]-'a')-k2) < 0){  //处理负数
                result[result_index] = result[result_index] + 26;
            }
        }
        result_index++;
    }
}

//Vigenere加密 
void Vigenere_jiami(char *text,char *result,char *k){
    int l,i,j=0,z=0;
    for(l=0;text[l]!='\0';l++);
    for(i=0;i<l;i++)
    {
        result[z]=(text[i]-'a'+k[j]-'a')%26+'a';
        j++;
        z++;
    }
}

//Vigenere解密 
void Vigenere_jiemi(char *text,char *result,char *k){
    int l,i,j=0,z=0;
    for(l=0;text[l]!='\0';l++);
    for(i=0;i<l;i++)
    {
        result[z]=(text[i]-k[j]+26)%26+'a';
        j++;
        z++;
    }
}

int main(){
    
    char text[50]="";
    char result[50]="";
    char k[50]="";
    int k1,k2,k3;
    int type;
    printf("请填写明文或者密文\n");
    scanf("%[^\n]",text);
    printf("请选择加密方式,输入1 仿射加密,输入2 Vigenere加密\n");
    scanf("%d",&type);
    switch (type){
        case 1:
            printf("加密还是解密 1加密 2解密");
            scanf("%d",&type);
            switch(type){
                case 1:
                    /**加密**/
                    printf("请输入密钥k1\n");
                    scanf("%d",&k1);
                    printf("请输入密钥k2\n");
                    scanf("%d",&k2);
                    fangshe_jiami(text,result,k1,k2);
                    printf("明文%s的密文为:%s\n",text,result);
                    break;
                case 2:
                    /**解密**/
                    printf("请输入密钥k1的逆元\n");
                    scanf("%d",&k3);
                    printf("请输入密钥k2\n");
                    scanf("%d",&k2);
                    fangshe_jiemi(text,result,k3,k2);
                    printf("密文%s的明文为:%s\n",text,result);
                    break;
            } 
            break;
        case 2:
            printf("加密还是解密 1加密 2解密");
            scanf("%d",&type);
            printf("请输入密钥k\n");
            scanf("%s",k);
            switch(type){
                case 1:
                    /**加密**/
                    Vigenere_jiami(text,result,k);
                    printf("明文%s的密文为:%s\n",text,result);
                    
                    break;
                case 2:
                    /**解密**/
                    Vigenere_jiemi(text,result,k);
                    printf("密文%s的明文为:%s\n",text,result);
                    break;
            } 
            break;
    }
    return 0;
} 
最后修改:2023 年 04 月 04 日
如果觉得我的文章对你有用,请随意赞赏