DES加密实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络安全作业
题目 des
学号
专业及班级
姓名
日期 2012.04.14 加密算法网络工程0902班
一.des简介:
des是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56 位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。
des是一个对
称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软
件设计时有利于加密单元的重用)。
des的所有的保密性均依赖于密钥。
二. des算法过程:
1. des的加密过程:
第一阶段:初始置换ip。
在第一轮迭代之前,需要加密的64位明文首先通过初始置换
ip
的作用,对输入分组实施置换。
最后,按照置换顺序,des将64位的置换结果分为左右
两部分,第1位到第32位记为l0,第33位到第64位记为r0。
第二阶段:16次迭代变换。
des采用了典型的feistel结构,是一个乘积结构的迭代密
码
算法。
其算法的核心是算法所规定的16次迭代变换。
des算法的16才迭代变换具有相
同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥ki 作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f 后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,
原来的有半部分变成了新的左半部分。
用下面的规则来表示这一过程(假设第i次迭代
所
得到的结果为liri): li = ri-1; ri = li-1⊕f(ri-1,ki);在最后一轮左与右半部分
并未变
换,而是直接将r16 l16并在一起作为未置换的输入。
第三阶段:逆(初始)置换。
他是初始置换ip的逆置换,记为ip-1。
在对16次迭代
的
结果(r16 l16)再使用逆置换ip-1后,得到的结果即可作为des加密的密文y输出,
即y = ip-1 (r16 l16)。
2. des解密过程:
des的解密算法与其加密算法使用的算法过程相同。
两者的不同之处在于解密时子密钥ki的使用顺序与加密时相反,如果子密钥为k1k2…k16,那么解密时子密钥的使用
顺序为k16k15…k1,即使用des解密算法进行解密时,将以64位密文作为输入,第1 次迭代运算使用子密钥k16,第2次迭代运算使用子密钥k15,……,第16 次迭代使
用子密钥k1,其它的运算与加密算法相同。
这样,最后输出的是64位明文。
三. des代码实现(程序): 1.新建头文件des_encode.h 内容如下:
void encodemain(); //encodemain function void decodemain(); //sorry ,it has not used void decode(int *str,int *keychar); //decode :input 8 chars,8 keychars
void encode(int *str,int *keychar); //encode: input 8 chars,8 keychars void keybuild(int *keychar); //create key array void strtobin(int *midkey,int *keychar); //change into binary void keycreate(int *midkey2,int movebit,int i); //call by keybuild void encodedata(int *ldata,int *rdata,int *srt); //encodedata function void f(int *rdata,int *key); //f function void expand(int *rdata,int *rdatap); //expand function void exchanges(int *rdatap,int *rdata); //s-diagram change void exchangep(int *rdata); //p change void fillbin(int *rdata,int n,int s);
void decodedata(int *str,int *ldata,int *rdata); //decodedata from
binary
int ip1[]={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 };
int ip2[]={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 };
ints[][4][16]={{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13} },{
{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9} },{
{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12} },{
{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14} },{
{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3} },{
{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13} },{
{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12} },{
{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11} }};
int ex[48]={ 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,1 }; int
p[32]={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};
int pc1[56]={57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,
19,11,3,60,52,44,36,63,55,47,39,31,33,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29
,21,13,5,28,20,12,4};
intpc2[48]={14,17,13,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,4
7,55,30,40,51,45,33,48, 44,49,39,56,34,53,46,42,50,36,29,32}; 2.创建des.cpp 内容如下:
#include<stdio.h>
#include<string.h>
#include aa.h
int key[16][48];
char str[8];
void main() //main function {
encodemain();
}
void encodemain() //encodemain function {
int i;
char keychar[8];
int key2[8];
int strkey[8];
printf(请输入8个要加密的字符:\n); for(i=0;i<8;i++)
scanf(%c,&str[i]);
getchar();
for(i=0;i<8;i++)
strkey[i]=str[i];
printf(\n输入明文的十六进制为:\n); for(i=0;i<8;i++)
printf(%10x,strkey[i]);
printf(\n请输入密钥(8个字符):\n); for(i=0;i<8;i++) scanf(%c,&keychar[i]);
for(i=0;i<8;i++)
key2[i]=keychar[i];
getchar();
// printf(%c,keychar[i]);
encode(strkey,key2);
printf(\n加密后十六进制密文是:\n); for(i=0;i<8;i++)
printf(%10x,strkey[i]);
printf(\n\n清输入解密密码\n); for(i=0;i<8;i++)
scanf(%c,&keychar[i]);
for(i=0;i<8;i++)
key2[i]=keychar[i];
decode(strkey,key2);
for(i=0;i<8;i++)
printf(%10x,strkey[i]);
for(i=0;i<8;i++)
str[i]=strkey[i];
printf(\n明文为:\t);
for(i=0;i<8;i++)
printf(%c,str[i]);
printf(\n\n); }
void keybuild(int *keychar){ //create key array int i,j; int movebit[]={1,1,2,2,2,2,2,2, 1,2,2,2,2,2,2,1}; int midkey2[56];
int midkey[64];
strtobin(midkey,keychar);
for(i=0;i<56;i++)
midkey2[i]=midkey[pc1[i]-1]; for(i=0;i<16;i++)
keycreate(midkey2,movebit[i],i); }
void strtobin(int *midkey,int *keychar){ //change into binary int
trans[8],i,j,k,n;
n=0;
for(i=0;i<8;i++){
j=0;
while(keychar[i]!=0){
trans[j]=keychar[i]%2;
keychar[i]=keychar[i]/2;篇二:des加密实验报告
《网络安全技术》实验
篇三:用c实现des的加密实验报告
一、实验目的
1、对算法描述可进行充分理解,精确理解算法的各个步骤。
2、完成des软件算法的详细设计。
3、用c++完成算法的设计模块。
4、编制测试代码。
二、实验内容
根据des加密标准,用c++设计编写符合des算法思想的加密程序,并进行测试、分析,
并尽量考虑程序的优化。
三、方案设计
des的总体方案如下图所示。
与其他任何一种加密方案一样,加密函数有两个输入:待加
密的明文和密钥。
在这里,明文的长度必须为64bit,而密钥的长度为56bit. des加密算法的一般描述
观察上图的左边部分,可以看到明文的处理阶段经过了三个阶段。
首先64bitde明文经
过了一个初始置换ip后,比特重排产生了经过置换的输入。
接下来的一个阶段是由对同一个
函数进行16次循环组成的,这个函数本身既包含有置换又包含有替代函数。
最后一个循环(第
16个)的输出由64bit组成,它是输入明文和密钥的函数,这个输出的左边和右边
两个部分经过交换后就得到预输出。
最后,预输出通过一个逆初始置换就生成了64bit
的密文,这个置换是初始置换的逆置换。
上图的右半部分给出了54bit密钥的使用方式,密钥首先通过一个置换函数,接着对于
16个循环的每一个,都通过一个循环左移操作和一个置换草所的组合产生出一个密钥k1。
对
每一个循环来说,置换函数是相同的,但由于密钥比特的重复移位,产生的子密钥并不相同。
(a)初始置换
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 36 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
(b)逆初始置换
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
(c)des的s盒子的定义:
s1
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13 s2
15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9 s3
10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12 s4
7
13
10
2 s5
2 12 4 1 7 10 11 6 8 5
3 15 13 0 1
4 9 14 11 2 12 4 7 13 1
5 0 15 10 3 9 8
6 4 2 1 11 10 13
7
8 15
9 12 5 6 3 0 14 11 8 12 7 1 14 1 16 3 15 0 9 10 4 5 3 s6
12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6 4 3 2 12 9 5 15 10 11 14 1 7 5 0 8 13 s7
4 11 2 14 1
5 0 8 13 3 12 9 7 5 10
6 1 13 0 1
7 4 9 1 10 14 3 5 12 2 15
8 6 1 4 11 13 12 3 7 14 10 15 6 8 0 5
9 2
6 11 13 8 1 4 10
7 9 5 0 15 14 2 3 12 s8
13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
密钥的产生:
(a)舍弃64位密钥中的奇偶校验位,根据下表(pc-1)进行密钥变换得到5613 14 3
0 6 9 10 1 2 8 5 11 12 4 15 8 11 5 6 15 0 3 4 7 2 12 1 10
14 9 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4 15 0 6 10 1 13 8 9
4 5 11 12 7 2 14 位的密钥,在变换中,奇偶校验位以被舍弃。
置换选择 1(pc-1)
57 49 41 33 25 17 9
1 58 50 4
2 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36 63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
(b)置换选择2 (pc-2) 14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
(c)左移调度
i: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 左移位数: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
四、详细设计
算法1
des_enc(x64)
exterual ip, inip, exp, pos, sbox1,……sbox8 global k48[1-16]
state64<-ip(x64)
for i<- 1 to 16
do {令 state64=sl32||sr32
temp48<-ext(sl32)
temp48<= temp48+k48[i] 令temp48=t6[1]||t6[2]||t6[3]||t6[4]||t6[5]||t6[6]||t6[7]||t6[8]
t4[1]<-sbox[1] (t6[1])
t4[2]<-sbox[2] (t6[2])
t4[3]<-sbox[3] (t6[3])
t4[4]<-sbox[4] (t6[4])
t4[5]<-sbox[5] (t6[5])
t4[6]<-sbox[6] (t6[6])
t4[7]<-sbox[7] (t6[7])
t4[8]<-sbox[8] (t6[8])
temp32=t4[1]||t4[2]||t4[3]||t4[4]||t4[5]||t4[6]||t4[7]||t4[8]
temp32<=pos(temp32)
sr32<- temp32(异或)sl32
sl32<-sr32
}
令state64=sl32||sl32
state64<-sr32||sl32
state64<-invip(state64)
return state64 算法2 初始置换(ip)
ip(x64)
constarray[1-64],<-{58,50,42,34,26,18,10,2,60,52,44,36,28,20,23,4,62,54,46,38
,30,22,14,6,64,56,48,40,32,24,26,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} 令x64=x1[1]||x1[2]||……||x1[64] y64=y1[1]||y1[2]||……||y1[64] for i<- to 64
do {y1[i] x1[constarrayi]
}
return y64 算法3 逆初始置换
invip(m64)
constarray[1-64],<-{40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,3 ,6,46,14,
54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,38,35,3,43,11,51,19,59,27
,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25} 令x64=m1[1]||m1[2]||……||m1[64] y64=n1[1]||n1[2]||……||n1[64] for g<-1 to 64
do {y1[i] = x1[constarray1} return y64 算法4 扩展置换
exe(x32)篇四:des文件加密实验报告
des文件加密实验报告
一、 des算法简介
des是data encryption standard(数据加密标准)的缩写。
它是由ibm公司研制的一
种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,二
十年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
des是一个分组加密算法,他以64位为分组对数据加密。
同时des也是一个对称算法:
加密和解密用的是同一个算法。
它的密匙长度是56位(因为每个第8 位都用作奇偶校验),
密匙可以是任意的56位的数,而且可以任意时候改变。
其中有极少量的数被认为是弱密匙,
但是很容易避开他们。
所以保密性依赖于密钥。
二、用c#实现des文件加密
指定文件,输入密钥来加密和解密数据。
descryptoserviceprovider基于对称加密算法。
symmetricencryption 需要一个密钥和一个初始化向量 (iv) 加密请。
要解密的数据,必须
具有相同的密钥和 iv。
使用的加密提供程序来获取 encryptingobject (createencryptor)
创建cryptostream类的一个实例,现有输出文件流对象的构造函数的一部分。
要解密文件,执行以下步骤:创建一个方法,并命名该按钮decryptfile.解密过程是类
似于 theencryption 进程,但是, decryptfile过程从encryptfile过程的两个主要区别。
而不是createencryptor使用createdecryptor来创建cryptostream对象,用于指定如何使
用该对象。
解密的文本写入目标文件, cryptostream对象是现在而不是目标流的来源。
三、运行环境
可将des文件加解密软件的可执行.exe文件直接在xp,win7等系统上运行。
四、实验结果
1、开始界面
2、打开要加密文件、输入密钥
3、加密
4、打开要解密文件、输入密钥
5、解密
五、主要算法代码
public static void encryptfile(string sinputfilename, string soutputfilename,
string skey) {
filestream fsinput = new filestream(sinputfilename, filemode.open,
fileaccess.read); filestream fsencrypted = new
filestream(soutputfilename, filemode.create, fileaccess.write); descryptoserviceprovider des = new descryptoserviceprovider(); des.key = asciiencoding.ascii.getbytes(skey); des.iv = asciiencoding.ascii.getbytes(skey); icryptotransform desencrypt = des.createencryptor(); cryptostream cryptostream = new cryptostream(fsencrypted, desencrypt, cryptostreammode .write); byte[] bytearrayinput = new byte[fsinput.length]; fsinput.read(bytearrayinput, 0, bytearrayinput.length); cryptostream.write(bytearrayinput, 0, bytearrayinput.length); cryptostream.close();
fsinput.close();
fsencrypted.close();
} public static void decryptfile(string sinputfilename, string soutputfilename,
string skey) {
try
{
descryptoserviceprovider des = new descryptoserviceprovider(); des.key = asciiencoding.ascii.getbytes(skey); des.iv = asciiencoding.ascii.getbytes(skey); filestream fsread = new filestream(sinputfilename, filemode.open,
fileaccess.read); icryptotransform desdecrypt =
des.createdecryptor();
cryptostream cryptostreamdecr = new cryptostream(fsread, desdecrypt, cryptostreammode.read);
streamwriter fsdecrypted = new streamwriter(soutputfilename); fsdecrypted.write(new streamreader(cryptostreamdecr, encoding.getencoding(gb2312)).readtoend()); fsdecrypted.flush();
fsdecrypted.close();
}
catch (exception e)
{
messagebox.show(e.message); }
}篇五:应用密码学des实验报告
密码学
des简介: des实验报告
des算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国ibm
公司研制的对称密码体制加密算法。
明文按64位进行分组, 密匙4位,密钥事实上是56
位参与des运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数
个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
des基本原理: 其入口参数有三个:key、data、mode。
key为加密解密使用的加密
解密的数据,mode为其工作模式。
当模式为加密模式时,明文按照64位进行分组,形
成明文组,key使用模式时,key于对数据解密。
实际运用中,密钥只用到了64位中的56
位,这样才具有高的安全性。
实验目的:
通过这次的实验,来了解和实验des算法在加密中的应用,增强对des算法的理解和运
用,为以后进一步的密码学学习打好基础。
实验内容:
置换规则表
其功能是把输入的64位数据块按位重新组合,并把输出分为l0、r0两部分,每部分各
长32位,其置换规则见下表:
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, 即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来
的第7位。
l0、r0则是换位输出后的两部分,l0是输出的左32位,r0 是右32位,例:设
置换前的输入值为d1d2d3......d64,则经过初始置换后的结果为:l0=d58d50 (8)
r0=d57d49 (7)
经过16次迭代运算后。
得到l16、r16,将此作为输入,进行逆置换,即得到密文输出。
逆置换正好是初始置换的逆运算。
例如,第1位经过初始置换后,处于第40位,而通过逆置
换,又将第40位换回到第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, 子密钥ki(48bit)的生成算法
ki的生成算法描述图中我们可以看到:初始key值为64位,其中6偶校验位,不参与
des运算。
故key 实际可用位数便只有56位。
即:经过缩小选择换位表1的变换后,key 的
位数由64 位变成了56位,此56位分为c0、d0两部分,各28位,然后分别进行第1次循
环左移,得到c1、d1,将c1(28位)、d1(28位)合并得到56位,再经过缩小选择换位2,
从而便得到了密钥k0(48位)。
依此类推,便可得到k1、k2、......、k15,不过需要注意
的是,16次循环左移对应的左移位数要依据下述规则进行等等,这里就不在赘述。