仿射加密与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 ...
随机推荐
- LSTM+CRF进行序列标注
为什么使用LSTM+CRF进行序列标注 直接使用LSTM进行序列标注时只考虑了输入序列的信息,即单词信息,没有考虑输出信息,即标签信息,这样无法对标签信息进行建模,所以在LSTM的基础上引入一个标签转 ...
- const关键字:终于拥有真正的常量声明语句
本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...
- mybatis-plubs条件构造器中的方法所对应的sql语法
[通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...
- JS获取本机地址,生成地图
dome代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 前端面试准备笔记之JavaScript(01)
1.1 typeof 能判断哪些类型? typeof可以识别所有的值类型 typeof可以识别函数 //function typeof可以判断是否是引用类型(不可以再细分) //object 1.2 ...
- LVS负载均衡IP隧道模式原理介绍以及配置实战
LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...
- Java Optional使用指南
提到NullPointerException(简称NPE)异常,相信每个Java开发人员都不陌生,从接触编程的第1天起,它就和我们如影随形,最近处理的线上bug中,有不少都是对象没判空导致的NullP ...
- Compile-time Dependency Injection With Go Cloud's Wire 编译时依赖注入 运行时依赖注入
Compile-time Dependency Injection With Go Cloud's Wire - The Go Blog https://blog.golang.org/wire Co ...
- 为什么要使用 do while(0)?
两点 避免宏定义的花括号对代码的完整性造成影响 可以在指定的代码块中(do{})使用break提前跳出,避免goto.
- JavaWeb——EL及JSTL学习总结
什么是EL表达式 为什么需要EL EL的主要作用 EL的语法 EL的开发步骤 EL实例练习 EL中的运算符 EL表达式显示内容的特点 EL的特点 EL隐式对象 EL隐式对象介绍 隐式对象实例练习 什么 ...