C语言实现Vigenere密码加解密体制

合集下载

Vigenre加解密程序制作

Vigenre加解密程序制作

Vigenere 加解密程序制作一、Vigenere密码简介维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。

实际上,Vigenere密码的代替规则是用明文字母在Vigenere方阵中的列,和密钥字母在Vigenere方阵中的行的交点处的字母来代替该明文字母。

vigenere方阵为:a abcdefghijklmnopqrstuvwxy zb bcdefghijklmnopqrstuvwxyz ac cdefghijklmnopqrstuvwxyz a bd defghijklmnopqrstuvwxyz a b ce efghijklmnopqrstuvwxyz a b c d………z z a b c d e f g h i j k l m n o p q r s t u v w x y对如下明文加密:TO BE OR NOT TO BE THAT IS THE QUESTION当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:密钥:RELAT IONSR ELATI ONSRE LATIO NSREL明文:TOBEO RNOTT OBETH ATIST HEQUE STION密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY解密时利用Vigenere方阵进行反替换!二、程序制作说明本程序通过控制台的方式来实现对用户输入的明文(密文)的加密(解密),在对明文(密文)的加密(解密)时所用的密钥必需保证是一致的。

程序界面为:1、Vigenere方阵的形成Vigenere方阵的形成是在程序的OnInitDialog()函数中调用Vigenre_Array()函数来实现的。

把Vigenere方阵的字母转换为十进制数据进行观察分析可以看出,最大的数是90,并且从左到右是递增的,直到遇到90为止,然后再从数字65开始。

vigenetre算法

vigenetre算法

vigenetre算法
在Vigenere密码中,用户钥是一个有限序列,我们可以通过周期性(周期为d)将k扩展为无限序列,其中Ki=K(i mod d),1≤i≤,从而得到工作钥。

如果用Φ和θ分别表示密文和明文字母,则Vigenere密码的变换公式为:
Φ≡(θ+ki)(mod n)
该密码体制有一个参数n。

在加解密时,同样把英文字母映射为0~25的数字再进行运算,并按凡个字母一组进行变换。

明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合。

Vigenere的安全上主要表现在以下两点:(1)密钥长度越长,越难以破解,因为这是相当于对每一个字符分别进行加密。

(2)如果没有得到密钥,很难对密文进行解密(当然,在超短密钥情况下还是可能进行解密的)。

维吉尼亚(Vigenere)密码算法的VC实现

维吉尼亚(Vigenere)密码算法的VC实现

Vigenere算法实现传统加密技术对于当今的网络安全发挥不了大作用,但每一本讲述密码学的书的开头都会率先介绍它们,因为它们是密码学的基础,是密码学的历史。

Vigenere密码就是一种传统加密技术,它是多表代换密码,能够有效改进单表代换密码的词频分布特征问题。

详细介绍请参考密码学相关书籍。

几乎每一本密码学的书在讲述Vigenere密码的章节都会有这么一个《Vigenere代换表》用户讲解Vigenere密码机制:ABCDEFGHIJKLMNOPQRSTUVWXYZBCDEFGHIJKLMNOPQRSTUVWXYZACDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZABCDEGHIJKLMNOPQRSTUVWXYZABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGIJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJLMNOPQRSTUVWXYZABCDEFGHIJKMNOPQRSTUVWXYZABCDEFGHIJKLNOPQRSTUVWXYZABCDEFGHIJKLMOPQRSTUVWXYZABCDEFGHIJKLMNPQRSTUVWXYZABCDEFGHIJKLMNOQRSTUVWXYZABCDEFGHIJKLMNOPRSTUVWXYZABCDEFGHIJKLMNOPQSTUVWXYZABCDEFGHIJKLMNOPQRTUVWXYZABCDEFGHIJKLMNOPQRSUVWXYZABCDEFGHIJKLMNOPQRSTVWXYZABCDEFGHIJKLMNOPQRSTUWXYZABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVWYZABCDEFGHIJKLMNOPQRSTUVWXZABCDEFGHIJKLMNOPQRSTUVWXY加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y列的那个字母。

基于vigenere密码的文件加解密器的研究与实现

基于vigenere密码的文件加解密器的研究与实现
相应处理 。若返 回的是常规字符 ,则进行新建操作 ,即
f, ( 一 )o口 Ki 口 og m=( K。 I d 一 x ) d c gn +m
(: 2 , , 中 1 , c m ) ,m 其 { … 2-
l=6 g2
理论上不可攻破 的密码系统只有一次一密系统 ,但 在实际应用 中,一次一密却受到很大 限制 。Vg n r密 ieee
Vieee gn r密码算法是古典加 密算法 之一 ,在密码学
中 占据着非常重要的地位 ,它对 于我们理解 、设计 、分 析现代 密码学具有很高 的参考价值 。Vg nr密码算法 ie ee
如下 :
j JKL

KL粥N 0PQ RSTUV WXV ZAB CDEF GH I_ 了
如 图21 的密钥字母 所在 坐标轴 为x轴 ,明文字 .上 母 坐在坐标轴 为Y ,则二维vgnrJ 密的密文字母 轴 ieeel J
z Z A B C D E F GH I JK L M N 0 P Q R S Y U V W X Y
要 函数 :
( )加 密 函数 1
子菜 单
返 回值
三 绻
帮 助
关于
拥 镌 拥 解 事 峦
图 31 .文件加解密器模块设计图
_
分别 在x轴 方 向和 Y 方 向 以模 2 形 式增 长 。而 三维 轴 6
vg nr密码是 在此基础上增加一个z ,使二维加密后 i e e e 轴 的密文在z 轴的方向也 以模2 的方式增长。 6 记第一次加密密钥 K - x, k : ,z k …, ,第 二次加 密 密钥 K = l …, ,明文 y y m 2 m : , k k l , ,通 , …, 过 引入坐标轴 ,规定a 分别表示0 1 5 到z  ̄2 ,则在原二维 J

VigenereCipher暗码解码[整理版]

VigenereCipher暗码解码[整理版]

Vigenere Cipher解密一、实验任务Vigenere Cipher加密密文如下:KVNIICWZSNOHUNXQGMRNAHUVWPTBWBPKVYPTBASHRZVIIWIBCGJS GEYGFMOAKBTBJKMAQEGSQJIJHTRGJSFRXTNBVFVCORWGENSIKRRAX V AIHNNZZRRCKMQEGOGRHGJCOYKVNIICWZSNOHUNXQGMRNACAGLG KMRUKZYFSHZMCEIWNGLGLWBFQTSBVOXZGYCJRFEPWBVRUCAFSHY WFZGFFYEXXWKAGFFJMNEJSNDZRGSUBBRBYBGBKGMPSECHGUIVTJZ RQTOESVAMFUQCQVLCOMOQTSNZXJTBCAGRNLIXXVHUGGGNXGHNA V UGVFWKIXWNUHNGIUPMZGGFVAKYBBVGJSUREVHNW ALIFGMEXAKRN HREMPZEWGJHURLGTBCSQDCEIULQCAYWYYFGMZOAUTBEQGWQBGQ OABEUBACSHFRRHQFIBQLIFGMEX请写出详细解密过程。

二、Vigenere加密与解密Vigenere加密为单表代换密码,其加密过程可表述为:设m是一个正整数,定义P=C=K=(Z26)m,对任意的密钥K=(k1,k2,…,km),定义eKx1,x2,…,xm=(x1+k1,x2+k2,…,xm+km)和dKy1,y2,…,ym=(y1-k1,y2-k2,…,ym-km)为Vigenere加密和解密过程,以上所有运算都在(Z26)m上进行。

三、Vigenere密文的破译Vigenere解密首先在于确定密钥长度m,意大利的乔瓦·尼·波塔于1602年首先发现Vigenere明/密文中重复字母串的距离正好是密钥长度的倍数,这一现象称为“合拍”现象。

由此出发,产生的确定m长度常用方法有两种:方法一是Kasiski测试法;方法二是重合指数法。

Vigenere加密

Vigenere加密

实验报告表格例实验1(Vigenere算法)的源代码如下:#include<iostream>using namespace std;int tt(){chartable[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n',' o','p','q','r','s','t','u','v','w','x','y','z'};int w,k,q;w=k=q=0;char miyao[10];//={'n','i','c','e','d','a','y'};cout<<"请输入密钥,且密钥的个数小于10个"<<endl;//for(int i=0;i<9;i++)//{cin>>miyao;//w++;char minwen[20],miwen[20];cout<<"请输入需要加密的明文,且明文的长度一次不能超过19个字母"<<endl;//for(int j=0;j<19;j++)cout<<"明文:";cin>>minwen;cout<<"输入的明文加密后的密文如下"<<endl;for(int p=0;minwen[p]!='\0';p++){if(miyao[q]=='\0'){q=0; k=((minwen[p]-97)+(miyao[q]-97))%26;//miwen[p]=table[k];cout<<table[k];}else{k=((minwen[p]-97)+(miyao[q]-97))%26;//miwen[p]=table[k];cout<<table[k];}q++;}cout<<endl;//加密完成,下面是解密的过程;cout<<"如果想解密请输入加密后的密文"<<endl; cout<<"密文:";cin>>miwen;cout<<"解密后的明文如下"<<endl;int t=0;for(int i=0;miwen[i]!='\0';i++){if(miyao[t]=='\0'){t=0;k=(((miwen[i]-97)+26)-(miyao[t]-97))%26;cout<<table[k];}else{k=(((miwen[i]-97)+26)-(miyao[t]-97))%26;cout<<table[k];}t++;}cout<<endl;//cout<<miwen<<endl;//cout<<minwen<<endl;return 0;}int main(){ tt();//char a[8];//for(int i=0;i<7;i++)//cin>>a;//for(int j=0;a[j]!='\0';j++)//cout<<a[j]<<endl;return 0;}实验过程如图所示:实验体会:本次实验是对Vigenere算法的设计,Vigenere算法的原理就是通过26个英文字母之间在密钥的限定下进行转换,而完成的加密。

c语言vigenère密码的综合题

C语言Vigenère密码的综合题一、概述Vigenère密码是一种多表密码,是由法国人布拉瓦·德维热纳于1553年发明的。

它是基于字母表的轮换和偏移来实现加密与解密的。

Vigenère密码算法的核心思想是使用一个密钥串来进行加密和解密操作,相比传统的凯撒密码,Vigenère密码更加安全可靠。

在C语言中实现Vigenère密码算法可以帮助我们更好地了解密码学和算法设计的相关知识。

二、Vigenère密码的原理Vigenère密码算法的核心原理是利用关键词对明文进行分组加密,具体步骤如下:1.确定关键词,将明文和关键词转换为阿拉伯数字表达方式。

2.将关键词复制至与明文长度相等的长度。

3.按照两者的数值进行加法计算。

4.将计算结果对26取模。

5.将计算结果转换为字符形式。

6.将加密后的字符拼接成密文。

三、Vigenère密码的具体实现在C语言中实现Vigenère密码算法需要考虑以下几个关键步骤:1. 输入明文和关键词。

2. 将明文和关键词转换为阿拉伯数字表达方式。

3. 判断明文和关键词的长度以便确定循环加密。

4. 进行加密计算。

5. 输出密文。

四、示例代码下面是一个简单的C语言示例代码,实现了Vigenère密码的加密操作:```c#include <stdio.h>#include <string.h>void encrypt(char* pl本人n, char* key) {int plen = strlen(pl本人n);int klen = strlen(key);for (int i = 0; i < plen; i++) {pl本人n[i] = ((pl本人n[i] - 'A' + key[i klen] - 'A') 26) + 'A'; }}int m本人n() {char pl本人n[100];char key[100];printf("请输入明文:");scanf("s", pl本人n);printf("请输入关键词:");scanf("s", key);encrypt(pl本人n, key);printf("加密后的密文为:s\n", pl本人n);return 0;}```五、总结Vigenère密码算法是一种经典的密码算法,通过使用关键词对明文进行分组加密,可以有效提高密码的安全性。

应用密码学第2章古典密码体制参考答案

第2章 古典密码体制1.当k=5,b=3时,用仿射密码加密这些字符:WO SHI XUESHENG 解:加密公式:c=e(p)=5p+3(mod26)首先转化把这些字母转换成数字:22,14,18,7,8,23,20,4,18,7,4,13,6 然后加密;)26(mod 716231215232514171215219)26(mod 3333333333333613471842023871814225⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡+⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡H Q X M P X Z O R M P V G 所以,加密后为:GV PMR OZXPMXQH 。

2.使用Vigenere 方案,给出密文:ZICVTWQNGRZGVTW A VZHCQYGLMGJ ,找出对应下列明文的密钥:W earediscoveredsaveyourself 。

解:明文:W e a r e d i s c o v e r e d s a v e y o u r s e l f 密文:Z IC VTWQNGR ZGVTWAVZH CQ YGLMGJ 将字幕转化成数字,再计算。

结果密钥为:3 4 2 4 15 19 8 21 43.分析Vigenere 密码体制的安全性,并编程实现Vigenere 密码算法。

解:Vigenere 密码的强度在于对每个明文字母有多个密文字母对应,因此该字母的频率信息是模糊的。

实际上,维吉尼亚(Vigenere )密码是一种多表加密算法,在密文的不同位置出现的字符通常不是以同样的方式加密的,但它是一种周期密码,如果两个同样的字符出现的间隔固定,并且为密钥长度的倍数,则它们将以同样的方法进行加密。

Vigenere密码加密、解密算法实现

Vigenere密码加密、解密算法实现//DsVigenere.cpp 穷举搜索法破解Vigenere#include<iostream>#include<fstream>#include<string>#include<cstdlib> //#include<stdlib.h>#include<windows.h>using namespace std;////data structureconst int pmsize=1000;//the maximum length of the plaintext//int i=0,j=0; //global variablechar p[pmsize]={'\0'},k[100]={'\0'},c[pmsize]={'\0'};//p,k,c memories plainrtext,ciphertext and cipher////preparing before beginingvoid prepare(){cout<<endl;cout<<" "<<"穷举法破解Vigenere密码程序"<<endl;cout<<" "<<"设计者:刘懿"<<endl;cout<<" "<<"[2010.5.23]"<<endl;cout<<"==========================================================="<<endl;//judge whether entering the plaintext&cipher;char judge='Y';cout<<"Please sure wether you have entered the plaintext&cipher"<<endl<<"with the txt form (enter Y/N):";cin>>judge;if(judge=='N'||judge=='n'){cout<<"Please enter the plaintext&cipher with the txt form Firstly!"<<endl;exit(1);}}////init datavoid init(){//read the plaintext&cipher from txt fileifstream ifs1,ifs2;if(!ifs1||!ifs2) //exit program if ifstream could not pen file{cerr<<"File could not be opened"<<endl;exit(1);}ifs1.open("plaintext1.txt");ifs1.read(p,sizeof(p));ifs1.close();ifs2.open("ciphertext1.txt");ifs2.read(c,sizeof(c));ifs2.close();cout<<"The plaintext is:"<<endl<<p<<endl;cout<<"The ciphertext is:"<<endl<<c<<endl;}////Remove spaces in the arrays p&cvoid Rspace(){int i=0,j=0;for(i=0;p[i]!='\0';i++){if(p[i]==' '){for(j=i;p[j+1]!='\0';j++)p[j]=p[j+1];p[j]='\0';}}for(i=0;c[i]!='\0';i++){if(c[i]==' '){for(j=i;c[j+1]!='\0';j++)c[j]=c[j+1];c[j]='\0 ';}}}//Crack the plaintextvoid Dcipher(){int number=0;for(int i=0;p[i]!='\0';i++) //dssolve the keys by brute force{for(int word='a';word<='z';word++){if(c[i]==(word-'a'+(p[i]-'a'))%26+'a'){k[number]=word;number++;}}}for(int flag=1;flag<number;flag++) //delete the repeated cipherif(k[0]==k[flag])k[flag]='\0';}////output the results and delete the plaintext&cipher in the plaintext.txt&key.txtvoid out(){cout<<"The key is:"<<endl<<k<<endl;//ofstream del1("plaintext.txt",ios_base::trunc); //delete the plaintext//ofstream del2("key.txt",ios_base::trunc); //delete the key}///////////////////////////////////////////////////////////int main(){int istart,istop;prepare();istart=GetTickCount();init();Rspace();//Remove spaces in the arraysDcipher();out();istop=GetTickCount();cout<<"Time spent on this program(Except for the course of preparing) is "<<istop-istart<<" ms"<<endl; system("pause");return 0;}密码学实验时写的代码://Vigenere.cpp Vigenere密码加密#include<iostream>#include<fstream>#include<string>#include<cstdlib>#include<windows.h>using namespace std;////data structureconst int pmsize=1000;//the maximum length of the plaintextint i=0,j=0,t=0; //global variablechar p[pmsize]={'\0'},k[100]={'\0'},c[pmsize]={'\0'};//p,k,c memories plainrtext,ciphertext and cipher////preparing before beginingvoid prepare(){cout<<endl;cout<<" "<<"Vigenere加密密码程序"<<endl;cout<<" "<<"设计者:刘懿"<<endl;cout<<" "<<"[2010.5.23]"<<endl;cout<<"========================================================="<<endl;//judge whether entering the plaintext&cipher;char judge='Y';cout<<"Please sure wether you have entered the plaintext&cipher"<<endl<<"with the plaintext.txt&key.txt (enter Y/N):";cin>>judge;if(judge=='N'||judge=='n'){cout<<"Please enter the plaintext&cipher with the txt form Firstly!"<<endl;exit(1);}}////init datavoid init() //read the plaintext&cipher from txt file{ifstream ifs1,ifs2;if(!ifs1||!ifs2) //exit program if ifstream could not pen file{cerr<<"File could not be opened"<<endl;exit(1);}ifs1.open("plaintext.txt");ifs1.read(p,sizeof(p));ifs1.close();ifs2.open("key.txt");ifs2.read(k,sizeof(k));ifs2.close();cout<<"The plaintext is:"<<endl<<p<<endl;}////Remove spaces in the arrays p&kvoid Rspace(){for(i=0;p[i]!='\0';i++){if(p[i]==' '){for(j=i;p[j+1]!='\0';j++)p[j]=p[j+1];p[j]='\0';}}for(i=0;k[i]!='\0';i++){if(k[i]==' '){for(j=i;k[j+1]!='\0';j++)k[j]=k[j+1];k[j]='\0 ';}}}//Encrypt the plaintextvoid Encrypt(){for(i=0;p[i]!='\0';i++) //Encrypt the plaintextc[i]=(k[i%strlen(k)]-'a'+(p[i]-'a'))%26+'a';}////output the results and delete the plaintext&cipher in the plaintext.txt&key.txtvoid out(){cout<<"The ciphertext is:"<<endl<<c<<endl;ofstream del1("plaintext.txt",ios_base::trunc); //delete the plaintextofstream del2("key.txt",ios_base::trunc); //delete the key}///////////////////////////////////////////////////////////int main(){int istart,istop;prepare();istart=GetTickCount();init();Rspace();//Remove spaces in the arraysEncrypt();out();istop=GetTickCount();cout<<"Time spent on this program(Except for the course of preparing) is "<<istop-istart<<" ms"<<endl; system("pause");return 0;}。

[教学设计]Vigenere的编程实现

一、实验目的与意义1、实验目的:通过编程实现vigenere加密,更加深入的了解其原理,掌握vigenere算法。

2、实验意义:验证理论知识,更重要的是通过实验加强实验手段与实践技能,培养分析问题、解决问题、应用知识的能力和创新精神,全面提高综合素质。

十、实验环境操作系统:Windows XP调试软件名称:Microsoft Visual studio版本号:2005上机地点:综合楼208十一、实验的预习内容1、预习内容:1、vigenere cipher加密规则:1)找到一个关键字作为密钥;2)将关键字重复的写在明文上;3)根据vigenere table 找出对应的密文2、解密:1)根据vigenere table找到中对应的字母;2)再看密文字母对应的关键字字母;3)唯一的确定明文字母。

3、关键的代码(如何让3个字母实现类似vigenere table的形式)#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char a[3]={'a','b','c'};char table[3][3];for(int i=0;i<3;i++)for(int j=0;j<3;j++)table[i][j]=a[(j+i)%3];for(int i=0;i<3;i++){for(int j=0;j<3;j++){printf("%c",table[i][j]);}printf("\n");}return 0;}2、实验思路:打出vigenere table->输入关键字->用户输入明文->进行加密>得到密文;解密原理与加密基本相同。

3、程序框图:十二、实验的步骤与调试方法1、实验步骤:(1)建立win32 console applicatio ng工作空间,名为:vigenere_20083612;(2)新建xuvi.cpp源文件;(3)按照实验思路编写源代码,完成之后进行编译、链接、执行;(4)程序执行时按提示输入关键字、明文,验证输出密文,及解密之后输出明文是否正确。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档