仿射加密与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 ...
随机推荐
- 性能测试工具locust简单应用
简介 Locust是一种易于使用的分布式用户负载测试工具.可用于对网站(或系统)负载测试,并依据响应数据计算出系统支持的并发用户数. 安装及调试(以下操作在windows环境下进行) Locust基于 ...
- JS实现鼠标移入DIV随机变换颜色
今天分享一个在 JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用. 代码如下: <!DOCTYPE html> <html> <head ...
- 从软件(Java/hotspot/Linux)到硬件(硬件架构)分析互斥操作的本质
先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问. 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬 ...
- Windows Server 2008 R2系统安装
把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...
- ADB命令连接逍遥模拟器
注:打开模拟器开发者模式 ->USB调试模式 1.先进入逍遥模拟器安装目录(MEmu文件夹下),如:D:\Program Files\Microvirt\MEmu 2.在CMD下输入:adb c ...
- 第一个 Maven 应用程序
概述 使用 Maven 创建一个 Java Web 应用程序 创建 Maven 项目 选择 File -> New -> Project... 选择 Maven 项目 填写项目信息 选择工 ...
- Go Code Review Comments
Go Code Review Comments https://golang.org/wiki/CodeReviewComments
- http 和 https 有何区别?如何灵活使用?
http是HTTP协议运行在TCP之上.所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份. https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上.所有传输的内容都经 ...
- Java——StringBuffer,String总结
StringBuffer介绍: Java StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类. Strin ...
- 调用ajax 跨域调用接口
//ajax 跨域请求数据 function ajaxType (){ $.ajax({ url: "http://127.0.0.1:9090/spring_mvc/HttpClient/ ...