一个非常简陋的基于LFSR和Feistel网络的加解密运算,有位处理。C

刚布置的热乎作业,马上就写了。。

如果是正在做这个作业的同学搜到别抄,写得垃圾不要抄不要抄不要抄,

特别是吉大的同学,谢谢= =

  1 #include<stdio.h>
  2 #include<math.h>
  3 #define N 128
  4 #define index int
  5
  6
  7 void FFunc(char *Result, char *R, char key,int len)
  8 {
  9     char temp=(Result[0]&0x00000001)^(key&0x00000001) ;
 10     for(int i=1;i<len;i++)
 11         Result[i]=R[i-1];
 12     R[0]=temp;
 13 }
 14
 15 bool compare(char*st1,char*st2,int len)
 16 {
 17     for(int i=0;i<len;i++)
 18         if(st1!=st2) return 0;
 19 }
 20 void OrFunc(char* Result,char *A,char *B,int len)
 21 {
 22     for(index i=0;i<len;i++)
 23         Result[i]=(A[i]&0x00000001)^(B[i]&0x00000001);
 24 }
 25
 26
 27 //复制 A[iA:iA+len-1]=B[iB:iB+len-1]
 28 void strCopy(char *A, int iA, char *B, int iB, int len)
 29 {
 30     char*p = &A[iA], *q = &B[iB];
 31     while(len--) *p++ = *q++;
 32 }
 33
 34
 35 void strOutput(char* str,int len)
 36 {
 37     for(int i=0;i<len;i++)
 38         printf("%d",str[i]);
 39 }
 40
 41 void Reverse(char* str1, char*str2,int len)
 42 {
 43     for(int i=0;i<len;i++)
 44         str1[i]=str2[len-i-1];
 45 }
 46
 47
 48 void getLFSR_8(char *outString,index n)//生成n长M序列
 49 {
 50     char X[8] ={0,1,0,0,0,0,0,1};
 51     for(index i=0;i<8;i++) outString[i]=X[i];
 52     for(index i=8;i<n;i++)
 53     {
 54         outString[i] = X[7]^X[3]^X[0];
 55         for(index j=7;j>0;j--)
 56             X[j] = X[j-1];
 57         X[0] = outString[i];
 58     }
 59 }
 60
 61
 62 void getKey(char *key)//生成密钥
 63 {
 64     char temp[64];
 65     getLFSR_8(temp,64);
 66     for(index i=34,j=0;i<50;i++,j++)
 67     {
 68         key[j]=temp[i];
 69     }
 70 }
 71
 72
 73 void tranStrToBit(int length, char* sStr, /*out*/char* sNum)
 74 {
 75     index iStr=0,iBit=0,k=0;
 76     char cOut=0;
 77
 78     for(iStr=0; iStr+7<length; iStr+=8)
 79     {
 80         // 每八位转化成一个unsigned char
 81         for(iBit=0; iBit<8; iBit++)
 82             cOut |= sStr[iStr+iBit]<<(7-iBit);
 83         sNum[k++] = cOut;
 84         cOut = 0;
 85     }
 86     if(iStr==length) return;
 87
 88     //处理最后剩下的,不足则补全为0
 89     cOut = 0;
 90     for(iBit=0; iStr<length; iStr++,iBit++)
 91         cOut |= sStr[iStr+iBit]<<(7-iBit);
 92 }
 93
 94
 95 void tranBitToStr(int codelength, char* sNum, /*out*/char* sStr)
 96 {
 97     index k=0;
 98     int  strLengtha = codelength/8.0;
 99     index icoded=0;
100     unsigned char cTmp;
101     unsigned char flag=0x80;//10000000
102     while(k<strLengtha)
103     {
104         flag = 0x80;
105         cTmp = (unsigned char)sNum[k++];
106         for(index i=0; i<8; ++i,++icoded)
107         {
108             if(cTmp & flag)
109                 sStr[icoded] = 1;
110             else sStr[icoded] = 0;
111             flag = flag >> 1;
112         }
113
114     }
115 }
116
117
118 void FeistailEncry(char* Result,int length,char* Key,char *Clear)
119 {
120     if(length%2 != 0) {printf("异常\n");return;}
121     int w = length/2;
122     char R[w], L[w];
123     char TempF[w];
124     char TempL[w];
125
126     strCopy(L, 0, Clear, 0, w);
127     strCopy(R, 0, Clear, w, w);
128     strOutput(L,w);strOutput(R,w);
129     for(int turn=1; turn<17; turn++)
130     {
131         strCopy(TempL,0,L,0,w);
132         strCopy(L, 0, R, 0, w);//L=Ri-1
133         FFunc(TempF, R, Key[turn-1],w);
134         OrFunc(R, TempL, TempF, w);
135         printf("\n第%d轮后:\n",turn);
136         strOutput(L,w);strOutput(R,w);
137     }
138     strCopy(Result,0,R,0,w);
139     strCopy(Result,w,L,0,w);
140     printf("\n输出为:\n");
141     strOutput(Result,length);
142 }
143
144
145
146 int main()
147 {
148     char sKey[16];
149     char sKey_16[2];
150     char sKey_reverse[16];
151     char sClearString[N];
152     char sClearString1[N];
153     char sCipherString[N];
154     char sCipherString1[N];
155     char sClearText[17];
156     char sCipherText[17];
157     char sClearText1[17];
158
159     getKey(sKey);
160     tranStrToBit(16,sKey,sKey_16);
161     printf("生成密钥为:\n\t");
162     for(int i=0;i<16;i++)
163         printf("%d",sKey[i]);
164
165     printf("\n请输入明文: \n\t");
166     scanf("%s",&sClearText);
167     printf("\n正在加密……\n");
168     tranBitToStr(N,sClearText,sClearString);
169     strOutput(sClearString,N);
170     FeistailEncry(sCipherString,N,sKey,sClearString);
171     printf("加密结果为:\n\t");
172     tranStrToBit(N,sCipherString,sCipherText);
173     sCipherText[17]=‘\n‘;
174     printf("%s",sCipherText);
175
176     getchar();
177     getchar();
178     printf("\n\n正在解密……\n");
179     tranBitToStr(N,sCipherText,sCipherString1);
180     FeistailEncry(sClearString1,N,sKey_reverse,sCipherString1);
181     tranStrToBit(N,sClearString1,sClearText1);
182     sClearText1[17]=‘\n‘;
183     printf("\n解密结果:\n\t%s\n",sClearText);
184 }  

时间: 2024-10-07 07:06:49

一个非常简陋的基于LFSR和Feistel网络的加解密运算,有位处理。C的相关文章

基于python3.5的 rsa+base64加解密

python3.5.3的版本.需要先生成一个私钥,然后放入这里面即可. 这个有个地方需要注意的是: 加密阶段,我们base64 第一次加密的时候,是加密传入的字符串,然后rsa继续把base64加密后的数据再次加密 , 等rsa加密完成后,我们base64进行第二次加密,此刻加密的数据是加密 rsa加密后的数据了. 解密阶段.一路狂解密,不要停 一定要注意上面的加密阶段,别等第一个base64加密后,第二个base64就解密了,这样是行不通的. #!/usr/bin/env python3 im

开源一个基于nio的java网络程序

因为最近要从公司离职,害怕用nio写的网络程序没有人能看懂(或许是因为写的不好吧),就调整成了mina(这样大家接触起来非常方便,即使没有socket基础,用起来也不难),所以之前基于nio写的网络程序就开放出来好了! 写的比较挫,大家见谅! 首先是PollServer类,主要处理select,做网络事件的监听和基于FutureTask的数据发送,代码如下: package gs.gate; import gs.gate.handle.ClientHandle; import java.util

分享一个自己用的基于mvc编程工作管理

前言: 最近在家没事学习下mvc,正好把以前用webform写的一个帮助自己编码的工具重构成了mvc,另外根据自己的编程工作感悟添加了公司常用软件维护 ,数据库操作记录这些新功能. 技术没什么高深的技术,就是mvc+jquery easyUi+简单的三层,生成文档的模板引擎用的Razor. 主要还是解决沟通成本太高的问题,都是根据工作中遇到的问题慢慢解决的,至少很多功能可以解决小型软件团队很多流程问题,自己摸索真是又痛苦又快乐.相信也有很多朋友和我一样没有去过大型软件公司,很多问题只能看别人的文

ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室

这是一个极其简陋的聊天室! 这个例子只是在官方的例子上加了 Group 的用法而已,主要是官方给的 Group 的例子就两行代码,看不出效果. 第一步:修改 chat.js "use strict"; //创建一个连接 var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); //定义客户端的 ReceiveMessage 方法 connection.on(&qu

基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视.希望与大家共同交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 #define HOME "/" #define TIOCSCTTY 0x540E #define TIOCGWINSZ 0x5413 #define TIOCSWINSZ 0x5414 #define ECHAR 0x1d #define PORT 39617 #define BU

项目日志之基于Java socket的网络通讯

Java API网络类包中的Socket类是网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递.我们打算通过Java中基于Socket的网络编程实现一个简单的网络通信程序.这就是我们团队项目(开发一款简单的通讯软件,其基本功能是实现一对一的网络信息通讯,并努力向一对多和多对多靠近)的主要内容. 一.Java socket通信开发原理(查阅资料): 服务器使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端

基于UDP的Socket网络编程实现用户登录的实现

package Test_UDP_Socket; import java.net.DatagramPacket.* //服务器端 import java.net.DatagramSocket; import java.net.InetAddress; public class ServerUDP { public static void main(String[] args) throws Exception{ //1.先实现接收Client信息 DatagramSocket socketSer

构建基于Javascript的移动web CMS——加载JSON文件

在上一篇中说到了如何创建一个Django Tastypie API给移动CMS用,接着我们似乎也应该有一个本地的配置文件用于一些简单的配置,如"获取API的URL"."产品列表"."SEO"(在一开始的时候发现这是不好的,后面又发现Google的爬虫可以运行Javascript,不过也是不推荐的.)这些东西是不太需要修改的,直接写在代码中似乎又不好,于是放到了一个叫作configure.json的文件里. RequireJS Plugins 网上

基于socket的简单网络程序设计

基于socket的简单网络程序设计 1.实验目的与要求: (1)初步掌握TCP和UDP方式的网络编程模式. (2)能运用Winsock提供的API函数接口进行网络程序的编写. 2.实验准备和说明: (1)要求掌握流式和数据报socket的编程模式和实现. (2)创建本次实验工作文件夹"-\实验\实验4". 3.实验内容与步骤:       1)工程的创建 在VC6里边新建一个工程,选择:Win32 Console Application,输入工程名.具体方法:启动VC6.0,进入[文件