-
2021-05-20 10:12:36
c语言实现置换密码
//单置换密码的编程实现(C++)
//作者信息:
//
//本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档,
//该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改
//文档格式的要求:文档总共包含两行。第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥
//第二行仅包含一个字符串,这个字符串是需要加密或解密的内容。
//该程序运行结果直接由控制台输出
运行结果:
#include
#include
#include
using namespace std;
ifstream in("密码学.txt");
void JiaMi(char ZhiHuan[]); //加密函数
void JieMi(char ZhiHuan[]); //解密函数
void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]); //设置置换表函数
int main()
{
int m; //确定是加密或解密?加密为1,解密为2
char ZhiHuanBiao['z'+1]; //正向置换表,加密时用
char fanZhiHuanBiao['Z'+1]; //反向置换表,解密时用
cout<
in>>m; //读入m
setZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //设置置换表
switch(m) //判断m值,执行相应的功能
{
case 1: JiaMi(ZhiHuanBiao);break;
case 2: JieMi(fanZhiHuanBiao);break;
default:break;
}
return 0;
}
void JiaMi(char ZhiHuan[]) //加密
{
string MingWen; //保存明文
cout<
getline(in,MingWen); //读入明文
cout<
cout<
for(int i=0; i
{
if(MingWen[i]>='a' && MingWen[i]<='z')
cout<
else cout<
}
cout<
}
void JieMi(char fanZhiHuan[])
{
string MiWen; //保存密文
cout<
getline(in,MiWen); //读入密文
cout<
cout<
for(int i=0; i
{
if(MiWen[i]>='A' && MiWen[i]<='Z')
cout<
else cout<
}
cout<
}
void setZhiHuan(char Zhi
更多相关内容 -
java实现置换密码加密解密
2020-08-26 05:20:10主要为大家详细介绍了java实现置换密码加密解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
C语言实现加密解密功能
2020-12-20 19:48:22接下来以 c 语言 为例讲解一种简单的加密解密以及暴力破解字符串的方法,带您走进加密解密技术的大门。 先讲一下凯撒加密,凯撒密码相传是古罗马凯撒大帝用来保护重要军情的加密系统。它是一种置换密码,通过将字母... -
python置换加密解密算法原理实现,课程设计报告置换加密解密文件读写
2022-03-07 23:34:15python实验,置换加密解密算法原理实现,文件读取修改,课程实验 置换密码加密解密过程,设明文为:4D 61 65 53 2D 4F 69 20 4E。密钥为8,1,6,3,5,7,4,9,2。求加密后的16进制密文。先思考和描述算法,也就是对明文4D ...实验原理与内容:
置换密码加密解密过程
设明文为:4D 61 65 53 2D 4F 69 20 4E。密钥为8,1,6,3,5,7,4,9,2。 求加密后的16进制密文。先思考和描述算法,也就是对明文4D 61 65 53 2D 4F 69 20 4E实现置换8,1,6,3,5,7,4,9,2。通过对数组赋值实现:
m(i)={4D 61 65 53 2D 4F 69 20 4E},i=1,2,3,…,9。
k(i)={8,1,6,3,5,7,4,9,2},i=1,2,3,…,9。
c(i)=m(k(i)), i=1,2,3,…,9。
c(1),c(2),…,c(9)为密文。
密文序列为:20 4D 4F 65 2D 69 53 4E 61。这样可以推广到任意置换。
要求:
实现加密解密并在文件里读入与修改,效果在文件里展示
根据本人对题目的理解想出的方法
思路:
置换密码是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的所有字符不变,只是利用置换打乱了。将文件里的数据读入,并根据密钥的值进行放到相应的位置,最后将数据倒序即完成题意
置换加密代码:
f = open(r"C:\Users\hanhu\Desktop\加密解密\明文.txt", "r") textt=f.read().split() f.close() key=input().split(',') k="" for i in key: c=str(textt[int(i)-1]) k+=c+' ' k=k[:-1] f = open(r"C:\Users\hanhu\Desktop\加密解密\密文.txt", "w") f.write(k) f.close()
演示:
运行输入密钥
运行结果
置换解密代码:
思路:
读入文件内容,按照密钥值对应密文下标将它们顺序存放,再将它们倒序,但在此为了练习用了字典的方法
f = open(r"C:\Users\hanhu\Desktop\加密解密\密文.txt", "r") a=f.read().split() f.close() b=list(map(int,input().split(','))) c=dict.fromkeys(b) k="" for i in range(len(a)): c[b[i]]=a[i] for i in range(1,len(a)+1): d=str(c[i]) k+=d+' ' k=k[:-1] f = open(r"C:\Users\hanhu\Desktop\加密解密\明文.txt", "w") f.write(k) f.close()
演示:
代码执行
运行结果会在文件里直接改变
open() 方法:
open(file, mode='r')
使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
模式:
#读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式
如:'rb','wb','r+b'等等读写模式的类型有:
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w 以写方式打开,
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )字典的创建:dict()
此处dict.fromkeys(b)的用法是创建键值,但我的值是列表所以,创建key:另一半滞空,
随后在下面用赋值方法为字典添加键值对,
后来发现可以不用预先创key,直接c[b[i]]=a[i](赋值方式就可以创建),而dict.fromkeys(seq)
seq正确的参值是(a,b)
-
des加密算法(c语言版)
2021-05-19 07:51:39#include#include#include"tables.h"//数据表//置换函数//参数: In:待置换数据指针//Out:置换输出指针// n:置换表长度//P:置换表指针//说明:将输入数据的指定位置做为输出数据的第i位。指定位置即置换表第i位的...#include
#include
#include"tables.h"//数据表
//置换函数
//参数: In:待置换数据指针
//Out:置换输出指针
// n:置换表长度
//P:置换表指针
//说明:将输入数据的指定位置做为输出数据的第i位。指定位置即置换表第i位的十进制数。获得的输出数据的长度
//即为置换表的长度。
void myPermutation(char *In,char *Out,int n,char *P)
{
int i=0;
for(i=0; i
*(Out+i)=*(In+*(P+i)-1);
*(Out+i)='\0';
}
//按位异或函数
//参数:In1:二进制串1
//In2:二进制串2
//n:二进制串长度
// Out:异或结果
//说明:循环比较两个二进制串每一位,不一样则为'1',相同则为'0'
void myXOR(char* In1,char* In2,int n,char* Out)
{
int i=0;
for(i=0; i
*(In1+i)!=*(In2+i) ? *(Out+i)='1' : *(Out+i)='0';
}
//循环左移函数
//参数: In:待移位二进制串
// Out:移位后二进制串
//n:二进制串长度
//s:循环位数
//说明:将输入二进制串移位后对应位置的值赋给输出串,为保证循环(即原二进制串的第一位变成移位后的
//最后一位),将位次相加后与串的长度作模运算。
void myShift(char *In,char *Out,int n,int s)
{
int i=0;
for(i=0; i
*(Out+i)=*(In+(s+i)%n);
*(Out+i)='\0';
}
//生成子密钥函数
//参数: K:64位的密钥
//(*SK)[49]:获得的一轮子密钥
//说明:输入64位密钥,进行置换选择1,以后进行16轮操做获得16个子密钥,每一轮对56位分红两部分,
//进行相应位数的移位操做,以后再拼接成56位进行置换选择2,获得该轮子密钥
void mySubkey(char* K,char (*SK)[49])
{
char out[57],C[57],D[29],e[29],t[57];
int i=0,j=0;
myPermutation(K,out,56,*PC_1); //置换选择1
strcpy(C,out); //C0
strcpy(D,out+28); //D0
for(j=0; j<16; j++)
{
myShift(C,e,28,move_time[j]); //循环左移
strcpy(C,e); //Cj
myShift(D,e,28,move_time[j]);
strcpy(D,e); //Dj
strncpy(t, C, 28);
strncpy(t+28, D, 28);
myPermutation(t,*(SK+j),48,*PC_2);//置换选择2,获得Kj
}
}
//轮函数f
//参数: L: 第t轮的32位L
//R: 第t轮的32位R
//SK: 第t轮的48位子密钥
//t: 轮数
//说明:共进行16轮操做,每轮的32位R先进行拓展置换E变成48位,再与该轮子密钥异或,而后分红
//8组进行S盒代换。每组经过第1,6位组成的二进制串肯定S盒行号,经过第2,3,4,5位肯定列号,
//找到对应的数并转为4位二进制串。8组代换拼接成32位为S盒代换结果,而后进行置换P。每轮通过
//S盒代换获得的结果与上一轮的L异或做为本轮的R,上一轮的R做为本轮的L。
void myf(char* L,char* R,char* SK,int t)
{
int i=0,j=0;
int row,col;
char out1[49]= {0},out2[49]= {0},out3[33]= {0},out4[33]= {0},temp[33]= {0};
printf("K%d=",t+1);
puts(SK);
myPermutation(R,out1,48,*E); //扩展置换E
printf("E(R%d)=",t);
puts(out1);
myXOR(out1,SK,48,out2); //与子密钥异或
printf("E(R%d)^K%d=",t,t+1);
puts(out2);
for(i=0; i<8; i++) //S盒代换
{
row = ((out2[i*6]-'0')<<1)+(out2[i*6+5]-'0'); //第1,6位组成行号
col = ((out2[i*6+1]-'0')<<3)+((out2[i*6+2]-'0')<<2)+((out2[i*6+3]-'0')<<1)
+(out2[i*6+4]-'0'); //第2,3,4,5位组成列号
for(j=3; j>=0; j--)
*(out3+(i*4+3-j))=((S_Box[i][row*16+col]>>j)&1)+'0'; //将取到的S盒数据填到S盒输出的指定位置,先进行十进制转二进制
}
*(out3+32)='\0';
printf("%d轮S盒输出=",t+1);
puts(out3);
myPermutation(out3,out4,32,*P); //置换P
printf("f(R%d,K%d)=",t,t+1);
puts(out4);
strcpy(temp,R); //保存旧的R
myXOR(L,out4,32,R); //更新R
printf("R%d=",t+1);
puts(R);
strcpy(L,temp); //更新L
}
//主函数:
//说明:输入64位明文,先进行初始置换IP操做,接下来将置换输出的 64 位数据分红左右两半,左一半称为 L0 ,
//右一半称为 R0 ,各 32 位。而后进行16轮迭代,迭代过程我和轮函数写在了一块儿。迭代完成后再经逆IP置换获得密文。
int main()
{
char* M="0000000100100011010001010110011110001001101010111100110111101111";
char* K="0001001100110100010101110111100110011011101111001101111111110001";
char out[65],L[33],R[33],SK[16][49],cipher[65];
int i=0;
mySubkey(K,SK); //产生16轮子密钥
myPermutation(M,out,64,*IP); //初始置换IP
printf("IP置换:");
puts(out);
strcpy(L,out); //L0
strcpy(R,out+32); //R0
for(i=0; i<16; i++)
{
printf("\n-------------------------------第%d轮------------------------------------\n"
,i+1);
myf(L,R,*(SK+i),i);
}
strncpy(out, R, 32); //L16 + R16
strncpy(out+32, L, 32);
myPermutation(out,cipher,64,*C_IP); //逆IP置换
printf("\n密文:");
puts(cipher);
return 0;
}
-
替代密码和置换密码地C语言实现.pdf
2020-06-23 14:41:56替代密码和置换密码的实现 二实验目的 通过编程实现替代密码算法和置换密码算法加深对古典密码体系的 了解为以后深入学习密码学奠定基础 三实验内容 A 替代密码 1 实验原理使用替代法进行加密将明文中的字符用其他... -
置换加密法
2017-11-30 08:58:43置换加密算法是最简单的加密算法,其原理是将一个字母表中的字符替换成另一个字母表中的字符。这种形式的加密算法,已经存在2000多年的历史了。 输入 输入文件中第一行是原文用的字母表,第2行是密文用的字母表。...题目描述
置换加密算法是最简单的加密算法,其原理是将一个字母表中的字符替换成另一个字母表中的字符。这种形式的加密算法,已经存在2000多年的历史了。
输入
输入文件中第一行是原文用的字母表,第2行是密文用的字母表。接下来有若干行,每一行是待加密的原文,每一行都不超过64个字符。
输出
输出第1行是密文用的字母表,第2行是原文用的字母表。接下来的每一行是将输入文件中对应行加密后得到的密文字符串,原文字母表中没有的字符不用替换。
样例输入
abcedfghijklmnopqrstuvwxyz zyxwvutsrqponmlkjihgfdecba Shar's Birthday: The birthday is October 6th,but the party will be Saturday, October 5. It's my 24th birthday and the first one in some
样例输出
zyxwvutsrqponmlkjihgfdecba abcedfghijklmnopqrstuvwxyz Sszi'h Brigsvzb: Tsw yrigsvzb rh Oxglywi 6gs,yfg gsw kzigb eroo yw Szgfivzb, Oxglywi 5. Ig'h nb 24gs yrigsvzb zmv gsw urihg lmw rm hlnw
下面是我第一次写的代码
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int main() { char a[26],b[26],c[64]; gets(a); gets(b); puts(b); puts(a); while(gets(c)) { for(int i=0;i<strlen(c);i++) { for(int j=0;j<strlen(a);j++) if(c[i]==a[j])c[i]=b[j]; } cout<<c<<endl; } return 0; }
运行结果是
可以看出答案错误,部分字母转化但部分和原来相同,我原来一直思考是不是没转化,其实只是二次转化了
下面是我修改过后的代码
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; int main() { char a[26],b[26],c[64]; gets(a); gets(b); puts(b); puts(a); while(gets(c)) { for(int i=0;i<strlen(c);i++) { for(int j=0;j<strlen(a);j++) if(c[i]==a[j]) { c[i]=b[j]; break; } cout<<c[i]; } cout<<endl; } return 0; }
很明显当在原文中找到并转化过后我并没有及时用break跳出循环导致转化过后的字母继续在原文中查找,导致答案错误。 -
图像置换加密
2021-11-27 21:11:19之前实训学习了如何对字符进行加密,其实图像也可以加密,如下图所示。 其中,% 表示求余运算,a 和 b 是此加密方法的密钥,在本关,a 取 1、b 取 2。 任务 本关任务是实现函数enImg(path1, path2)函数,其... -
数据加密——列置换加密
2021-10-06 11:27:40数据加密——列置换加密 刚刚在做计算机网络原理真题中有个这样的题,考到了列置换加密,记录一下自己的理解。 列置换加密,概念性的东西就不说了,网上都有,直接写我自己的理解,干货。 从明文 ———— 密文 ... -
古典置换加密解密
2021-01-21 23:51:16将密文分组,分组组数= 密文长度/密钥长度,每组中的字符按照密钥中的序列排序。例如: 加密: message:thisiscipher secret key:312(密钥为数字,最大数字默认为密钥长度,密钥中各位数字不同) 组数:... -
128位AES加密算法C语言实现
2020-11-26 23:30:14用C语言实现的128位AES加密算法,可以运行在JAVA的JNI 中AIS加密算法c语言实现代码 nt cnt for(ent =0: cnt< 8: cnt++) BvtcToBit(*(ch+cnt), bit+(ent<<3)) return /将二进制位串转为长度为8的字符串水 ... -
置换密钥矩阵加密算法的改进 (2008年)
2021-05-20 09:02:21提出了对分组加密算法(RKM)的改进,主要包括密钥进化算法、特征因子子矩阵和密钥的分发与更新算法。密钥进化算法是特征因子子矩阵生成算法和密钥分发与更新算法的基本组件,由一个16字节的单字节数组(称为进化... -
置换加密算法 C++实现
2018-12-30 16:15:51写了一遍感觉其实就是栅栏加密的升级版 在栅栏算法的基础上 在按列读取的时候 用的是key数组的读取顺序 比如是这样的话: 置换矩阵key 1 2 3 2 3 1 则 第一次读取key[1]即第二列 第二次读取... -
信息安全的古典加密之替代加密算法和置换加密算法C/C++实现
2012-04-30 12:10:18使用C/C++实现了古典加密的替代加密和置换加密,经过测试,功能还算强大,替代加密可以处理任意字符串的加解密操作,置换加密算法可以处理任意的key和任意的明文加密与密文解密。 -
C语言实现数据加密算法.doc
2021-05-24 04:57:03C语言实现数据加密算法/*-------------------------------------------------------Data Encryption Standard 56位密钥加密64位数据2011.10--------------------------------------------------------*/#include #... -
C语言置换密码
2020-09-02 18:34:22置换密码:将明文按照密钥的长度为一行排成矩阵,不足用其他字符补齐,再按密钥的顺序重新排列每一列,按竖排读出得到密文 例子: 明文:Beijing2008OlympicGames 密钥:421365 用$补齐矩阵 明文的矩阵: B e i j i ... -
c++行置换加密
2021-11-15 17:26:39//置换的密钥 char keyCh1[25]; //置换的密钥2 char keyCh2[25]; //判断是第几小 char judgeIndex(char keyCh2[], int j) { char choice = '0'; //循环一遍,如果有小于keyCh1[j]的choice就加一 for (int i = 0; ... -
替代密码和置换密码的C语言实现
2021-05-19 04:29:40《替代密码和置换密码的C语言实现》由会员分享,可在线阅读,更多相关《替代密码和置换密码的C语言...三、实验内容:A:替代密码1、实验原理:使用替代法进行加密,将明文中的字符用其他字符替代后形成密文。最早... -
华为机试HJ36字符串加密
2021-07-13 23:39:22HJ36字符串加密-Python题目解题思路...3、第二行,加密内容,逐个字符处理,符合密钥对应关系的进行置换,不符合的保持原字符。最后,输出加密后的字符串 代码 def func(): ki = input() ki2 = "" k = "" an = -
JAVA实现置换加密和幻方加密(密码学)
2021-12-24 17:22:26帮助学生掌握置换密码的加密解密过程,能够利用所学过的编程语言,熟悉加密算法流程与编程实现加密算法。使学生掌握编程实现实际问题中的方法,提高专业技能和专业素养。 要求学生掌握算法的程序实现的方法,能应用... -
Python实现对字符串的加密解密方法示例
2021-01-13 08:12:28本文实例讲述了Python实现对字符串的加密解密方法。,具体如下:需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错。安装PyCrypto,可以用AES和DES。我... -
古典加密算法之置换密码和代换密码
2019-02-02 00:55:44自己写的 呵呵 希望支持 信息安全 古典加密算法------置换密码 古典加密算法------代换密码------乘数密码 -
字符串加密与解密_一种可以用在程序加密的功能
2021-08-27 21:05:38本篇博客会有两篇代码,均为C# 编写而成。...密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES(Data Encrypti -
[古典密码]移位置换加密算法
2020-09-19 19:22:44双方约定一段特定字符串,去除字符串中的重复项(去重后的字符串个数<=26)。将字母表从A~Z对应去重后的字符串,制成新顺序字母表,供双方通信(若新字母表个数不足26个字母,则用A ~ Z顺序字母表填补空缺)。 例... -
字符串加密(字符串和数组)
2019-12-03 09:23:15(2)置换法:改变原来字符串中字母的顺序,比如将顺序<2 3 1>应用到ABC上得到的密文为BCA。(顺序<2 3 1>指将原字符串的第2个字符作为新字符串的第1个字符,将原字符串的第3个字符作为新字符串的... -
替代密码和置换密码的C语言实现剖析
2021-05-24 00:42:28三、实验内容:A:替代密码1、实验原理:使用替代法进行加密,将明文中的字符用其他字符替代后形成密文。最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可... -
周期置换密码的加密操作原理
2021-03-15 17:44:23置换密码: 是指把明文中各字符的位置序列重新排列来得到密文的...Q: 假设明文是“Data security is very important”, 按密钥“4,3,1,2” 进行周期置换加密, 求加密后的密文? 【周期置换加密的解题思路】 ①按 -
易位法字符串加密
2022-01-11 15:58:30**题目描述:**易位法字符串加密 密码学是一门既古老又年轻的学科。说它古老,是因为早在几千年前,人类就已经有了通信保密的思想,并先后出现了易位法和置换法等加密方法。到了1949年,信息论的创始人香农(C.E....