如何使用C语言实现Vigenre密码加解密

news/2025/9/23 12:33:22/文章来源:https://www.cnblogs.com/franksamada/p/19106968

如何使用C语言实现Vigenère密码加解密

在洛谷看到这题,觉得有意思,遂写。

参考文章:C语言实现Vigenere加解密算法(附带源码)

1. Vigenère密码简介与原理

Vigenère密码是一种多表密码,使用一系列凯撒密码(Caesar cipher)来实现加密。在Vigenère密码中,明文中的每个字符都被替换为密文中的对应字符,而密钥用于确定使用哪个凯撒密码表。具体来说,明文中的每个字符都会根据密钥中的字符进行位移,从而生成密文。如图:img
加密例子:明文:HELLO,密钥:KEY,加密后:RIJVS

对照表中,先将密钥填充至与明文长度相同:KEYKE。然后在对照表中找到明文字符对应的密文字符,如第一个字符在对照表中的K行找到H列,对应的字符是R,于是第一个字符就被加密成R。以此类推,直到明文全部加密完成。

实际操作中,其实就是一系列的不同的凯撒密码加密,而密钥决定了使用哪个凯撒密码表,这里不赘述。我们把字母转换成数字(A = 0,B = 1,……),写成公式可以表达成:

加密:C = (P + K)% 26

其中C为密文字符,P为明文字符,K为密钥字符。同样可以得到解密公式:

解密:P = (C - K + 26)% 26

2.具体实现

这里仅给出函数实现,以及省略了引入string.h和ctype.h头文件。

我们可以考虑先忽略字母的大小写,解密后再对照原文判断是否转换大小写。先实现字母转数字、数字转字母的函数:

int Char_to_Number(char c)
{return c - 'A';
}char Number_to_Char(int num, char origin)
{char c = 'A' + num;//* 对照原文if (islower(origin)){return tolower(c);}return c;
}

解码:

char *Decode(char *key, char *C, char *M)
{for (int i = 0, j = 0; i < strlen(C); i++){if (isalpha(C[i])){int keyNum = Char_to_Number(key[j % strlen(key)]); // 填充密钥int CNum = Char_to_Number(C[i]);int MNum = (CNum - keyNum + 26) % 26;M[i] = Number_to_Char(MNum, C[i]);// 不能在循环体里面写j++😡,否则遇到非字母字符j也会增加j++; }else{M[i] = C[i];}}return M;
}

加密:

char *Encode(char *key, char *M, char *C)
{for (int i = 0, j = 0; i < strlen(M); i++){if (isalpha(M[i])){int keyNum = Char_to_Number(key[j % strlen(key)]);int MNum = Char_to_Number(M[i]);int CNum = (MNum + keyNum) % 26;C[i] = Number_to_Char(CNum, M[i]);j++;}else{C[i] = M[i];}}
}

完整测试用例代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>int Char_to_Number(char c);
char Number_to_Char(int num, char origin);
char *Decode(char *key, char *C, char *M);
char *Encode(char *key, char *M, char *C);int main()
{char key[101];char C[1001];char M[1001];fgets(key, sizeof(key), stdin);fgets(C, sizeof(C), stdin);key[strcspn(key, "\n")] = '\0';C[strcspn(C, "\n")] = '\0';Decode(key, C, M);printf("%s\n", M);// Encode(key, M, C);// printf("%s\n", C);return 0;
}int Char_to_Number(char c)
{return toupper(c) - 'A';
}char Number_to_Char(int num, char origin)
{char c = 'A' + num;//* 对照原文if (islower(origin)){return tolower(c);}return c;
}char *Decode(char *key, char *C, char *M)
{for (int i = 0, j = 0; i < strlen(C); i++){if (isalpha(C[i])){int keyNum = Char_to_Number(key[j % strlen(key)]); // 填充密钥int CNum = Char_to_Number(C[i]);int MNum = (CNum - keyNum + 26) % 26;M[i] = Number_to_Char(MNum, C[i]);j++; // 不能在循环体里面写j++😡,否则遇到非字母字符j也会增加}else{M[i] = C[i];}}return M;
}char *Encode(char *key, char *M, char *C)
{for (int i = 0, j = 0; i < strlen(M); i++){if (isalpha(M[i])){int keyNum = Char_to_Number(key[j % strlen(key)]);int MNum = Char_to_Number(M[i]);int CNum = (MNum + keyNum) % 26;C[i] = Number_to_Char(CNum, M[i]);j++;}else{C[i] = M[i];}}
}

3. 总结

知道了加解密公式,实现起来就很简单,以及注意需要对照原文判断转换字母的大小写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何给网站加关键词wordpress国外社交插件

这一节继续了解 openmax 目录下的内容。 1、OMX_Core.h 1.1、OMX_BUFFERHEADERTYPE 这是一个比较关键的结构体&#xff0c;上层ACodec/MediaCodec用到的 buffer id、OMXNode 与 OMX component 进行 buffer 传递都是通过该结构体完成&#xff0c;这里将会初步了解结构体中的部…

嵌入式硬件工程师每日提问 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站点击软件排名北京设计公司logo

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…

网站还建设 域名可以备案吗太原网络推广公司

文章目录 1. 生成模型与判别模型1.1 生成模型 2. VAE3. GAN3.1 GAN-生成对抗网络3.2 GAN-生成对抗网络的训练3.2.1 判别模型的训练&#xff1a;3.2.2 生成网络的训练&#xff1a; 4. LeakyReLU5. GAN代码实例 1. 生成模型与判别模型 生成模型与判别模型 我们前面几章主要介绍了…

安徽网站开发建设泸州网站公司

java编程语言是目前世界最流行的编程语言&#xff0c;它是在c的基础上开发出来的语言&#xff0c;它取其精华去其糟粕让java语言具有功能强大和简单易用的特征。java具有&#xff1a;面对对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。java可以编写…

信息化和网站建设管理工作情况建立网站视频教程

在做一个网站时&#xff0c;发现视频文件&#xff0c;比如flv&#xff0c;MP4格式在本地可以正常的播放&#xff0c;但是传到了开发机器上&#xff0c;就不行了。播放器的文件地址是对的&#xff0c;就是一直没有反应。 经过长时间的实验&#xff0c;发现问题在与iis的设置问题…

深圳正规网站制作哪家公司好solusvm做网站

昨晚上这个新闻很多人转&#xff0c;但是可能很少有人知道他的链接出处&#xff0c;链接来自于http://www.mohrss.gov.cn/SYrlzyhshbzb/jiuye/gzdt/202108/t20210816_420736.html我记得我还在上小学的时候&#xff0c;我们家有干不完的农活&#xff0c;暑假每天都要下田干活&am…

用什么程序做资讯类网站做网站要准备

0.前提 1. (C)Why did you include the header file of the message file instead of the message file itself?&#xff08;为包含消息的头文件而不是消息本身&#xff1f;&#xff09; 回答&#xff1a;msg文件是描述ROS消息字段的文本文件&#xff0c;用于生成不同语言消息…

昆明网站多端小程序设计百度一下官网首页百度

航海日志&#xff1a;Docker的奇幻漂流 欢迎各位探险家们&#xff0c;今天我们将启航进入一个由容器构成的神秘海域——Docker。在这个由代码构建的奇妙世界里&#xff0c;我们将学习如何驾驭这些名为“容器”的神奇船只。准备好了吗&#xff1f;让我们扬帆起航&#xff0c;探…

网站优化自己做该怎么做4虎最新ip是多少呢有人知道吗

1月17日&#xff0c;首届阿里云PolarDB开发者大会在京举办&#xff0c;中国首款自研云原生数据库PolarDB发布“三层分离”全新版本&#xff0c;基于智能决策实现查询性能10倍提升、节省50%成本。面向开发者&#xff0c;阿里云全新推出数据库场景体验馆、训练营等系列新举措&…

【F#学习】列表 List

F#中的列表list是不可变的一列数据。列表中的数据必须具有相同的数据类型。任何试图对列表进行修改的函数或者运算符,实际上都是构建了一个新的列表。 用如下方式来定义一个列表: let empty = [] let singleValue = …

Trae与Gitee MCP深度集成:AI编程工具链迎来重大升级

Trae与Gitee MCP深度集成:AI编程工具链迎来重大升级 在AI技术持续渗透软件开发领域的当下,国内AI编程工具生态迎来重要里程碑。字节跳动旗下明星产品Trae AI IDE与Gitee MCP近日宣布完成深度集成,这一强强联合将为开…

【2025-09-22】加班感悟

20:00培养对小事的耐心,你才能对大事保持耐心。——凯文凯利连续加班了两天,有同事顶不住要休假了。其实,我也要休息一天,但早上要送孩子上学,起床了就睡不回去。尚象也只是对着手机,还要远程限进二生工作进度。…

网站建设公司如何发展python做笔记的网站

前言 在实际开发项目中&#xff0c;我们的工程目录往往是多个app在一个工程下的&#xff0c;每次打包都需要手动的用studio点击Build->Generate Signed Bundle or APK->APK 选择app&#xff0c;签名等&#xff0c;甚至有的app签名还不一样&#xff0c;还需要手动的来回切…

软件开发网站开发学习淘宝导购网站备案

OpenAI⼤模型⽣态并不只有⼀个模型&#xff0c;⽽是提供了涵盖⽂本、代码、对话、语⾳、图像领域的⼀系列模型。 基本介绍 语⾔类⼤模型&#xff1a;GPT-3、GPT-3.5、GPT-4系列模型。并且&#xff0c;OpenAI在训练GPT-3的同时&#xff0c;训练了参数不同、复杂度各不相同的A、…

锋创科技园网站建设最大的建材采购平台

混淆概念的几个说法&#xff1a; 说法1&#xff1a; “以太网交换机不可以实现采用不同网络层协议的互联” 原因&#xff1a;以太网交换机是数据链路层的设备&#xff0c;不懂网络层的知识 说法2&#xff1a; “网桥可互联不同的物理层、不同的MAC子层以及不同速率的以太网”…

dede网站qq类资源源码网站图片如何做超链接

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的数字电压表&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 本设计采用单片机为主控芯片&#xff0c;结合周边电路组成LED彩灯的闪烁控制系统器&#xff0c;用来控制红色…

网站备案号没有-1哪个公司需要做网站

1、跨境支付市场规模不断增大&#xff0c;第三方跨境支付&#xff08;万里汇、连连支付&#xff09;迅速成长&#xff08;支付、融资、理财、账务管理、结算、汇率管理、保险、税务一站式服务&#xff09;&#xff08;这是不是倒逼银行改变支付方式的下个场景&#xff1f;就如目…

开办网站备案成都网站建设 seo

1. MySQL 基础篇 1.1 MySQL 概述 1.1.1 数据库相关概念 数据库(Database, 简称 DB): 存储数据的仓库&#xff0c;数据是有组织的进行存储。 数据库管理系统(Database Management System, 简称 DBMS): 操作和管理数据库的大型软件。 SQL(Structured Query Language, 简称 S…

建设网站公司怎么分工免费制作图片

大家好&#xff0c;我是晴天学长&#xff0c;搜索型的dfs&#xff0c;差点开二维矩阵了&#xff0c;仔细一想&#xff0c;没那么夸张啊&#xff0c;哈哈哈&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1…