热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单加密维吉尼亚

  16世纪法国外交家BlaisedeVigenère设计了一种多表密码加密算法——Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北

  

  16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

在 密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输 入的数据,记为k。 在Vigenère密码中,密钥k是一个字母串,k=k1k2…kn。当明文M=m1m2…mn时,得到的密文C=c1c2…cn,其中 ci=mi®ki,运算®的规则如下表所示:

Vigenère加密在操作时需要注意:

1. ®运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式;

2. 当明文M的长度大于密钥k的长度时,将密钥k重复使用。

例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。












































明文Helloworld
密钥abcabcabca
密文Hfnlpyosnd

 

 


输入

输入共2行。
第一行为一个字符串,表示明文M,长度不超过1000,其中仅包含大小写英文字母。

第二行为一个字符串,表示密钥K,长度不超过100,其中仅包含大小写英文字母。


输出

输出共1行,一个字符串,表示加密后的密文。


样例输入

请输入明文:Helloworld
请输入密匙:abc

样例输出

密文:Hfnlpyosnd
-------------------------------------------------------------------
题解如下:
  看到这个密码表有没有想到二维数组和ASCII码?

1 #include
2 #include
3
4 void Vigenere(char m[], char k[]) {
5 //创建密码表
6 char Encryption_table[26][26];
7 int i, j, flag = 97, top;
8 //密码表分两部分 第一部分是以“Z”为对角线的上部分,第二部分则为下部分
9 //这个for循环创建密码表的第一部分
10 for (i = 0; i <26; i++)
11 {
12
13 top = flag;//因为大部分明文是小写,所以top从’a‘开始创建小写密码表
14 for (j = 0; j <26; j++) {
15 Encryption_table[i][j] = top;
16 top++;
17 if (top > 122) break;//如果top的ASCII码值超过了122(即赋值完'z')就不再往下赋值
18 }
19 flag++;//更新起始值 (每一行的第一个元素都比上一行大 1 )
20 }
21 //这个for循环创建密码表的第二部分
22 //从第二行开始密码表不全 所以i=1
23 for (i = 1; i <26; i++) {
24 flag = 97;
25 for (j = 26 - i; j <26; j++)
26 {//j=26-i 寻找每行’a'的起始位置
27 Encryption_table[i][j] = flag;
28 flag++;
29 }
30 }
31
32
33 char C[1000];
34 int lenk = strlen(m);
35 for (j = -1, i = 0; i 36 {
37 j++;
38 if (k[j] == '\0') j = 0; //判断密匙是否用完,如果用完就从第一个元素重新使用
39 //密匙与明文大小写的四种状态
40 if (m[i] >= 97 && k[j] >= 97)
41 {
42 C[i] = Encryption_table[m[i] - 97][k[j] - 97];
43 continue;
44 }
45 if (m[i] <97 && k[j] <97) {
46 m[i] = m[i] + 32; k[j] = k[j] + 32; C[i] = Encryption_table[m[i] - 97][k[j] - 97] - 32;
47 continue;
48 }
49 if (m[i] <97 && k[j] >= 97) {
50 m[i] = m[i] + 32; C[i] = Encryption_table[m[i] - 97][k[j] - 97] - 32;
51 continue;
52 }
53 if (m[i] >= 97 && k[j] <97) {
54 k[j] = k[j] + 32; C[i] = Encryption_table[m[i] - 97][k[j] - 97];
55 continue;
56 }
57
58 }
59 printf("密文:");
60 for (i = 0; i 61 {
62 printf("%c", C[i]);
63 }
64 }
65 int main()
66 {
67 char m[1000], k[100];
68 printf("请输入明文:");
69 gets_s(m);
70 printf("请输入密匙:");
71 gets_s(k);
72 Vigenere(m, k);
73 }

 

 

 


推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文汇总了在正式宴会上常用的寒暄语句,包括欢迎词、感谢词及日常问候,适用于各种正式场合。这些语句不仅有助于提升交际礼仪,还能增进彼此之间的友好关系。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
author-avatar
心若在梦就在_2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有