如何用分组倒置法将明文computersystem加密

如何用分组倒置法将明文computersystem加密,第1张

由于des加密要求明文分组为64比特位的长度,当明文长度为任意时,可以有两种方式来进行分组:

(1)第一种方式:首先必须计算出明文的总长度,然后根据计算结果进行判定。如果明文长度为64的整数倍,则可以直接进行分组加密。如果明文长度不是64的整数倍,则可以在明文最后进行填充,使其长度为64的整数倍。最后再对明文进行分组,然后对各个明文分组进行加密。

(2)第二种方式:不必计算明文的总长度,直接将明文进行分组加密。如果在分组的过程中发现某一组(只可能是最后一个分组)长度不足64比特位时,再对该组进行填充,然后再进行加密。

#include<stdioh>

#include<stdlibh>

main()

{

int key;

char ch;

printf("\n请输入密钥:");

scanf("%d",&key);

printf("得到对应明文如下:");

while((ch=getchar())!='\r')

(ch+key)>122putchar(ch-122+33+key):

((ch+key)<33putchar(ch+122+key):putchar(ch+key));

}

输入输出如下:

请输入密钥:20addse

得到对应明文如下:uxxy

你先输入一个任意的整数,如20,然后在键盘上输入一段任意的字符如addse

按回车键结束,就会得到结果 如:uxxy

下面是另一组输入输出:

请输入密钥:35asjRYIRER!@#$^^&

得到对应明文如下:+=4u#luhuDcFG((MI-

具体是如何加密,你应该能看懂,就是用一个三目运算符 :控制。

#include <stdioh>

#include <stringh>

#include <stdlibh>

int main(int argc, const char argv[]) {

if (argc < 2) {

fprintf(stderr, "usage: xor key < input-file > output-file\n");

return -1;

}

size_t length = strlen(argv[1]);

if (!length) {

// 不加密

const int kBufferSize = 128;

char buffer[kBufferSize];

for(;;) {

size_t bytes = fread(buffer, 1, kBufferSize, stdin);

if (bytes) {

fwrite(buffer, 1, bytes, stdout);

} else {

break;

}

}

} else {

// 加密

char buffer = (char )malloc(length);

for (;;) {

size_t bytes = fread(buffer, 1, length, stdin);

if (bytes) {

for (size_t i = 0; i < bytes; ++i) {

buffer[i] ^= argv[1][i];

}

fwrite(buffer, 1, bytes, stdout);

} else {

break;

}

}

free(buffer);

}

return 0;

}

不理解的 请追问

C语言设计一个简单的加密解密程序如下:

加密程序代码:

#include<stdioh>

main()

{

char

c,filename[20];

FILE

fp1,fp2;

printf("请输入待加密的文件名:\n");

scanf("%s",filename);

fp1=fopen(filename,"r");

fp2=fopen("miwentxt","w");

do

{

c=fgetc(fp1);

if(c>=32&&c<=126)

{

c=c-32;

c=126-c;

}

if(c!=-1)

fprintf(fp2,"%c",c);

}

while(c!=-1);

}

解密程序代码:

#include<stdioh>

#include<stringh>

main()

{

char

c,filename[20];

char

yanzhengma[20];

FILE

fp1,fp2;

printf("请输入待解密文件名:\n");

scanf("%s",filename);

printf("请输入验证码:\n");

scanf("%s",yanzhengma);

if(strcmp(yanzhengma,"shan")==0)

{

fp1=fopen(filename,"r");

fp2=fopen("yuanwentxt","w");

do

{

c=fgetc(fp1);

if(c>=32&&c<=126)

{

c=126-c;

c=32+c;

}

if(c!=-1)

fprintf(fp2,"%c",c);

}

while(c!=-1);

}

else

{

printf("验证码错误!请重新输入:\n");

scanf("%s",filename);

}

}

一.加密

DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

DES算法加密过程

对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:

IP 58 50 42 34 26 18 10 2

60 52 44 36 28 20 12 4

62 54 46 38 30 22 14 6

64 56 48 40 32 24 16 8

57 49 41 33 25 17 9 1

59 51 43 35 27 19 11 3

61 53 45 37 29 21 13 5

63 55 47 39 31 23 15 7

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规则为:

f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2…… 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。

R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:

IP-1 40 8 48 16 56 24 64 32

39 7 47 15 55 23 63 31

38 6 46 14 54 22 62 30

37 5 45 13 53 21 61 29

36 4 44 12 52 20 60 28

35 3 43 11 51 19 59 27

34 2 42 10 50 18 58 26

33 1 41 9 49 17 57 25

经过置换IP-1后生成的比特串就是密文e。

下面再讲一下变换f(Ri-1,Ki)。

它的功能是将32比特的输入再转化为32比特的输出。其过程如图所示:

对f变换说明如下:输入Ri-1(32比特)经过变换E后,膨胀为48比特。膨胀后的比特串的下标列表如下:

E: 32 1 2 3 4 5

4 5 6 7 8 9

8 9 10 11 12 13

12 13 14 15 16 17

16 17 18 19 20 21

20 21 22 23 24 25

24 25 26 27 28 29

28 29 30 31 32 31

膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换后,其下标列表如下:

P: 16 7 20 21

29 12 28 17

1 15 23 26

5 18 31 10

2 8 24 14

32 27 3 9

19 13 30 6

22 11 4 25

经过P变换后输出的比特串才是32比特的f (Ri-1,Ki)。

下面再讲一下S盒的变换过程。任取一S盒。见图:

在其输入b1,b2,b3,b4,b5,b6中,计算出x=b12+b6, y=b5+b42+b34+b28,再从Si表中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。(S表如图所示)

至此,DES算法加密原理讲完了。在VC++60下的程序源代码为:

for(i=1;i<=64;i++)

m1[i]=m[ip[i-1]];//64位明文串输入,经过IP置换。

下面进行迭代。由于各次迭代的方法相同只是输入输出不同,因此只给出其中一次。以第八次为例://进行第八次迭代。首先进行S盒的运算,输入32位比特串。

for(i=1;i<=48;i++)//经过E变换扩充,由32位变为48位

RE1[i]=R7[E[i-1]];

for(i=1;i<=48;i++)//与K8按位作不进位加法运算

RE1[i]=RE1[i]+K8[i];

for(i=1;i<=48;i++)

{

if(RE1[i]==2)

RE1[i]=0;

}

for(i=1;i<7;i++)//48位分成8组

{

s11[i]=RE1[i];

s21[i]=RE1[i+6];

s31[i]=RE1[i+12];

s41[i]=RE1[i+18];

s51[i]=RE1[i+24];

s61[i]=RE1[i+30];

s71[i]=RE1[i+36];

s81[i]=RE1[i+42];

}//下面经过S盒,得到8个数。S1,s2,s3,s4,s5,s6,s7,s8分别为S表

s[1]=s1[s11[6]+s11[1]2][s11[5]+s11[4]2+s11[3]4+s11[2]8];

s[2]=s2[s21[6]+s21[1]2][s21[5]+s21[4]2+s21[3]4+s21[2]8];

s[3]=s3[s31[6]+s31[1]2][s31[5]+s31[4]2+s31[3]4+s31[2]8];

s[4]=s4[s41[6]+s41[1]2][s41[5]+s41[4]2+s41[3]4+s41[2]8];

s[5]=s5[s51[6]+s51[1]2][s51[5]+s51[4]2+s51[3]4+s51[2]8];

s[6]=s6[s61[6]+s61[1]2][s61[5]+s61[4]2+s61[3]4+s61[2]8];

s[7]=s7[s71[6]+s71[1]2][s71[5]+s71[4]2+s71[3]4+s71[2]8];

s[8]=s8[s81[6]+s81[1]2][s81[5]+s81[4]2+s81[3]4+s81[2]8];

for(i=0;i<8;i++)//8个数变换输出二进制

{

for(j=1;j<5;j++)

{

temp[j]=s[i+1]%2;

s[i+1]=s[i+1]/2;

}

for(j=1;j<5;j++)

f[4i+j]=temp[5-j];

}

#include<stdioh>

int main(){

int x,y,z;

scanf("%d",&x);

y=(x/100+9)%10100+(x/10%10+9)%1010+(x%10+9)%10;

printf("加密后的成绩是%d\n",y);

z=(y/100+1)%10100+(y/10%10+1)%1010+(y%10+1)%10;

printf("解密后的成绩是%d\n",z);

return 0;

}

以上就是关于如何用分组倒置法将明文computersystem加密全部的内容,包括:如何用分组倒置法将明文computersystem加密、简单的C语言加密程序、C++:写一个加密程序,它通过cin从输入流中读入一段明文,通过cout将密文写到输出流。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10169207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存