DES算法实现过程分析

DES算法实现过程分析
DES算法实现过程分析

DES算法实现过程分析

来源:中国论文下载中心 [ 03-03-18 14:30:00 ] 作者:本站会员编辑:丢oO丢oO

1. 处理密钥:

1.1 从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个”1”位.(本文如未特指,均指二进制位)

1.2 具体过程:

1.2.1 对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表所示:

表一为忽略校验位以后情况

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

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

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

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

1.2.2 把变换后的密钥等分成两部分,前28位记为C[0], 后28位记为D[0].

1.2.3 计算子密钥(共16个),从i=1开始。

1.2.3.1 分别对C[i-1],D[i-1]作循环左移来生成C[i],D[i].(共16次)。每次循环左移位数

如下表所示:

循环次数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.2.3.2 串联C[i],D[i],得到一个56位数,然后对此数作如下变换以产生48位子密钥K[i]。变换过程如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32

1.2.3.3 按以上方法计算出16个子密钥。

2.对64位数据块的处理:

2.1 把数据分成64位的数据块,不够64位的以适当的方式填补。

2.2对数据块作变换。

bit goes to bit bit goes to bit

58 1 57 33

50 2 49 34

42 3 41 35

34 4 33 36

26 5 25 37

18 6 17 38

10 7 9 39

2 8 1 40

60 9 59 41

52 10 51 42

44 11 43 43

36 12 35 44

28 13 27 45

20 14 19 46

12 15 11 47

4 16 3 48

62 17 61 49

54 18 53 50

46 19 45 51

38 20 37 52

30 21 29 53

22 22 21 54

14 23 13 55

6 24 5 56

64 25 63 57

56 26 55 58

48 27 47 59

40 28 39 60

32 29 31 61

24 30 23 62

16 31 15 63

8 32 7 64

2.3 将变换后的数据块等分成前后两部分,前32位记为L[0],后32位记为R[0]。2.4 用16个子密钥对数据加密。

2.4.1 根据下面的扩冲函数E,扩展32位的成48位

bit goes to bit bit goes to bit bit goes to bit bit goes to bit

32 1 8 13 16 25 24 37

1 2 9 14 17 26 25 38

2 3 10 15 18 27 26 39

3 4 11 16 19 28 27 40

4 5 12 17 20 29 28 41

5 6 13 18 21 30 29 42

4 7 12 19 20 31 28 43

5 8 13 20 21 32 29 44

6 9 14 21 22 33 30 45

7 10 15 22 23 34 31 46

8 11 16 23 24 35 32 47

9 12 17 24 25 36 1 48

2.4.2 用E{R[i-1]}与K[i]作异或运算。

2.4.3 把所得的48位数分成8个6位数。1-6位为B[1],7-12位为B[2],……43-48位为B[8]。

2.4.4 用S密箱里的值替换B[j]。从j=1开始。S密箱里的值为4位数,共8个S密箱2.4.4.1 取出B[j]的第1和第6位串联起来成一个2位数,记为m.。m即是S密箱里用来替换

B[j]的数所在的列数。

2.4.4.2 取出B[j]的第2至第5位串联起来成一个4位数,记为n。n即是S密箱里用来替换

B[j]的数所在的行数。

2.4.4.3 用S密箱里的值S[j][ m][ n]替换B[j]。8个S密箱如下所示:

--------

S-BOXES1

Binary d1d6 => 00 01 10 11

\/ d2..d5 \/ Dec 0 1 2 3

0000 0 14 0 4 15

0001 1 4 15 1 12

0010 2 13 7 14 8

0011 3 1 4 8 2

0100 4 2 14 13 4

0101 5 15 2 6 9

0110 6 11 13 2 1

0111 7 8 1 11 7

1000 8 3 10 15 5

1001 9 10 6 12 11

1010 10 6 12 9 3

1011 11 12 11 7 14

1100 12 5 9 3 10

1101 13 9 5 10 0

1110 14 0 3 5 6

1111 15 7 8 0 13

--------

S-BOXES2

binary d1d6 => 00 01 10 11

0000 0 15 3 0 13

0001 1 1 13 14 8

0010 2 8 4 7 10

0011 3 14 7 11 1

0100 4 6 15 10 3

0101 5 11 2 4 15

0110 6 3 8 13 4

0111 7 4 14 1 2

1000 8 9 12 5 11

1001 9 7 0 8 6

1010 10 2 1 12 7

1011 11 13 10 6 12

1100 12 12 6 9 0

1101 13 0 9 3 5

1110 14 5 11 2 14

1111 15 10 5 15 9

--------

S-BOXES3

binary d1d6 => 00 01 10 11 \/ d2..d5 \/ dec 0 1 2 3 0000 0 10 13 13 1

0001 1 0 7 6 10

0010 2 9 0 4 13

0011 3 14 9 9 0

0100 4 6 3 8 6

0101 5 3 4 15 9

0110 6 15 6 3 8

0111 7 5 10 0 7

1000 8 1 2 11 4

1001 9 13 8 1 15

1010 10 12 5 2 14

1011 11 7 14 12 3

1100 12 11 12 5 11

1101 13 4 11 10 5

1110 14 2 15 14 2

1111 15 8 1 7 12

--------

S-BOXES4

binary d1d6 => 00 01 10 11

0000 0 7 13 10 3

0001 1 13 8 6 15

0010 2 14 11 9 0

0011 3 3 5 0 6

0100 4 0 6 12 10

0101 5 6 15 11 1

0110 6 9 0 7 13

0111 7 10 3 13 8

1000 8 1 4 15 9

1001 9 2 7 1 4

1010 10 8 2 3 5

1011 11 5 12 14 11

1100 12 11 1 5 12

1101 13 12 10 2 7

1110 14 4 14 8 2

1111 15 15 9 4 14

--------

S-BOXES5

binary d1d6 => 00 01 10 11 \/ d2..d5 \/ dec 0 1 2 3 0000 0 2 14 4 11

0001 1 12 11 2 8

0010 2 4 2 1 12

0011 3 1 12 11 7

0100 4 7 4 10 1

0101 5 10 7 13 14

0110 6 11 13 7 2

0111 7 6 1 8 13

1000 8 8 5 15 6

1001 9 5 0 9 15

1010 10 3 15 12 0

1011 11 15 10 5 9

1100 12 13 3 6 10

1101 13 0 9 3 4

1110 14 14 8 0 5

1111 15 9 6 14 3

--------

S-BOXES6

binary d1d6 => 00 01 10 11

0000 0 12 10 9 4 0001 1 1 15 14 3 0010 2 10 4 15 2 0011 3 15 2 5 12 0100 4 9 7 2 9 0101 5 2 12 8 5 0110 6 6 9 12 15 0111 7 8 5 3 10 1000 8 0 6 7 11 1001 9 13 1 0 14 1010 10 3 13 4 1

DES算法Java实现源代码

package des; /** * 加密过程: * 1.初始置换IP:将明文顺序打乱重新排列,置换输出为64位。 * 2.将置换输出的64位明文分成左右凉拌,左一半为L0,右一半称为R0,各32位。 * 3。计算函数的16轮迭代。 * a)第一轮加密迭代:左半边输入L0,右半边输入R0:由轮函数f实现子密钥K1对R0的加密, * 结果为32位数据组f(R0,K1), * b)第二轮加密迭代:左半边输入L1=R0,右半边输入R1=L0⊕f(R0,K1),由轮函数f实现子密钥 * K2对R1的加密,结果为32位数据组f(R1,K2),f(R1,K2)与L1模2相加,得到一个32为数据组L1⊕f(R1,K2). * c)第3到16轮迭代分别用密钥K3,K4……K16进行。4.再经过逆初始置换IP-1,将数据打乱重排,生成64位密文。 * * 子密钥生成过程: * 1.将64位的密钥经过PC-1置换生成56位密钥。 * 2.将56位的密钥分成左右两部分,分别进行移位操作(一共进行16轮),产生16个56位长度的子密钥。 * 3.将16个56位的子密钥分别进行PC-2置换生成16个48位的子密钥。 * * 轮函数f的工作过程: * 1.在第i次加密迭代过程中,扩展置换E对32位的Ri-1的各位通过置换表置换为48位的输出。 * 2.将该48位的输出与子密钥Ki进行异或操作,运算结果经过S盒代换运算,得到一个32位比特的输出。 * 3。该32位比特输出再经过P置换表进行P运算,将其各位打乱重排,生成32位的输出。 * * author Ouyang * */ public class Des { int[] byteKey; public Des(int[] byteKey) { this.byteKey = byteKey; } private static final int[] 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,

算法分析与设计总结

第一章算法概述 1.算法:解决问题的一种方法或过程;由若干条指令组成的有穷指令。 2.算法的性质: 1)输入:有零个或多个输入 2)输出:有至少一个输出 3)确定性:每条指令是清晰的、无歧义的 4)有限性:每条指令的执行次数和时间都是有限的 3.算法与程序的区别 程序是算法用某种程序设计语言的具体实现 程序可以不满足算法的有限性 4.算法复杂性分析 1)算法的复杂性是算法运行所需要的计算机资源的量,需要时间资源的量称为时间复 杂性,需要空间资源的量称为空间复杂性 2)三种时间复杂性:最坏情况、最好情况、平均情况 3)可操作性最好且最有实际价值的是最坏情况下的时间复杂性 第二章递归与分支策略 1.递归概念:直接或间接调用自身的算法 2.递归函数:用函数自身给出定义的函数 3.递归要素:边界条件、递归方程 4.递归的应用 ?汉诺塔问题 void Hanuo(int n,int a,int b,int c) { if(n==1) return; Hanuo(n-1,a,c,b); move(a,b) Hanuo(n-1,c,b,a); } ?全排列问题 void Perm(Type list[],int k,int m) { //产生list[k,m]的所有排列 if(k == m) { for(int i = 0;I <= m;i++) cout<

并行算法设计与分析考题与答案

《并行算法设计与分析》考题与答案 一、1.3,处理器PI的编号是: 解:对于n ×n 网孔结构,令位于第j行,第k 列(0≤j,k≤n-1)的处理器为P i(0≤i≤n2-1)。以16处理器网孔为例,n=4(假设j、k由0开始): 由p0=p(j,k)=p(0,0) P8=p(j,k)=p(2,0) P1=p(j,k)=p(0,1) P9=p(j,k)=p(2,1) P2=p(j,k)=p(0,2) P10=p(j,k)=p(2,2) P3=p(j,k)=p(0,3) P11=p(j,k)=p(2,3) P4=p(j,k)=p(1,0) P12=p(j,k)=p(3,0) P5=p(j,k)=p(1,1) P13=p(j,k)=p(3,1) P6=p(j,k)=p(1,2) P14=p(j,k)=p(3,2) P7=p(j,k)=p(1,3) P15=p(j,k)=p(3,3) 同时观察i和j、k之间的关系,可以得出i的表达式为:i= j * n+k

一、1.6矩阵相乘(心动算法) a)相乘过程 设 A 矩阵= 121221122121 4321 B 矩阵=1 23443212121121 2 【注】矩阵元素中A(i,l)表示自左向右移动的矩阵,B(l,j)表示自上向下移动的矩阵,黑色倾斜加粗标记表示已经计算出的矩阵元素,如12, C(i,j)= C(i,j)+ A(i,l)* B(l,j) 1 2、

4、

6、

8、

10 计算完毕 b)可以在10步后完成,移动矩阵长L=7,4*4矩阵N=4,所以需要L+N-1=10

大学算法分析与设计复习总结

大学算法分析与设计复习总结 为了拿大学的那悲剧的学分,好好弄懂以下所有知识点吧。把老师的复习的提纲,特意汇总了所有考点,方便童鞋们复习。不喜勿喷!!! 这本书是《算法设计与分析》王红梅编著 一共有以下12章,我们学了1、3、4、5、6、7、8、9 分别是“绪论、蛮力法、分治法、减治法、动态规划法、贪心法、回溯法、分治限界法 第1章绪论 考点: 1、算法的5个重要特性。(P3) 答:输入、输出、有穷性、确定性、可行性 2、描述算法的四种方法分别是什么,有什么优缺点。(P4) 答: 1. 自然语言优点:容易理解;缺点:容易出现二义性,并且算法都很冗长。 2. 流程图优点:直观易懂;缺点:严密性不如程序语言,灵活性不如自然语言。 3. 程序设计语言优点:用程序语言描述的算法能由计算机直接执行;缺点:抽象性差,是算法设计者拘泥于描述算法的具体细节,忽略了“好”算法和正确逻辑的重要性,此外,还要求算法设计者掌握程序设计语言及其编程技巧。 伪代码优点:表达能力强,抽象性强,容易理解 3、了解非递归算法的时间复杂性分析。(P13) 要点:对非递归算法时间复杂性的分析,关键是建立一个代表算法运行时间的求和表达式,然后用渐进符号表示这个求和表达式。 非递归算法分析的一般步骤是: (1)决定用哪个(或哪些)参数作为算法问题规模的度量。 (2)找出算法的基本语句。 (3)检查基本语句的执行次数是否只依赖问题规模。

(4)建立基本语句执行次数的求和表达式。 (5)用渐进符号表示这个求和表达式。 [例1.4]:求数组最小值算法 int ArrayMin(int a[ ], int n) { min=a[0]; for (i=1; i

典型并行算法的实现性能分析

第4卷第5期2003年10月 空军工程大学学报(自然科学版) JOURNALOFAIRFoRCEENCINEERINGUⅣIvERSrrYfNATURALSCIENCEEDm0N vo】4No5 0ct.2003典型并行算法的实现性能分析 雷英杰1,霍红卫2 (1空军工程大学导弹学院,陕西三原713800;2.西安电子科技大学计算机学院,陕西西安710071) 摘要:讨论和分析了几种典型的并行算法及其各种处理方法在基于wjndowsxP环境、消息传递接口MPI并行编程环境支持和c++语言描述的编程实现问题,给出了相应并行程序详尽的计算结果,对比分析了它们的计算性能,以及它们对计算精度产生的影响。分析结论以相应并行算法的 实际编程实现和试验计算数据为基础,可信度高。设计实例表明。分析方法是有效的。 关键词:并行计算;消息传递接o;并行算法;高性能计算 中图分类号:TP393文献标识码:A文章编号:1009—3516(2003)05一0067—04 并行算法计算性能问题是高端、高性能、大规模并行计算领域非常重要的研究内容…。本文以计算。值并行算法为例,通过对若于典型并行算法基于消息传递接口MPI(MessageP∞sing111terface)编犁21和c语言描述的HosⅡess程序实现及其运行结果的分析,给出一些新的对比分析结论。 lMPI并行编程环境 在基于MPI的编程模型中,计算是由一个或多个彼此通过调用函数库函数进行消息收、发通信的进程所组成。在绝大部分MPI实现中,一组固定的进程在程序初始化时生成。这些进程可以执行相同或不同的程序。进程间的通信可以是点到点的,也可以是群体的(collective)。MPI最重要的特性是使用了称之为通信体的机构,允许程序员定义一种封装内部通信结构的模块。所谓通信体就是一个进程组加上进程活动环境,其中进程组就是一组有限或有序的进程集合。所谓有限意即组内包含有限数目的n个进程依次按o,1,…,n—l整数定序(Ranked)。MPI中的进程活动环境是指系统指定的超级标记(supertag),它能安全地将彼此相互冲突的通信区分开来。每个通信体都有一个不同的、系统指定的进程活动环境,在这一个进程活动环境中发送的消息不能在另一个进程活动环境中被接收。 MPI不是一个独立的、白包含的软件系统,MPI进程是重量级、单线程的进程”]。MPI标准并不指明如何启动并行计算,它可通过命令行参数指定应被生成的进程数,然后按sPMD或MPMD方式执行程序”J。 MPI并行程序中经常需要一些进程组闻的群体通信,包括:①路障(Ba而eT)——同步所有进程;②广播(Bmadcast)——从一个进程发送一条数据给所有进程;③收集(Gat}ler)——从所有进程收集数据到一个进程;④散射(scatcer)——从一个进程散发多条数据给所有进程;⑤归约(Reduction)——包括求和、求积等。MPI包含的函数多达200个,它们的功能及参数描述参见文献[4]、[5]等。 2问题与算法描述 设计求w值并行算法的关键是构造一个合适的函数,(*),使得它计算起来既简便,误差又小。即使 收稿日期:2003—05一12 基金项目:国家教育部骨干教师资助计划项目(GG一810—90039—1003)资助 作者简介:重摹杰(1956一),争,阵西渭南人,教授,博士生导师;主要从事智能信息处理与模式识别研究 霍红卫(1963一),女,陕西西安人,主要从事算法设计与分析,并行与分布计算研究

DES算法及其程序实现

DES算法及其程序实现 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: 二.D ES算法的编程实现 #include #include using namespace std;

const static char 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 }; const static char fp[] = { //最终置换 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 }; const static char sbox[8][64] = { //s_box /* 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, 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,

多道γ能谱分析软件中寻峰算法比较总结

自动寻峰 由于谱结构的复杂和统计涨落的影响,从谱中正确地找到全部存在的峰是比较困难的。尤其是找到位于很高本底上的弱峰,分辨出相互靠得很近的重峰更为困难。 谱分析对寻峰方法的基本要求如下: (1)比较高的重峰分辨能力。能确定相互距离很近的峰的峰位。 (2)能识别弱峰,特别是位于高本底上的弱峰。 (3)假峰出现的几率要小。 (4)不仅能计算出峰位的整数道址,还能计算出峰位的精确值,某些情况下要求峰位的误差小于0.2道。 很多作者对寻峰方法进行了研究,提出了很多有效的寻峰方法。 目的: 判断有没有峰存在 确定峰位(高斯分布的数学期望),以便把峰位对应的道址,转换成能量 确定峰边界为计算峰面积服务(峰边界道的确定,直接影响峰面积的计算) 分为两个步骤:谱变换和峰判定 要求:支持手动/自动寻峰,参数输入,同时计算并显示峰半高宽、精确峰位、峰宽等信息,能够区分康普顿边沿和假峰 感兴区内寻峰 人工设置感兴趣大小,然后在感兴区内采用简单方法寻峰 重点研究:对感兴区内的弱峰寻峰、重峰的分解 对于一个单峰区,当峰形在峰位两侧比较对称时,可以由峰的FWHM计算峰区的左、右边界道址。峰区的宽度取为3FWHM,FWHM的值可以根据峰位m p由测量系统的FWHM

刻度公式计算。由于峰形对称,左、右边界道和峰位的距离都是 1.5FWHNM mi L =INT(m p -1.5FWHM 0.5) m R=INT(m p1.5FWHM 0.5) 式中m p是峰位,INT的含义是取整数。 对于存在有低能尾部的峰,其峰形函数描述(参见图)。 y m =H EXP[ —(^ —m p r / 2^2 ] m》mp 一 J 2 y m =HEXP[J(2m-2m p J)/2;「] , m< m p_ J 式中H为峰高,mp为峰位,匚是高斯函数的标准偏差,J为接点的道址和峰位之间的距离。在峰位的左侧,有一个接点,其道址为mp-J。在接点的右侧,峰函数是高斯函数。在接点的左侧,峰函数用指数曲线来描述。这时峰区的左、右边界道址为 m L=INT(m p-1.12FWHM 2/ J -0.5J 0.5) m R =INT(m p 1.5FWHM 0.5) 全谱自动寻峰 基于核素库法:能量刻度完成后,根据核素库中的能量计算对应的道址,在各个道址附 近(左右10道附近)采用简单的寻峰方法(导数法) 方法: 根据仪器选择开发 IF函数法/简单比较法(适于寻找强单峰,速度快)

DES算法源代码

#include #include void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制

算法设计心得体会(2)

算法设计心得体会 算法设计与分析学习心得 班级:物联网1201 姓名:刘潇学号:29 一、实验内容: 这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。 二、学习掌握: 基本程序描述: 货郎担问题:货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有!条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。货郎担的程序实现了利用穷举法解决货郎担问题,可以在城市个数和各地费用给定的情况下利用穷举法逐一计算出每一条路线的费用,并从中选出费用最小的路线。从而求出问题的解 费用矩阵:费用矩阵的主要内容是动态生成二维数组。首先由键盘输入自然数,费用矩阵的元素由随机数产生,并取整,把生成的矩阵存放在二维数组中,最后把矩阵内容输出到文件和屏幕上。它采用分支界限法,分支限界法的基本

思想是对包含具有约束条件的最优化问题的所有可行解的解空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解计算一个下界或上界。动态生成二维n*n的数组程序利用指针表示数组的行和列,并逐一分配空间,在输入n的数值后,系统自动分配空间,生成n*n的数组,并产生随机数填充数组,最后将结果输入到指定文件中。 Mfc:在下拉列表框中添加内容程序,在下拉列表对应的函数中利用addstring添加需要的内容。首先定义下拉列表框为ccombox型,并定义其属性名,利用addstring函数可以任意添加需要的内容。a排序问题:快速排序的运行时间与划分是否对称有关,其最坏情况发生在划分过程中产生的两个区域分别包含n-1个元素和1个元素的时候。其算法的时间复杂度为O(n 2),在最好的情况下每次划分的基准恰好为中值,可得其算法时间复杂度为O(n㏒n)。算法的实现和理解和代码实现完全是两回事,想要完全掌握一种算法,需要动手实践,用代码实现,才能理解透彻,真正掌握。b 对话框下拉列表:这个项目简单易懂,轻松实现。 三.疑问与总结: 货郎担的问题,我认为穷举法相对比而言是比较初级的方法,费时耗力,适合在练习时选用,但是在实际问题中不建议采用。克鲁斯卡尔或者普里姆算法求取最小生成树的方

算法设计与分析调研分析总结

调研分析总结报告 一、题目:深入理解傅氏与拉氏变换 二、完成人:第六组 杨锦涛PPT讲解及完成两个变换的意义与作用 岳雄完成PPT制作及实例的寻找 易全政完成调研分析总结报告与资料的修改补充 易雪媛完成寻找两个变换之间的联系和区别 尹柯立完成实例的筛选与补充 三、摘要 从时域到频域的分析方法是我们在实际问题解决过程中常用的 方式。对于一个杂乱无章的信号,当从时域方面很难开展的时候我们就会考虑从频域方面来进行相关的研究,以便找到相关的特征。而对于普通的函数通过傅里叶变换便可以得到一些我们所需求的东西,但是有类似于ex这样的衰减函数,我们就需要通过使用拉普拉斯变换,转化到复频域上面找到相关的特征。而本调研报告里面我们就是通过理解傅氏与拉氏变换,探讨两种变化间的区别及联系,以及在实际问题中的应用来加强我们对这两个变换的理解与应用。 四、引言 时域到实频域,这是傅氏变换;时域到复频域,这是拉氏变换。理解这两个变换的区别与联系,在实际应用中来谈论这两种变换的应用。以前在其他们课程里面了解过了很多关于傅里叶的知识,但是对于拉普拉斯却有些陌生,通过此次调研报告,我们将更加深入的理解

这两个变换给我们的学习、生活带来的便利。 五、调研材料分析 一)傅立叶变换 1)定义: 表示能将满足一定条件的某个函数表示成三角函数(正弦和/或 余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。最初傅立叶分析是作为热过程的解析分析的工具被提出的。 2)性质:

3)意义: 傅里叶变换在物理、数论、组合数学、信号处理等方面都有广泛的应用(例如在信号处理里面,傅里叶变换的典型用途是将信号分为幅度分量和频率分量)。 傅里叶变换就是将一个信号分解成无数的正弦波信号,通过合成得到相应的信号。对一个信号做傅里叶变换就可以得到其频域特性(幅度与相位两个方面)。 傅里叶变换简单通俗理解就是把看似杂乱无章的信号考虑成由 一定振幅、相位、频率的基本正弦(余弦)信号组合而成,傅里叶变换的目的就是找出这些基本正弦(余弦)信号中振幅较大(能量较高)信号对应的频率,从而找出杂乱无章的信号中的主要振动频率特点。如减速机故障时,通过傅里叶变换做频谱分析,根据各级齿轮转速、齿数与杂音频谱中振幅大的对比,可以快速判断哪级齿轮损伤。 二)拉普拉斯变换 1)定义: 拉普拉斯变换法是通过积分变换,把已知的时域函数变换为复频域函数,从而把时域微分方程变换为复频域代数方程。 2)性质:

DES算法源代码

void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制 char init[9]={"HTmadeit"}; //设置初始化向量为“HTmadeit” int CBC[64]; int result[13][64];

算法设计与分析学习总结

算法分析与设计 学习总结 题目:算法分析与设计学习总结 学院信息科学与工程学院专业2013级计算机应用技术 届次 学生姓名 学号2013110657 二○一三年一月十五日

算法分析与设计学习总结 本学期通过学习算法分析与设计课程,了解到:算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。算法能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。 设计的算法要具有以下的特征才能有效的完成设计要求,算法的特征有:(1)有穷性。算法在执行有限步后必须终止。(2)确定性。算法的每一个步骤必须有确切的定义。(3)输入。一个算法有0个或多个输入,作为算法开始执行前的初始值,或初始状态。(4)输出。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。 (5)可行性。在有限时间内完成计算过程。 算法设计的整个过程,可以包含对问题需求的说明、数学模型的拟制、算法的详细设计、算法的正确性验证、算法的实现、算法分析、程序测试和文档资料的编制。算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法和并行算法。 经典的算法主要有: 1、穷举搜索法 穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,bing从中找出那些符合要求的候选解作为问题的解。 穷举算法特点是算法简单,但运行时所花费的时间量大。有些问题所列举书来的情况数目会大得惊人,就是用高速计算机运行,其等待运行结果的时间也将使人无法忍受。我们在用穷举算法解决问题是,应尽可能将明显不符合条件的情况排除在外,以尽快取得问题的解。 2、迭代算法 迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或方程组)的过程,为实现这一过程所使用的方法统称为迭代法。迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0。 (2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0。 (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。 3、递推算法 递推算法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的。 4、递归算法 递归算法是一种直接或间接的调用自身的算法。 能采用递归描述的算法通常有这样的特征:为求解规模为n的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模

DES算法实现过程分析

DES算法实现过程分析 来源:中国论文下载中心 [ 03-03-18 14:30:00 ] 作者:本站会员编辑:丢oO丢oO 1. 处理密钥: 1.1 从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个”1”位.(本文如未特指,均指二进制位) 1.2 具体过程: 1.2.1 对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表所示: 表一为忽略校验位以后情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 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 1.2.2 把变换后的密钥等分成两部分,前28位记为C[0], 后28位记为D[0]. 1.2.3 计算子密钥(共16个),从i=1开始。 1.2.3.1 分别对C[i-1],D[i-1]作循环左移来生成C[i],D[i].(共16次)。每次循环左移位数 如下表所示: 循环次数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.2.3.2 串联C[i],D[i],得到一个56位数,然后对此数作如下变换以产生48位子密钥K[i]。变换过程如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 1.2.3.3 按以上方法计算出16个子密钥。 2.对64位数据块的处理: 2.1 把数据分成64位的数据块,不够64位的以适当的方式填补。 2.2对数据块作变换。 bit goes to bit bit goes to bit 58 1 57 33 50 2 49 34

算法设计与分析_总结0

这本书是《算法设计与分析》王红梅编著 一共有以下12章,我们学了1、3、4、5、6、7、8、9 分别是“绪论、蛮力法、分治法、减治法、动态规划法、贪心法、回溯法、分治限界法 第1章绪论 考点: 1、算法的5个重要特性。(P3) 答:输入、输出、有穷性、确定性、可行性 2、描述算法的四种方法分别是什么,有什么优缺点。(P4) 答: 1. 自然语言优点:容易理解;缺点:容易出现二义性,并且算法都很冗长。 2. 流程图优点:直观易懂;缺点:严密性不如程序语言,灵活性不如自然语言。 3. 程序设计语言优点:用程序语言描述的算法能由计算机直接执行;缺点:抽象性差,是算法设计者拘泥于描述算法的具体细节,忽略了“好”算法和正确逻辑的重要性,此外,还要求算法设计者掌握程序设计语言及其编程技巧。 伪代码优点:表达能力强,抽象性强,容易理解 3、了解非递归算法的时间复杂性分析。(P13) 要点:对非递归算法时间复杂性的分析,关键是建立一个代表算法运行时间的求和表达式,然后用渐进符号表示这个求和表达式。 非递归算法分析的一般步骤是: (1)决定用哪个(或哪些)参数作为算法问题规模的度量。 (2)找出算法的基本语句。 (3)检查基本语句的执行次数是否只依赖问题规模。 (4)建立基本语句执行次数的求和表达式。 (5)用渐进符号表示这个求和表达式。 [例1.4]:求数组最小值算法 int ArrayMin(int a[ ], int n) { min=a[0]; for (i=1; i

return min; } 问题规模:n 基本语句:a[i]

DES算法的简介及编程实现

实验一DES算法 实验目的: 1.深入了解DES算法的原理、特点、密钥及输入输出 2.通过编程来模拟DES算法的加密及解密过程 实验内容: 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:

二.D ES算法的编程实现 #include #include using namespace std; const static char 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 }; const static char fp[] = { //最终置换 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 }; const static char sbox[8][64] = { //s_box /* 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 */

算法分析与设计知识点总结

第一章概述 算法的概念:算法是指解决问题的一种方法或过程,是由若干条指令组成的有穷序列。 算法的特征: 可终止性:算法必须在有限时间内终止; 正确性:算法必须正确描述问题的求解过程; 可行性:算法必须是可实施的; 算法可以有0个或0个以上的输入; 算法必须有1个或1个以上的输出。 算法与程序的关系: 区别:程序可以不一定满足可终止性。但算法必须在有限时间内结束; 程序可以没有输出,而算法则必须有输出; 算法是面向问题求解的过程描述,程序则是算法的实现。 联系:程序是算法用某种程序设计语言的具体实现; 程序可以不满足算法的有限性性质。 算法描述方式:自然语言,流程图,伪代码,高级语言。 算法复杂性分析: 算法复杂性的高低体现运行该算法所需计算机资源(时间,空间)的多少。 算法复杂性度量: 期望反映算法本身性能,与环境无关。 理论上不能用算法在机器上真正的运行开销作为标准(硬件性能、代码质量影响)。 一般是针对问题选择基本运算和基本存储单位,用算法针对基本运算与基本存储单位的开销作为标准。 算法复杂性C依赖于问题规模N、算法输入I和算法本身A。即C=F(N, I, A)。 第二章递归与分治 分治法的基本思想: 求解问题算法的复杂性一般都与问题规模相关,问题规模越小越容易处理。 分治法的基本思想是,将一个难以直接解决的大问题,分解为规模较小的相同子问题,直至这些子问题容易直接求解,并且可以利用这些子问题的解求出原问题的解。各个击破,分而治之。 分治法产生的子问题一般是原问题的较小模式,这就为使用递归技术提供了方便。递归是分治法中最常用的技术。 使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。(这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。) 递归的概念:

DES算法实现 课程设计

通达学院课程设计Ⅱ报告( 2016/ 2017学年第 1 学期) 题目: DES算法实现 专业计算机科学与技术(信息安全) 学生姓名 班级学号 指导教师王波 指导单位计算机学院信息安全系 日期

DES算法的实现 一、课题内容和要求 对称加密就是加密和解密所用的密钥是一样的,加密的强度很大程度上在于密钥的强度以及加密算法的保密,最常见的对称加密算法有DES、IDEA、RC4、RC5等。本设计题要求实现DES加密和解密算法,能对文件实现加解密。 二、对设计要求的理解 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits,然后使用标准DES的算法依次对读取的64bits明密文进出加解密处理。文件的路径的输入有比较严格的格式约束。如:盘符名:\\文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。 三、概要设计 这个程序主要是 DES算法部分的加密和解密,还有后面对文件的操作。 程序主要流程图如下: 图-1 程序流程图

这个程序的关键在DES算法的操作,主要有下的主要步骤: 1.初始置换 IP; 2.子密钥 Ki 的获取; 3.密码函数 f ; 4.尾置换 IP-1 ; 下面是具体的几个过程: 1)初始置换IP 这一部分很简单,IP(initial permutation)是一个 8x8 的置换表: int 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 }; 根据表中的规定,将输入的 64 位明文重新进行排序,即将第 58 位放到第 1 位,第 50 位放到第 2 位……以此类推。初始置换以后得到的是一个 64 位的输出。 2)子密钥 Ki 的获取 用户输出的密钥是 64 位的,根据密钥置换表PC-1,将 64 位变成 56 位密钥。(去掉了奇偶校验位)将 PC-1 置换得到的 56 位密钥,分为前28位 C0 和后28位 D0,分别对它们进行循环左移,C0左移得到 C1,D0 左移得到 D1。将 C1 和 D1 合并成 56 位,然后通过PC-2表进行压缩置换,得到当前这一轮的 48 位子密钥 K1 。然后对 C1 和 D1 进行左移和压缩置换,获取下一轮的子密钥……一共进行16轮,得到 16 个 48 位的子密钥。 3)密码函数 f ●密码函数f(R, K)接受两个输入:32 位的数据和 48 位的子密钥。然后: ●通过表 E 进行扩展置换,将输入的 32 位数据扩展为 48 位; ●将扩展后的 48 位数据与 48 位的子密钥进行异或运算; ●将异或得到的 48 位数据分成 8 个 6 位的块,每一个块通过对应的一个 S 表产 生一个 4 位的输出。 其中,每个 S 表都是 4 行 16 列。具体的置换过程如下:把 6 位输入中的第 1 位和第 6 位取出来行成一个两位的二进制数 x ,作为 Si 表中的行数(0~3);把 6 位

相关文档
最新文档