鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 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
如题目,密码类型为英文字母
代码:
#include <stdio.h>

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

/*解密*/
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; }

int main()
{
    char password[4] = "wxyz"; // 原密码
    int key = 3; // 密钥
    printf("原密码:%s\n", password);
    
    CaesarCipher(password, 4, key); // 将原密码转变成恺撒密码
    printf("恺撒密码:%s\n", password);
    
    Decrypt(password, 4, key); // 解密
    printf("解密:%s", password);
    
    return 0;
}
输出:
原密码:wxyz
恺撒密码:zabc
解密:wxyz

最佳答案

查看完整内容

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

使用道具 举报

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

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

/*解密*/
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; }

int main()
{
    char password[4] = "wxyz"; // 原密码
    int key = 3; // 密钥
    printf("原密码:%s\n", password);
    
    CaesarCipher(password, 4, key); // 将原密码转变成恺撒密码
    printf("恺撒密码:%s\n", password);
    
    Decrypt(password, 4, key); // 解密
    printf("解密:%s", password);
    
    return 0;
}
输出:
原密码:wxyz
恺撒密码:zabc
解密:wxyz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

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

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

int main(void) {
    char buff[1024];
    const char *str = "abcdABCD;1234[]9876;ZXCVzxcv-";
    encode(buff, str, 3);
    puts(str);
    puts(buff);
    decode(buff, buff, 3);
    puts(buff);
    puts("");
    encode(buff, str, 3);
    puts(str);
    puts(buff);
    decode2(buff, buff, 3);
    puts(buff);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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
如题目,密码类型为英文字母
代码:输出:
#include<stdio.h>


/*凯撒密码*/
void CasesarCipher(char p[],int n,int k)
{
        for(size_t i=0;i<n;i++)
        {
                p[i]=(p[i]-'a'+k)%26+'a'; //这里感觉不加括号比较好理解
        }
 } 
 /*解密*/
 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; //这里有个等于号,有a时不会出错
         }
  } 
  
  int main()
  {
          char password[5]="abcd";
          int key=3;
          printf("原密码:%s\n",password);
          CasesarCipher(password,4,key);
          printf("加密后:%s\n",password);
          Decrypt(password,4,key);
          printf("解密后:%s\n",password);
          
          return 0;
  }

做了一点修改
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-10 03:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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