鱼C论坛

 找回密码
 立即注册
查看: 896|回复: 11

[已解决]用c语言

[复制链接]
发表于 2021-11-27 09:22:12 | 显示全部楼层 |阅读模式
15鱼币
哪个大佬可以帮我一下,顺便讲解一下

利用数组编写程序(c语言)

在密码学中,恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。向后移动的位数就是密钥,例如,密钥 k=3,则每个字母都会向前移动 3位:a 会被替换为 d;b 会被替换成 e;依此类推。字母表末尾将回卷到字母表开头。于是,w 会被替换为 z,x 会被替换为 a。 请编写程序,要求输入密码和信息,然后京程序加密后输出密文,并设计解密程序对密文进行解密。
最佳答案
2021-11-27 09:22:13
如题目,密码类型为英文字母
代码:
  1. #include <stdio.h>

  2. /*恺撒密码*/
  3. void CaesarCipher(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p[i] = ((p[i]-('a'-k))%26)+'a'; }

  4. /*解密*/
  5. void Decrypt(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p[i] = p[i]-k >= 'a' ? p[i]-k : p[i]-k+26; }

  6. int main()
  7. {
  8.     char password[4] = "wxyz"; // 原密码
  9.     int key = 3; // 密钥
  10.     printf("原密码:%s\n", password);
  11.    
  12.     CaesarCipher(password, 4, key); // 将原密码转变成恺撒密码
  13.     printf("恺撒密码:%s\n", password);
  14.    
  15.     Decrypt(password, 4, key); // 解密
  16.     printf("解密:%s", password);
  17.    
  18.     return 0;
  19. }
复制代码
输出:
  1. 原密码:wxyz
  2. 恺撒密码:zabc
  3. 解密:wxyz
复制代码

最佳答案

查看完整内容

如题目,密码类型为英文字母 代码:输出:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 09:22:13 | 显示全部楼层    本楼为最佳答案   
如题目,密码类型为英文字母
代码:
  1. #include <stdio.h>

  2. /*恺撒密码*/
  3. void CaesarCipher(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p[i] = ((p[i]-('a'-k))%26)+'a'; }

  4. /*解密*/
  5. void Decrypt(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p[i] = p[i]-k >= 'a' ? p[i]-k : p[i]-k+26; }

  6. int main()
  7. {
  8.     char password[4] = "wxyz"; // 原密码
  9.     int key = 3; // 密钥
  10.     printf("原密码:%s\n", password);
  11.    
  12.     CaesarCipher(password, 4, key); // 将原密码转变成恺撒密码
  13.     printf("恺撒密码:%s\n", password);
  14.    
  15.     Decrypt(password, 4, key); // 解密
  16.     printf("解密:%s", password);
  17.    
  18.     return 0;
  19. }
复制代码
输出:
  1. 原密码:wxyz
  2. 恺撒密码:zabc
  3. 解密:wxyz
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 09:39:58 From FishC Mobile | 显示全部楼层
请问这个题目哪里有难度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 11:15:43 | 显示全部楼层
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的不好,可以返回前面去温故知新

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>

  4. void encode(char *buff, const char *str, unsigned char key) {
  5.     if(buff != str) strcpy(buff, str);
  6.     for(size_t i = 0; buff[i]; ++i) {
  7.         if(!islower(buff[i])) continue;
  8.         buff[i] = 'a' + (buff[i] - 'a' + key) % 26;
  9.     }
  10. }

  11. void decode(char *buff, const char *str, unsigned char key) {
  12.     if(buff != str) strcpy(buff, str);
  13.     for(size_t i = 0; buff[i]; ++i) {
  14.         if(!islower(buff[i])) continue;
  15.         buff[i] = 'z' + (buff[i] - 'z' - key) % -26;
  16.     }
  17. }

  18. void decode2(char *buff, const char *str, unsigned char key) {
  19.     encode(buff, str, 26 - key);
  20. }

  21. int main(void) {
  22.     char buff[1024];
  23.     const char *str = "abcdABCD;1234[]9876;ZXCVzxcv-";
  24.     encode(buff, str, 3);
  25.     puts(str);
  26.     puts(buff);
  27.     decode(buff, buff, 3);
  28.     puts(buff);
  29.     puts("");
  30.     encode(buff, str, 3);
  31.     puts(str);
  32.     puts(buff);
  33.     decode2(buff, buff, 3);
  34.     puts(buff);
  35.     return 0;
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 13:32:33 | 显示全部楼层
人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...

????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 14:03:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 16:00:32 | 显示全部楼层
应该是向后移动3位吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 16:23:42 | 显示全部楼层
傻眼貓咪 发表于 2021-11-27 15:00
如题目,密码类型为英文字母
代码:输出:
  1. #include<stdio.h>


  2. /*凯撒密码*/
  3. void CasesarCipher(char p[],int n,int k)
  4. {
  5.         for(size_t i=0;i<n;i++)
  6.         {
  7.                 p[i]=(p[i]-'a'+k)%26+'a'; //这里感觉不加括号比较好理解
  8.         }
  9. }
  10. /*解密*/
  11. void Decrypt(char p[],int n,int k)
  12. {
  13.         for(size_t i=0;i<n;i++)
  14.         {
  15.                 p[i]=p[i]-k>='a'?p[i]-k:p[i]-k+26; //这里有个等于号,有a时不会出错
  16.          }
  17.   }
  18.   
  19.   int main()
  20.   {
  21.           char password[5]="abcd";
  22.           int key=3;
  23.           printf("原密码:%s\n",password);
  24.           CasesarCipher(password,4,key);
  25.           printf("加密后:%s\n",password);
  26.           Decrypt(password,4,key);
  27.           printf("解密后:%s\n",password);
  28.          
  29.           return 0;
  30.   }
复制代码


做了一点修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 16:31:52 | 显示全部楼层
人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...

你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 17:03:14 | 显示全部楼层
pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧

是 -26,没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 17:27:22 | 显示全部楼层

都可以,最重要自己喜欢,结果没有出错就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 17:34:57 | 显示全部楼层
pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧

取模可以是负数,完全没有问题的(相关知识可以参考数学 mod)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 19:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表