仿射加密与S-DES加密算法的实现
仿射加密
#include <iostream>
#include <cstdio> using namespace std;
char letter[30];
char _letter[30];
char ans_letter[30];
int num[30],s_num[100],k1,k2;const int mod=27;
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;return a;
}
int d=exgcd(b,a%b,x,y),t;
t=x;x=y;y=t-a/b*y;
return d;
}
int decode(int key){
int rev,y;
int d=exgcd(k1,mod,rev,y);
return ((((key-k2+mod)%mod)*rev)%mod+mod)%mod;
}
char text[100];
int main(){
for(int i=0;i<26;++i){
letter[i]='A'+i;
}
letter[26]=' ';
letter[27]='\0';char c;int cc=0;
while((c=getchar())!='\n'){
text[cc++]=c;
}
int len=cc;text[len]='\0';
for(int i=0;i<len;++i){
if(text[i]==' ') s_num[i]=26;
else s_num[i]=text[i]-'A';
}
while(~scanf("%d%d",&k1,&k2)){
int x,y;
int d=exgcd(k1,k2,x,y);
if(d!=1) {
printf("k1 and k2 Not coprime!\n");
continue;
}
for(int i=0;i<27;++i){
_letter[i]=letter[num[i]=(k1*i+k2)%mod];
}
_letter[27]='\0';
printf("AFTER LOCK::\n");
for(int i=0;i<len;++i){
printf("%d,",num[s_num[i]]);
}
printf("\n");
printf("TRY SIMPLE DECODE::\n");
for(int i=0;i<len;++i){
printf("%c",letter[num[s_num[i]]]);
}
printf("\n");
printf("AFT GET THE MODNUM AND DECODE::\n");
for(int i=0;i<len;++i){
printf("%c",letter[decode(num[s_num[i]])]);
}
printf("\n");
printf("ith number represent the res which number i after LOCK::\n");
for(int i=0;i<27;++i){
ans_letter[i]=letter[decode(num[i])];
}
ans_letter[27]='\0';
for(int i=0;i<27;++i) printf("%d, ",num[i]);printf("\n");
printf("letter:\n%s\n",letter);
printf("_letter:\n%s\n",_letter);
printf("ans_letter\n%s\n",ans_letter);
}
return 0;
}
S-DES
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int p8[]={6,3,7,4,8,5,10,9};
int p10[]={3,5,2,7,4,10,1,9,8,6};
int p4[]={2,4,3,1};
int ep[]={4,1,2,3,2,3,4,1};
int ip[]={2,6,3,1,4,8,5,7};
int ip_rev[]={4,1,3,5,7,2,8,6};
int S0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
int S1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
int SourceKey[11]={10};
int K1[9]={8};
int K2[9]={8};
int SOURCE_STR[9]={8};
int LOCK_STR[9]={8};
int UNLOCKED_STR[9]={8};
void prt(int a[],int a_len){
for(int i=1;i<=a_len;++i) printf("%d, ",a[i]);printf("\n");
}
void shift(int a[],int len,int offset){
int b[len];
for(int i=0;i<len;++i){
b[i]=a[i+1];
}
for(int i=1;i<=len;++i){
a[i]=b[(i-1+offset)%len];
}
}
void P8(int a[],int &len){
//抽取8位
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
len=8;
for(int i=1;i<=len;++i){
a[i]=b[p8[i-1]];
}
}
void P10(int a[],int len){
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
for(int i=1;i<=len;++i){
a[i]=b[p10[i-1]];
}
}
void P4(int a[],int len){
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
for(int i=1;i<=len;++i){
a[i]=b[p4[i-1]];
}
}
void IP(int a[],int len){
if(len!=8) printf("IP::len must be 8!\n");
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
for(int i=1;i<=len;++i){
a[i]=b[ip[i-1]];
}
}
void IP_REV(int a[],int len){
if(len!=8) printf("IP_REV:len must be 8!\n");
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
for(int i=1;i<=len;++i){
a[i]=b[ip_rev[i-1]];
}
}
void EP(int a[],int &len){
if(len!=4) printf("EP::the len must be 4!\n");
int b[len+1];
for(int i=1;i<=len;++i){
b[i]=a[i];
}
len*=2;
for(int i=1;i<=len;++i){
a[i]=b[ep[i-1]];
}
}
void SW(int a[],int a_len,int b[],int b_len){
if(a_len!=b_len) printf("SW::the a_len must be equal to b_len!\n");
int c[a_len+1];
for(int i=1;i<=a_len;++i){
c[i]=a[i];
}
for(int i=1;i<=a_len;++i){
a[i]=b[i];
}
for(int i=1;i<=a_len;++i){
b[i]=c[i];
}
}
void convert(int a[],int offset,int key){
//从小到大,从高位到低位
if(key==0){
a[offset]=0;a[offset+1]=0;
}
else if(key==1){
a[offset]=0;a[offset+1]=1;
}
else if(key==2){
a[offset]=1;a[offset+1]=0;
}
else if(key==3){
a[offset]=1;a[offset+1]=1;
}
}
void fk(int ming[],int m_len,int K[],int left[],int right[]){
int front[9]={4};
for(int i=1;i<=front[0];++i){
front[i]=ming[i];
left[i]=ming[i];
}
int back[9]={4};
int __EP[9]={4};
for(int i=1;i<=back[0];++i){
back[i]=ming[i+4];
__EP[i]=ming[i+4];
right[i]=ming[i+4];
}
EP(__EP,__EP[0]);
//printf("__EP:: ");prt(__EP,__EP[0]);
//yihuo
if(K[0]!=__EP[0]) printf("fk::len err!\n");
for(int i=1;i<=__EP[0];++i){
__EP[i]=__EP[i]^K[i];
}
//printf("AFT XOR __EP:: ");prt(__EP,__EP[0]);
int __EP1[9]={4},__EP2[9]={4};
for(int i=1;i<=4;++i){
__EP1[i]=__EP[i];
}
for(int i=1;i<=4;++i){
__EP2[i]=__EP[i+4];
}
//printf("__EP1:: ");prt(__EP1,__EP1[0]);
//printf("__EP2:: ");prt(__EP2,__EP2[0]);
int L=S0[(__EP1[1]*2+__EP1[4]*1)][(__EP1[2]*2+__EP1[3]*1)];
int R=S1[(__EP2[1]*2+__EP2[4]*1)][(__EP2[2]*2+__EP2[3]*1)];
//printf("L:%d R:%d\n",L,R);
int cc=0;int _P4[5]={4};
convert(_P4,1,L);convert(_P4,3,R);
//printf("_P4 AFT UNION:: ");prt(_P4,_P4[0]);
P4(_P4,_P4[0]);
//printf("_P4 AFT P4:: ");prt(_P4,_P4[0]);
for(int i=1;i<=4;++i){
front[i]=front[i]^_P4[i];
left[i]=front[i];
}
//printf("left:: ");prt(left,left[0]);
//printf("right:: ");prt(right,right[0]);
} void init_K1_and_K2(int SK[],int K1[],int K2[]){
//sourcekey
int _SK[11]={10};
for(int i=1;i<=10;++i) _SK[i]=SK[i];
P10(_SK,_SK[0]);//forgot
int SKL[6]={5},SKR[6]={5};
for(int i=1;i<=5;++i){
SKL[i]=_SK[i];
}
for(int i=1;i<=5;++i){
SKR[i]=_SK[i+5];
}
shift(SKL,SKL[0],1);shift(SKR,SKR[0],1);
//prt(SKL,SKL[0]);prt(SKR,SKR[0]);
int t_SK[11]={10};
for(int i=1;i<=5;++i) t_SK[i]=SKL[i];
for(int i=6;i<=10;++i) t_SK[i]=SKR[i-5];
//prt(t_SK,t_SK[0]);
P8(t_SK,t_SK[0]);
//prt(t_SK,t_SK[0]);
for(int i=1;i<=8;++i) K1[i]=t_SK[i];
t_SK[0]=10;
shift(SKL,SKL[0],2);shift(SKR,SKR[0],2);
//prt(SKL,SKL[0]);prt(SKR,SKR[0]);
for(int i=1;i<=5;++i) t_SK[i]=SKL[i];
for(int i=6;i<=10;++i) t_SK[i]=SKR[i-5];
//prt(t_SK,t_SK[0]);
P8(t_SK,t_SK[0]);
//prt(t_SK,t_SK[0]);
for(int i=1;i<=8;++i) K2[i]=t_SK[i];
}
void LOCK(int S_STR[],int SK[],int K1[],int K2[]){
init_K1_and_K2(SK,K1,K2);
int T_STR[9]={8};
for(int i=1;i<=8;++i) T_STR[i]=S_STR[i];
IP(T_STR,T_STR[0]);
int left[5]={4},right[5]={4};
fk(T_STR,T_STR[0],K1,left,right);
SW(left,left[0],right,right[0]);
fk(T_STR,T_STR[0],K2,left,right);
int C_STR[9]={8};
for(int i=1;i<=4;++i) C_STR[i]=left[i];
for(int i=5;i<=8;++i) C_STR[i]=right[i-4];
IP_REV(C_STR,C_STR[0]);
for(int i=1;i<=8;++i) LOCK_STR[i]=C_STR[i];
}
void UNLOCK(int S_STR[],int SK[],int K1[],int K2[]){
init_K1_and_K2(SK,K1,K2);
int T_STR[9]={8};
for(int i=1;i<=8;++i) T_STR[i]=S_STR[i];
IP(T_STR,T_STR[0]);
int left[5]={4},right[5]={4};
fk(T_STR,T_STR[0],K2,left,right);//K2
SW(left,left[0],right,right[0]);
fk(T_STR,T_STR[0],K1,left,right);//K1
int C_STR[9]={8};
for(int i=1;i<=4;++i) C_STR[i]=left[i];
for(int i=5;i<=8;++i) C_STR[i]=right[i-4];
IP_REV(C_STR,C_STR[0]);
for(int i=1;i<=8;++i) UNLOCKED_STR[i]=C_STR[i];
}
int main(){
//testShift
// int a[]={0,1,2,3,4};
// shift(a,4,1);
// for(int i=1;i<=4;++i) printf("%d, ",a[i]);printf("\n");
//test p8
// int a[]={10,0,1,2,3,4,5,6,7,8,9};
// P8(a,a[0]);
// for(int i=1;i<=a[0];++i) printf("%d, ",a[i]);printf("\n");
//test SW
// int a[]={4,1,2,3,4};int b[]={4,4,3,2,1};
// int a_len=4,b_len=4;
// SW(a,a_len,b,b_len);
// prt(a,a_len);prt(b,b_len);
//test EP
// int a[9]={4,1,2,3,4};
// EP(a,a[0]);
// prt(a,a[0]);
int i;char s[11];s[0]='#';
printf("input Source_Key:\n");
scanf("%s",s+1);
for(i=1;i<=10;++i) SourceKey[i]=s[i]-'0';
init_K1_and_K2(SourceKey,K1,K2);
prt(K1,K1[0]);prt(K2,K2[0]);
printf("input Mod:\n");
scanf("%s",s+1);
for(i=1;i<=8;++i) SOURCE_STR[i]=s[i]-'0';
// int left[5]={4},right[5]={4};
// fk(SOURCE_STR,8,K1,left,right);
// prt(left,left[0]);prt(right,right[0]);
LOCK(SOURCE_STR,SourceKey,K1,K2);
printf("LOCK_STR:: ");prt(LOCK_STR,LOCK_STR[0]);
UNLOCK(LOCK_STR,SourceKey,K1,K2);
printf("UNLOCKED_STR:: ");prt(UNLOCKED_STR,UNLOCKED_STR[0]);
return 0;
}
仿射加密与S-DES加密算法的实现的更多相关文章
- JAVA使用DES加密算法加密解密
程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数 一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码 properties文件全是unicode编 ...
- 在.NET Core 里使用 BouncyCastle 的DES加密算法
.NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章<使用 JavaScriptService 在.NET Core 里实现DES加密算法>需要用 ...
- 浅谈DES加密算法
一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...
- Java实现文件的RSA和DES加密算法
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密) 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密 ...
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- 对称密码——DES加密算法
前言 本篇博文将介绍对称密码算法中的DES密码的算法原理与代码实现(Java) DES算法原理 DES加密算法是对称加密算法(加密和解密使用同一个密钥)中的一种,DES也是分组密码,以64位为分组对明 ...
- 数据加密算法--详解DES加密算法原理与实现
DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...
- des加密算法java&c#
项目中用到的数据加密方式是ECB模式的DES加密得到的十六进制字符串.技术支持让写一个.net版的加密算法.这里做一下记录. java版: 16进制使用的是bouncycastle. import c ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
随机推荐
- Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析
目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...
- 关于Java客户端连接虚拟机中的Kafka时,无法发送、接收消息的问题
kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案? 1.问题排查 (1)首先通过在服务器上使用命令行来模拟生产.消费数据,发现 ...
- 丢包 ICMP
小结: 1.ICMP 常见网络丢包故障分析及处理 云极安 云极安 2019-12-25 我们在管理维护网络的过程中经常会遇到数据包丢失的现象.使用Ping命令进行连通性测试,则会发现Ping包延时远远 ...
- call by value reference name python既不是按值传递也不是按引用传递 python复制原理 创建新对象 与 改变原对象
按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...
- 浅析 record 使用场景
浅析 record 使用场景 Intro 之前我们有介绍过 record 基本知识,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 record 来解决会非常方便,分享一下 基于值的类 ...
- 莫队/se 优雅的暴力
莫队算法 发明者:队爷莫涛 基于分块的一种暴力算法, 复杂度最慢可以被卡到\(n^2\)正常情况下的复杂度大约在\(O(n\sqrt{n})\)左右分块的大小对复杂的影响很大其中最优分块的大小为\(\ ...
- LOJ2436
题目描述 幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于 ...
- Redis分布式锁升级版RedLock及SpringBoot实现
分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式.但是现在 ...
- centos设系统置语言为中文
[root@host /]# vim /etc/sysconfig/i18n #i18n 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软 ...
- 浅谈OSI参考模型(七层模型)
很多人说"21世纪人类最伟大的发明就是计算机":正是如此,21世纪的今天,计算机正对我们的社会发展和生活起居产生着不可估量的影响:电脑,手机都能上网随时随地了解多彩的世界.但是有时 ...