C语言编程练习题古典密码之旅
古典密码之凯撒密码

古典密码之凯撒密码
实验⽬的
理解掌握凯撒密码的设计原理以及编程实现
实验原理
凯撒密码(Caesar)是⼀种代换密码,他是经典的古典密码算法之⼀,它的基本思想是通过把字母移动⼀定的位数来实现加密和解密。
明⽂中的所有字母都在字母表上向后(或向前)按照⼀个固定数⽬进⾏偏移后被替换成密⽂。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。
由此可见,位数就是凯撒密码加密和解密的密钥。
实验内容
凯撒密码的编程实现
实验环境描述
1、学⽣机与实验室⽹络直连;
2、VPC1与实验室⽹络直连;
3、学⽣机与VPC1物理链路连通;
实验步骤
学⽣登录实验场景的操作
1、学⽣单击 “开始实验”进⼊实验场景,进⼊⽬标主机。
2.运⾏VC++6.0
3.”⽂件“-->“打开⼯作空间”打开c:tools51elab1001BmyCrySubstitude中的myCrySubstitude.dsw⼯程⽂件
4、查看代码并调试运⾏。
5、执⾏⽣成的myCrySubstitude.dsw⽂件
6、运⾏成功后的截图
7、理解凯撒密码实现机制。
古典密码之乘法密码

古典密码之乘法密码实验⽬的熟练掌握多表古典密码简单乘法加密算法原理及实现和应⽤。
实验原理将⽂明内容按照N个字符长度分成不同的分组,在各分组使⽤不同的变换规则,这种⽅式叫做多表替代密码,也是凯撒密码的扩展版本,就是在凯撒密码的基础之上将变换⽅式改变⼀下。
实验内容1、根据多表(双表)古典密码的乘法加密运算的算法,进⾏程序设计,写出加密运算的代码;2、输⼊模q(根据明⽂确定)及加密密钥k1,k2对下列明⽂进⾏加法加密:A graph is finite if both its vertex set and edge set are finite. In this book we study only finite graphs, and so the term ‘graph’always means ‘finite graph’.实验环境描述Windows 7, VC6.0实验步骤学⽣登录实验场景的操作1、学⽣单击 “开始实验”进⼊实验场景,进⼊⽬标主机。
2.找到桌⾯上的Microsoft Visual C++ 6.0,双击打开。
3.新建⼀个C++ Source File,⽂件名为chengfa。
4.写代码。
在⼯作区输⼊代码,如图所⽰。
代码如下:#include#include#include#includemain(){char M[200];char C[200];int K[200],q=26,i,j;srand( (unsigned)time( NULL ) );for(j=0;j<=200;j++){K[j]=rand()%50;}printf("please input chars:n");gets(M);for(i=0;M[i]!='0';i++){if(M[i]>='a'&&M[i]<='z'){C[i]=((M[i]-'a'+1)*K[i])%q+'a';}else if(M[i]>='A'&&M[i]<='Z'){C[i]=((M[i]-'A'+1)*K[i])%q+'A';}elseC[i]=M[i];}C[i]='0';printf("The result is:n%sn",C);getch();return 0; }5.编译、构建与运⾏。
单表古典密码的加密运算-7页文档资料

单表古典密码的加密运算实验目的:1. 熟练掌握单表古典密码加密算法原理及实现;2. 掌握单表古典密码加密算法的应用;实验内容:1、写出单表古典密码的加法加密运算的算法、程序设计;2、写出意表古典密码的乘法加密运算的算法、程序设计;3、输入模q(=12)及加密密钥k(=5)对下列明文进行加法加密和乘法加密:A graph is finite if both its vertex set and edge set are finite.In this book we study only finite graphs, and so the term ‘graph’always means ‘finite graph’.(注:标点符号及空格也算一个符号,忽略大小)4、求出相对应于上述q和k的解密密钥。
实验结果:1.(1)写出单表古典密码的加法加密运算的算法设X=Y=Z q,K=Z q。
对任意m∈X,k∈K,密文q=k(,c K k+=)mm mod)(加法密码的密钥量为q。
Step1:确定k和q的值;Step2:输入相应的密文;Step3:作变换 c=(m+k) mod q,字母用ASCII码变为数字后计算;Step4:得到相对应的明文;Step5:逐一输出明文;(2)单表古典密码的加法加密运算的程序设计如下:#include<iostream.h>void main()int jiami(int q,int k,int i);char m[100],c[100];int i,j,q,k;cout<<"输入模q:";cin>>q;cout<<"输入密钥k:";cin>>k;cout<<"输入"<<q<<"个明文:"<<endl;for(i=0;i<q;i++)cin>>m[i];for(i=0;i<q;i++)j=jiami(q,k,i);c[i]=m[j];cout<<"加密后的密文为:"<<endl;for(i=0;i<q;i++)cout<<m[i];cout<<endl;int jiami(int q,int k,int i)return (i+k)%q;单表古典密码的加法加密运算运行结果如下:2.(1)写出意表古典密码的乘法加密运算的算法:设X=Y=Z q,K=Z*q。
信息安全 实验五 古典密码算法

} else{}; } strcpy(str1,str); for(i=0;i<len;i++) { for(j=0;j<len-i-1;j++) {
if(str1[j]>str1[j+1])
实验五 古典密码算法
实验目的:
通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学 习 密码学奠定基础。
实验环境:
运行 Windows 或 Linux 操作系统的 PC 机,具有 gcc(Linux)、VC(Windows)等 C 语言编 译环境。
实验原理:
古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。 它的主要应用对象是文字信息,利用密码算法进行文字信息的加密和解密。下面介绍两种常 见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1. 替代密码
c[x][i]=b[x][j]; } } } } for(i=0;i<len;i++) { for(j=0;j<len;j++) { if(str[i]==str1[j]) { for(x=0;x<j1;x++) {
d[x][i]=c[x][j]; } } } } cout<<"加密后的密文为:"<<endl; for(i=0;i<len;i++) { for(j=0;j<j1;j++) cout<<d[j][i]<<" "; } cout<<endl;
古典算法加密实验报告

一、实验目的通过本次实验,掌握古典加密算法的基本原理和实现方法,加深对古典加密算法的理解,提高编程能力。
二、实验内容本次实验主要涉及以下古典加密算法:1. 仿射密码2. 单表代替密码3. 维吉尼亚密码三、实验原理1. 仿射密码仿射密码是一种单字母替换密码,其加密原理为将明文进行0~25字母编码,按照加密公式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母。
解密原理与加密原理相反。
2. 单表代替密码单表代替密码的加密原理为利用代替表,将明文中的每个字符映射到密文。
解密原理为对代替表进行反向查找,由密文映射回明文。
3. 维吉尼亚密码维吉尼亚密码的加密原理为通过加密方程Ci = (pi k(i mod m)) mod 26,由明文得到密文。
解密原理为解密过程是加密过程的逆过程,通过解密方程pi = (Ci k(i mod m)) mod 26。
四、实验步骤1. 仿射密码(1)编写加密函数encrypt,输入明文和密钥a、b,输出密文。
(2)编写解密函数decrypt,输入密文和密钥a、b,输出明文。
(3)测试加密和解密函数,验证其正确性。
2. 单表代替密码(1)编写加密函数subencrypt,输入明文和代替表,输出密文。
(2)编写解密函数subdecrypt,输入密文和代替表,输出明文。
(3)测试加密和解密函数,验证其正确性。
3. 维吉尼亚密码(1)编写加密函数vigenereencrypt,输入明文和密钥,输出密文。
(2)编写解密函数vigeneredecrypt,输入密文和密钥,输出明文。
(3)测试加密和解密函数,验证其正确性。
五、实验结果与分析1. 仿射密码通过编写encrypt和解密函数,成功实现了仿射密码的加密和解密过程。
实验结果表明,加密和解密函数运行正常,能够正确转换明文和密文。
2. 单表代替密码通过编写subencrypt和解密函数,成功实现了单表代替密码的加密和解密过程。
古典密码实验报告_博客(3篇)

第1篇引言随着信息安全领域的不断发展,密码学作为其核心内容之一,受到了广泛关注。
古典密码学作为密码学的基础,为我们揭示了加密和解密的基本原理。
本实验旨在通过编程实现古典密码算法,加深对古典密码体制的理解,并为后续学习现代密码学打下坚实基础。
实验目的1. 理解古典密码的基本原理和特点。
2. 掌握替代密码和置换密码的实现方法。
3. 熟悉凯撒密码、维吉尼亚密码、周期置换密码和列置换密码等典型算法。
4. 通过实验,提高编程能力和信息安全意识。
实验环境1. 操作系统:Windows 或 Linux2. 编译环境:gcc(Linux)、VC(Windows)3. 编程语言:C/C++实验内容1. 凯撒密码凯撒密码是一种简单的替换密码,其加密原理是将明文中的每个字母用字母表中后面的第 k 个字母替代。
本实验中,我们实现了凯撒密码的加密和解密过程。
```cinclude <stdio.h>include <string.h>void caesarCipher(char text, int key, int mode) {int i = 0;while (text[i] != '\0') {if (mode == 1) { // 加密if (text[i] >= 'A' && text[i] <= 'Z') {text[i] = 'A' + (text[i] - 'A' + key) % 26;} else if (text[i] >= 'a' && text[i] <= 'z') {text[i] = 'a' + (text[i] - 'a' + key) % 26;}} else if (mode == 2) { // 解密if (text[i] >= 'A' && text[i] <= 'Z') {text[i] = 'A' + (text[i] - 'A' - key + 26) % 26; } else if (text[i] >= 'a' && text[i] <= 'z') {text[i] = 'a' + (text[i] - 'a' - key + 26) % 26; }}i++;}}int main() {char text[] = "Hello, World!";int key = 3;printf("Original Text: %s\n", text);caesarCipher(text, key, 1); // 加密printf("Encrypted Text: %s\n", text);caesarCipher(text, key, 2); // 解密printf("Decrypted Text: %s\n", text);return 0;}```2. 维吉尼亚密码维吉尼亚密码是一种多表替代密码,其加密原理是利用密钥控制替代表。
w栅栏密码c语言代码
w栅栏密码c语言代码栅栏密码是一种常见的古典密码学技术,它通过在明文中插入栅栏字符来隐藏信息。
在栅栏密码中,我们选择一些字符作为栅栏字符,并在明文中插入这些字符作为密码的一部分。
接收者可以通过移除这些栅栏字符来还原原始信息。
栅栏密码的实现需要用到编程语言,特别是C语言。
一、算法概述栅栏密码的基本原理是,通过在明文中插入一些特定的字符(栅栏字符)来形成密码。
这些字符在解密时将被移除,从而恢复原始信息。
在C语言中实现栅栏密码,需要先定义栅栏字符,然后在明文中插入这些字符,生成密码。
解密时,只需移除这些栅栏字符即可。
二、代码实现以下是一个简单的C语言代码实现栅栏密码的例子:```c#include <stdio.h>#include <string.h>// 定义栅栏字符char w_fence = '*';// 函数用于生成密码void generate_code(char* plaintext, char* ciphertext) { int length = strlen(plaintext);for (int i = 0; i < length; i++) {ciphertext[i] = w_fence;}ciphertext[length] = '\0';}// 函数用于解密void decrypt_code(char* ciphertext, char* plaintext) {int length = strlen(ciphertext);for (int i = 0; i < length; i++) {plaintext[i] = ciphertext[i] == w_fence ? ' ' : ciphertext[i];}plaintext[length] = '\0';}int main() {char plaintext[] = "Hello, world!"; // 明文char ciphertext[strlen(plaintext) + 1]; // 密码generate_code(plaintext, ciphertext); // 生成密码printf("Ciphertext: %s\n", ciphertext); // 输出密码char decrypted_text[strlen(plaintext) + 1]; // 解密后的明文decrypt_code(ciphertext, decrypted_text); // 解密printf("Decrypted text: %s\n", decrypted_text); // 输出解密后的明文return 0;}```这段代码首先定义了一个栅栏字符`w_fence`,然后在明文中插入了这个字符,生成了密码。
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密码算法是一种经典的密码算法,通过使用关键词对明文进行分组加密,可以有效提高密码的安全性。
古典密码源代码shi
1:移位密码#include <stdio.h>#include <stdlib.h>void jiami(void);void jiemi(void);int main(void){int n;loop:printf("1:加密\n2:解密\n0:退出\n\n");scanf("%d",&n);getchar();if(n==1){jiami();goto loop;}if(n==2){jiemi();goto loop;}elseexit(0);return 0;}void jiami(void){int a[26],i,j,k,m,n;char b[100]={0},c[100]={0};for(i=97;i<123;i++)a[i-97]=i;printf("请输入明文\n");gets(b);printf("请输入密钥\n");scanf("%d",&k);printf("加密后:");for(j=0;b[j]!='\0';j++){if(b[j]!=' '){m=(b[j]+k-97)%26;printf("%c",a[m]);}}printf("\n");}void jiemi(void){int a[26],i,j,k,m,n;char b[100]={0},c[100]={0};for(i=97;i<123;i++)a[i-97]=i;printf("请输入密文\n");gets(c);printf("请输入密钥\n");scanf("%d",&k);printf("解密后:");for(i=0;c[i]!='\0';i++){if(c[i]-k-97<0)m=(c[i]-k-71)%26;elsem=(c[i]-k-97)%26;printf("%c",a[m]);}printf("\n");}2:仿射密码#include <ctype.h>#include<stdio.h>#include<stdlib.h>void jiami(void);void jiemi(void);int main(void){int oo;loop:printf("加密请输入---- 1\n");printf("解密请输入---- 2\n");printf("退出请输入---- 0\n\n");printf("请输入您的选择:");scanf("%d",&oo);putchar('\n');switch(oo){case 1: jiami();putchar('\n');goto loop;case 2: jiemi();putchar('\n');goto loop;default: exit(0);}return 0;}void jiami(void){char answer,message[1000],ecry[1000];int i,j,k1,k2,k=0,e,r=0;//输入密钥printf("请输入26以内非13的奇数k1以及26以内的任一整数k2\n");scanf("%d%d",&k1,&k2);//输入信息注:信息以'#'结尾printf("请输入要加密的信息,注:信息以'#'结尾\n");for(i=0;(message[i]=getchar())!='#';i++)message[i+1]='\0';message[i]='\0';//加密信息,两种方式(是否保留原非字母字符)printf("加密时是否要保留原信息非字母字符(y/n):");getchar();answer=getchar();if(answer == 'y'){for(i=0;message[i]!='\0';i++){if(!isalpha(message[i])){ecry[i]=message[i];continue;}if(islower(message[i]))e=message[i]-'a';elsee=message[i]-'A';ecry[i] = (e*k1+k2) % 26 + 'a';ecry[i+1]='\0';}}else{for(j=0;message[j]!='\0';j++){if(!isalpha(message[j]))continue;if(islower(message[j]))e=message[j]-'a';elsee=message[j]-'A';ecry[k++] = (e*k1+k2) % 26 + 'a';ecry[k]='\0';}}//输出原信息与加密的信息printf("原信息为:%s",message);putchar('\n');printf("加密后的信息为:%c%s",(answer=='y')? '\0':'\n',ecry);putchar('\n');}void jiemi(void){char answer,ecry[1000],recover[1000];int i,j,k1,k2,kt,k=0,e,r=0;printf("请输入密钥\n");scanf("%d%d",&k1,&k2);getchar();printf("请输入加密后的信息,注:信息以'#'结尾\n");for(i=0;(ecry[i]=getchar())!='#';i++)ecry[i+1]='\0';ecry[i]='\0';getchar();//解密for(i=1;(k1 * i - 1) % 26 != 0;i++);kt = i;printf("加密时是否有保留原信息非字母字符(y/n):"); getchar();answer=getchar();if(answer=='y'){for(i=0;ecry[i]!='\0';i++){if(!isalpha(ecry[i])){recover[i]=ecry[i];continue;}else{ e = ecry[i] - 'a';recover[i]=(e - k2)*kt % 26 +'a';if(recover[i] < 'a')recover[i] +=26;}}recover[i + 1] = '\0';}else{for(i=0;ecry[i]!='\0';i++){e = ecry[i]-'a';recover[i]=(e-k2)*kt % 26 +r +'a';if(recover[i] < 'a')recover[i] +=26;recover[i + 1] = '\0';}}//输出解密信息printf("解密后的信息为:");printf("%c%s",(answer=='y')? '\0':'\n',recover); putchar('\n');}3:Vigenere密码#include <stdio.h>#include <stdlib.h>void jiami(void);void jiemi(void);#include <string.h>#include <ctype.h>int main(){int i;loop:printf("加密请输入---- 1\n");printf("解密请输入---- 2\n");printf("退出请输入---- 0\n\n");printf("请输入您的选择:");scanf("%d",&i);getchar();switch(i){case 1: jiami();goto loop;case 2: jiemi();goto loop;default: exit(0);}return 0;}void jiami(void){ //加密函数char info[2000],code_info[2000];int i,k,j;printf("请输入要加密的信息!\n");gets(info);for(i = 0,k = 0;info[i] != '\0';i ++){ //过滤所有非字母字符if(!isalpha(info[i]))continue;if(isupper(info[i]))info[i] -= 'A' - 'a';info[k ++] = info[i];}info[k] = '\0';char mima[1000]; //得到密码,及密码长度printf("请输入密钥!\n");gets(mima);int mima_long = strlen(mima);for(i = 0;;i += mima_long){ //每mima_long位infomation进行移位加密if(strlen(info + i) > mima_long)for(j = 0;j < mima_long;j ++){code_info[i +j] = (info[i + j] - 'a' + mima[j] - 'a') % 26 + 'a';}else{for(k = i;info[k] != '\0';k ++)code_info[k] = (info[k] - 'a' + mima[k - i] - 'a') % 26 + 'a';code_info[k] = '\0';break;}}printf("加密后的信息为:\n");puts(code_info);putchar('\n');}void jiemi(void){ //解密函数char code_info[2000];char mima[1000];char recover[2000];int i,j,k;printf("请输入加密后的信息!\n");gets(code_info);printf("请输入密钥!\n");gets(mima);int mima_long = strlen(mima);for(i = 0;;i += mima_long){ //对每mima_long位加密信息进行反移位解密if(strlen(code_info + i) > mima_long)for(j = 0;j < mima_long;j ++){recover[i +j] = (code_info[i + j] - mima[j] + 26) % 26 + 'a';}else{for(k = i;code_info[k] != '\0';k ++){recover[k] = (code_info[k] - mima[k - i] + 26) % 26 + 'a';}recover[k] = '\0';break;}}printf("解密后的信息为:\n");puts(recover);putchar('\n');}break;}}return miyao;}int jiami(void){char info[info_max];char c_info[info_max];char miyao[1000];puts("请输入要加密的信息!");gets(info);putchar('\n');puts("请输入密钥!");gets(miyao);putchar('\n');char *mima;mima = yy(miyao); //把密钥转换为终极密码int i;for(i = 0;info[i] != '\0';i ++){if(isupper(info[i]))info[i] -= 'A' - 'a';if(isalpha(info[i]))c_info[i] = mima[info[i] - 'a'];elsec_info[i] = info[i];}c_info[i] = '\0';puts("加密后的信息为:");puts(c_info);putchar('\n');return 0;}int jiemi(){char c_info[info_max];char miyao[1000];char info[info_max];puts("请输入密钥:");gets(miyao);putchar('\n');char *mima;mima = yy(miyao);puts("请输入密文!");gets(c_info);putchar('\n');int i,j;for(i = 0;c_info[i] != '\0';i ++){if(isalpha(c_info[i])){for(j = 0;c_info[i] != *(mima + j);j ++)continue;info[i] = j + 'a';}elseinfo[i] = c_info[i];}info[i] = '\0';puts("原信息为:");puts(info);putchar('\n');return 0;}。
C语言经典程序100题(完整版)
C语言经典程序100题(完整版)-CAL-FENGHAI.-(YICAI)-Company One1【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数都是多少程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
#include "stdio.h"#include "conio.h"main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}getch();}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
#include "stdio.h"#include "conio.h"main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0. 1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);getch();}==============================================================【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。