2.凯撒密码加密解密(C)

明文空间M、密文空间C都是和密钥空间K满足,M=C=K={0,1,2,…,25}=Z_26 ,即把26个英文字母与整数0,1,2,…,25一一对应。
加密变换,E={E:Z26→Z26, Ek (m) = m + k (mod26)| m∈M, k∈K }
解密变换,D={D:Z26→Z26, Dk © = c-k (mod26)| c∈C, k∈K }
解密后再把Z26中的元素转换英文字母。

密文 = 明文 + key(mod26) 【把明文字母依次向后移k位,其中k小于26】

当密钥k=3时,就是历史上著名的凯撒密码(Caesar)

C语言代码如下:

#include <stdio.h>
#include <stdlib.h>
int main (){
    char small_letter[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    char big_letter[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    char text[1000],result[1000];
    int c,count=0,k,p;
    int c1,p1;
    char function;
    printf("Insert Message:");
    c=getchar();
    c1=c;
    while(1) //读取字符串
        {
            if(c == '\n') break;
                text[count]=c;
            printf("%c",text[count]);
            count++;
            c=getchar();
        }

    printf("\n");
    printf("Please select E encryption or D decryption:");
    scanf("%c",&function);
    if (function == 'E'){

        printf("Insert Key :" );
        scanf("%d",&k);
            for(int i=0;i<count;i++){
            if(text[i]>='A'&&text[i]<='Z')
            {
                result[i]=big_letter[((text[i]-'A')+k)%26];
            }
            //找出加密后字符在字符数组里的对应位置
            else if (text[i]>='a'&&text[i]<='z')
            {
                result[i]=small_letter[((text[i]-'a')+k)%26];
            }
            else result[i]=text[i];
            printf("%c",result[i]);
        }
    }

    else if(function == 'D') {
        printf("Insert Key :" );
        scanf("%d",&k);
            for(int i=0;i<count;i++){
            if(text[i]>='A'&&text[i]<='Z')
            {
                p=((text[i]-'A')-k);
                while(p<0)p+=26;
                result[i]=big_letter[p];
            }
            //找出解密后字符在字符数组里的对应位置,注意不要让它超出范围(下表位置为负数)
            else if (text[i]>='a'&&text[i]<='z')
            {
                p=((text[i]-'a')-k);
                while(p<0)p+=26;
                result[i]=small_letter[p];
            }
            else result[i]=text[i];
            printf("%c",result[i]);
        }
        printf("\n");
    }

    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值