探索凯撒密码:一个简单的字符移位加密方法

摘要:本文将介绍一种古老的加密技术——凯撒密码也叫恺撒密码,并通过一个C语言程序示例,展示如何实现这种加密方法。我们将分析代码的原理,并探讨其在现代加密技术中的地位。

目录

一、引言

二、代码详解

三、完整代码

四、总结


一、引言

在信息时代,数据安全显得尤为重要。加密技术作为保障信息安全的核心技术之一,自古以来就备受关注。凯撒密码作为一种古老的加密方法,虽然安全性不高,但其原理简单,易于理解,对于初学者来说是一个很好的学习案例。本文将介绍如何使用C语言实现一个简单的凯撒密码加密算法,这个算法只对字母有效,区分大小写!

二、代码详解

1.先写需要用到的头文件,再定义了一个宏,用于指定输入字符串的最大长度,可根据实际需求调整。

2.在主函数中声明变量,声明了一个指针变量指向输入的需要加密的英文句子。

3.提示用户输入移位数,并使用 scanf 函数读取。注意:fflush(stdin) 用于清空输入缓冲区,避免影响后续输入。

printf("输入移位数:");
scanf("%d",&k);
fflush(stdin);

4.使用 fgets 函数读取一行输入即需要加密的英文句子,它读取的内容包括空格。

printf("输入需加密的英文句子:");
fgets(str,MAX_LENGTH,stdin);

5.凯撒密码加密过程,通过一个 for 循环遍历字符串中的每个字符,根据字符是否为小写或大写字母进行相应的加密操作。对于需要加密的某一个字母来说,假设字母跟a或A的ASCII码差为x,再往后移了k位,考虑字母的个数只有26个,则需将ASCII码对26取模。再加上a或A(根据需要加密的母是大写还是小写)的ASCII密码设为d,得到的密文的ASCII码为(x+k)%26+d。

    // 凯撒密码加密过程
    for(int i=0;i<strlen(str);i++)
    {
        // 对小写字母进行加密
        if('a'<=*(sstr+i) && *(sstr+i)<='z')
        {
            *(sstr+i)=(*(sstr+i)-'a'+k)%26+'a';
        }

        // 对大写字母进行加密
        if('A'<=*(sstr+i) && *(sstr+i)<='Z')
        {
            *(sstr+i)=(*(sstr+i)-'A'+k)%26+'A';
        }
    }

6.输出加密后的结果,直接用printf函数输出字符串sstr。

三、完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 100 /*可根据需要自行调节*/

int main()
{
    // 变量声明
    int k;
    char str[MAX_LENGTH];
    char *sstr=str;

    // 输入移位数
    printf("输入移位数:");
    scanf("%d",&k);
    fflush(stdin); // 清空输入缓冲区

    // 输入需加密的英文句子
    printf("输入需加密的英文句子:");
    fgets(str,MAX_LENGTH,stdin);  // 获取英文句子,包括空格
    printf("%s\n",str);

    // 凯撒密码加密过程
    for(int i=0;i<strlen(str);i++)
    {
        // 对小写字母进行加密
        if('a'<=*(sstr+i) && *(sstr+i)<='z')
        {
            *(sstr+i)=(*(sstr+i)-'a'+k)%26+'a';
        }

        // 对大写字母进行加密
        if('A'<=*(sstr+i) && *(sstr+i)<='Z')
        {
            *(sstr+i)=(*(sstr+i)-'A'+k)%26+'A';
        }
    }

    // 输出加密后的结果
    printf("%s", sstr);
    return 0;
}

四、总结

本文介绍了如何使用C语言实现凯撒密码加密算法。通过简单的字符替换,我们可以轻松实现对文本的加密。需要注意的是,凯撒密码并不是一种安全的加密方法,但它对于理解加密原理和编程实践具有一定的意义。

c语言编写,欢迎扔板砖 //移位算法 #include #include #define SIZE 50 int main() { //i 用于计数输入个数,j 为临时变量, plain 存放明文, cipher 存放密文,decryption存放解密后文本,fpp 为明文文件指针,fpc 为密文文件指针 int i,j; char plain[SIZE],cipher[SIZE],decryption[SIZE],ciphertext[SIZE]; FILE * fpp,* fpc,* fpd; //加密 //建立新的明文TXT文件 printf("Caesar algorithm\n"); if((fpp=fopen("plain.txt","w+"))==NULL) { printf("creat new plain file error!\n"); exit(0); } //输入明文 printf("input plain alphabet:\n"); i=0; scanf("%c",&plain[i]); while(plain[i]!='\n'&&i<SIZE) { i++; scanf("%c",&plain[i]); } printf("success input %d characters\n",i); //将明文转存到文件中 for(j=0;j<i;j++) { if(fwrite(&plain[j],sizeof(char),1,fpp)!=1) { printf("saving plain file error!\n"); exit(0); } } printf("success saving plain text!\n"); //加密 for(j=0;j<i;j++) { cipher[j]=plain[j]+3; if(cipher[j]99) { printf("cipher %d = %c\n",j,cipher[j]); } else if(cipher[j]>122) { cipher[j]=cipher[j]%122+96; printf("cipher %d = %c\n",j,cipher[j]); } else if(cipher[j]>90) { cipher[j]=cipher[j]%90+64; printf("cipher %d = %c\n",j,cipher[j]); } else { printf("cipher %d = %c\n",j,cipher[j]); } } //建立密文文件 if((fpc=fopen("cipher.txt","w+"))==NULL) { printf("create new cipher file error!"); exit(0); } for(j=0;j<i;j++) { if(fwrite(&cipher[j],sizeof(char),1,fpc)!=1) { printf("saving cipher file error!"); exit(0); } } printf("success saving cipher file!"); printf("\n"); //解密 printf("input ciphertext alphabet:\n"); i=0; scanf("%c",&ciphertext[i]); while(ciphertext[i]!='\n'&&i<SIZE) { i++; scanf("%c",&ciphertext[i]); } for(j=0;j<i;j++) { decryption[j]=ciphertext[j]-3; if(decryption[j]90&&decryption[j]<97) { decryption[j]=123-(97-decryption[j]); printf("character %d = %c\n",j,decryption[j]); } else {
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值