由于des加密要求明文分组为64比特位的长度,当明文长度为任意时,可以有两种方式来进行分组:
(1)第一种方式:首先必须计算出明文的总长度,然后根据计算结果进行判定。如果明文长度为64的整数倍,则可以直接进行分组加密。如果明文长度不是64的整数倍,则可以在明文最后进行填充,使其长度为64的整数倍。最后再对明文进行分组,然后对各个明文分组进行加密。
(2)第二种方式:不必计算明文的总长度,直接将明文进行分组加密。如果在分组的过程中发现某一组(只可能是最后一个分组)长度不足64比特位时,再对该组进行填充,然后再进行加密。
#include<stdioh>
#include<stdlibh>
main()
{
int key;
char ch;
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将密文写到输出流。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)