18649448973 发表于 2023-3-31 19:11

C语言英文加密解密

本帖最后由 18649448973 于 2023-4-3 14:43 编辑


#include <stdio.h>
void test7();
void test8();//加强版
int main(){
      test7();
      test8();
      return 0;
      }
void test7() {
    printf("\n==================================测试7==================================\n");
    do {
      char str, str1, str2;//定义三个字符串
      unsigned int pass = 0;//定义密码
      printf("\n请输入一段明文:");
      scanf("%[^\n]", &str);//输入回车结束
      getchar();//消除回车缓存
      printf("你输入的明文是:");
      //'\0'字符串结束符
      for (int i = 0; str != '\0';) { //历遍检查所有字符
            printf("%c", str);//打印字符
      }
      printf("\n请输入密码(一个英文字母):");
      scanf("%d", &pass);//输入密码
      getchar();//消除回车缓存
      if (pass > 27)pass %= 27;//密码求余0-26
      printf("正在加密#########\n");
      for (int i = 0; str != '\0'; i++) {//判读字符串是否结束str != '\0';
            if (i % 3 == 0) {//i求余 三次密码+1
                pass++;
                if (pass > 27)pass %= 27;//密码大于27求余
            }
            if (str >= 'A' && str <= 'z') {//判断是否为英文字符范围
                if (str - pass >= 'A')str1 = str - pass;//如果字符-密码 加密字符=大于字符A则字符减密码
                else str1 = 'z' - ('A' - (str - pass));//否则 加密字符=最大字符z减字符减密码的倒序字符
            } else str1 = str;//判断不为英文字母范围 加密字符=明文字符
            //printf("%c对应%c\n",str,str1);
            str1 = '\0';//最后给加密字符结束符号
      }

      printf("密文是:%s\n", str1);//最后打印出加密字符串
      printf("\n请输入密码(一个英文字母):");
      scanf("%d", &pass);//输入密码
      getchar();//消除回车缓存
      if (pass > 27)pass %= 27;//密码求余 0-26
      printf("正在解密#########\n");
      for (int i = 0; str1 != '\0'; i++) {//判读字符串是否结束str != '\0';
            if (i % 3 == 0) {//三次密码+1
                pass++;
                if (pass > 27)pass %= 27;//求余
            }
            if (str1 >= 'A' && str1 <= 'z') {//密文范围
                if (str1 + pass <= 'z')str2 = str1 + pass;//判断字符加密码是否大于;z
                else str2 = ((str1 + pass) - 'z') + 'A';//不在该范围
            } else str2 = str1;//其余字符不变
            str2 = '\0';
            // printf("%c对应%c\n",str1,str2);
      }
      printf("\n明文是:%s\n", str);
      printf("密文是:%s\n", str1);
      printf("解密是:%s\n", str2);
      printf("\n输入任意键退出回车继续:");
    } while (getchar() == '\n');
}



//感觉上面密码过于简单,范围过于小,所以改造了一下,基本上是没有算法无法(个人认为),欢迎大佬破解
void test8() {
    printf("\n==================================测试8==================================\n");
    do {
      char str, str1, str2;//定义三个字符串
      int char_range1 = ';',char_range2 = '~';
      int range = char_range2 -char_range1 - 1 ;//字符范围
      unsigned int pass = 0, pass1;//定义密码
      printf("\n请输入一段明文:");
      scanf("%[^\n]", &str);//输入回车结束
      getchar();//消除回车缓存
      printf("你输入的明文是:");
      //'\0'字符串结束符
      for (int i = 0; str != '\0';) { //历遍检查所有字符
            printf("%c", str);//打印字符
      }
      printf("\n请输入密码(一个英文字母):");
      scanf("%d", &pass);//输入密码
      getchar();

      if (pass > range) {
            pass1 = (int) (pass / range) % range;
            pass %= range;//密码求余 0-26
      } else pass1 = pass;
      printf("正在加密#########\n");

      for (int i = 0; str != '\0'; i++) {//判读字符串是否结束str != '\0';
            if (i % pass1 == 0) {//i求余 三次密码+1
                pass++;
                if (pass > range)pass %= range;//密码大于27求余
            }
            if (str >= char_range1 && str <= char_range2) {//判断是否为英文字符范围
                if (str - pass >= char_range1)str1 = str - pass;//如果字符-密码 加密字符=大于字符A则字符减密码
                else str1 = char_range2 - (char_range1 - (str - pass));//否则 加密字符=最大字符z减字符减密码的倒序字符
            } else str1 = str;//判断不为英文字母范围 加密字符=明文字符
            //printf("%c对应%c\n",str,str1);
            str1 = '\0';//最后给加密字符结束符号
      }

      printf("密文是:%s\n", str1);//最后打印出加密字符串
      printf("\n请输入密码(一个英文字母):");
      scanf("%d", &pass);//输入密码
      getchar();
      if (pass > range) {
            pass1 = (int) (pass / range) % range;
            pass %= range;//密码求余 0-26
      } else pass1 = pass;
      printf("正在解密#########\n");
      for (int i = 0; str1 != '\0'; i++) {//判读字符串是否结束str != '\0';

            if (i % pass1 == 0) {//三次密码+1
                pass++;
                if (pass > range)pass %= range;//求余
            }
            if (str1 >= char_range1 && str1 <= char_range2) {//密文范围
                if (str1 + pass <= char_range2)str2 = str1 + pass;//判断字符加密码是否大于;z
                else str2 = ((str1 + pass) - char_range2) + char_range1;//不在该范围
            } else str2 = str1;//其余字符不变
            str2 = '\0';
            // printf("%c对应%c\n",str1,str2);
      }
      printf("\n明文是:%s\n", str);
      printf("密文是:%s\n", str1);
      printf("解密是:%s\n", str2);
      printf("\n输入任意键退出回车继续:");
    } while (getchar() == '\n');
}

WuYule 发表于 2023-3-31 21:27

很有意思的程序,拿来练练手挺好的。

krik 发表于 2023-4-1 13:46

应该用得固定移位的方式吧
页: [1]
查看完整版本: C语言英文加密解密