信息安全技术课程设计-常用密码算法的设计与实践(编辑修改稿)内容摘要:

大素数计算相应的密钥,这里的密钥包括 公钥 e,私钥 d 以及模 n。 将生成的密钥导出存在一个文本文档中,以便使用。 然后 选择所需要加密或解密的文件,系统根据文件的类型自动分配加密或解密的算法对其进行操作。 在进行加密或解密操作时算法是较为类似的,都是进行了一个模运算的操作, 只是计算的系数有所不同, 加密时的系数为公钥 e,而解密时用的则是私钥 d。 因此在设计 RSA 算法时只需要编写一个函数 ,在程序调用此函数时传不同的参数即可实现加密与解密的功能。 ( 3) 混合加密设计 混合加密算法利用了两种加密算法对文件进行加密,该算法的主要思想如下: 首先,通过素数的生成算法,得到两个大的素数 p 和 q, 利用 RSA 加密算法中密钥生成算法,生成一把公开密钥和私有密钥,其中将 rsa 公钥通过某种方式公布出去,而把 RSA 私钥保存。 然后,通过线性同余法产生一个 64 位的随机数作为 DES 的会话密钥,对明文进行 DES 加密和解 密。 最后,是利用 RSA的公钥对会话密钥进行 RSA 加密 , 并将会话密钥进行加密保存,并与 DES 加密后的密文合并。 接收方对传送过来的密文用 RSA 生成的私钥进行解密。 ( 4) 功能函数的定义 a) DES 算法部分 关键函数 ① . 标准 DES 加密 /解密函数 static void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)。 第 13 页,共 31 页 函数共带有四个形参, Out[8]为输出字符串, In[8]为输入字符串, pSubKey为密钥, Type 是用来判断调用标准加(解)密函数时是为了加密还是解密。 ② . 设置密钥函数 static void SetKey(const char* Key, int len)。 函数共有两个形参, Key 表示初始密钥, len 表示密钥的长度。 ③ . 设置子密钥函数 static void SetSubKey(PSubKey pSubKey, const char Key[8])。 函数共有两个参数, pSubKey 是 PSubKey 类型的密钥, Key[8]是用于一个分组中的密钥。 值得说明的是 PSubKey 类型是之前在程序中以结构体形式定义的 bool 类型的数据类型,其目的用于规定标准密钥的长度。 ④ . 查表变换函数 static void Transform(bool *Out, bool *In, const char *Table, int len)。 函数共有四个形参,分别为查表前的输入 bool *In、查表后的输出 bool *Out、选择的表 const char *Table 以及返回值长度 int len。 b) RSA 算法部分 ① . 获取随即大素数函数 GetPrime(BigInt amp。 P,UINT len) 函数有两个参数,分别为大数 P,以及大数的长度。 ② . RSA 加密函数 Encrypt(char *Out,char *In,UINT len,char *KeyStr,char *ModStr) 函数共有五个参数,分别为输出加密后的结果 Out,输入加密前的文件 In,加密文件的长度 len,密钥 Key 以及模 n 的值 n。 ③ . RSA 解密函数 Decrypt(char *Out,char *In,UINT len,char *KeyStr,char *ModStr) {return Encrypt(Out,In,len,KeyStr,ModStr)。 } RSA 解密函数的参数与加密函数的参数完全相同,且返回值为加密函数的返回值。 c) 混合加密算法部分 ① . 加密函数 Encrypt(char *OutFile,char *InFile,char *RsaKeyStr,char *RsaModStr,bool 第 14 页,共 31 页 Is3DES=0) 函数共有五个参数,分别为加密后的输出文件 OutFile,加密前的输入文件InFile,加密时 RSA 的密钥 Key,模 n 的值以及是否选择三重 DES 加密。 ② . 解密函数 Decrypt(char *OutFile,char *InFile,char *RsaKeyStr,char *RsaModStr) 函数共有四个参数,与加密函数的前四个参数完全相同,分别为加密后的输出文件 OutFile,加密前的输入文件 InFile,加密时 RSA的密钥 Key 以及模 n 的值。 文件操作模块 a) 文件读取模块 文件读取模块主要是将文件中的内容读入字符数组中,由于系统的加密和解密功能是基于数组进行操作的,因此在将文件中的内容读入数组时就已经做好了加密的准备。 文件读取模块包含两方面的内容,一是需要获取文件的路径,而是要实现将文件中的内容读入 Edit 控件 以及 数组中。 b) 文件存储模块 文件存储模块主要是将加密或是解密的结果写入文件,这里为了实现分组密码体质的思想,用的是 MFC 中 CFile 类 的文件读入读出标准函数,它的好处是有一个特定的文件指针,在读入一个分组后指针自动移向下一个分组的开头。 文件存储模块的功能主要包含两部分,一部分是新建一个用于存放结果的文本文档,另一部分是将数据写入这个文本文档。 帮助模块 帮助模块主要是为使用系统的 用户提供算法原理的介绍,运用了 MFC 中的树控件进行设计。 编码 DES 核心算法模块的实现 a) 模块初始化 模块的初始化主要包含一些算法中常量定义,即初始 IP 置换表、逆初始 IP置换表、选择置换 PC1 表、选择置换 PC2 表、为选择函数 E、置换函数 P 以 第 15 页,共 31 页 及 S 盒。 这些常量的定义如下 b) 功能函数的实现 ① . 标准 DES 加(解)密函数 标准 DES 加(解)密函数是 DES 核心算法的主体,对数据或文件的加密、解密过程都需要调用这个函数对字符串或文件进行处理。 首先再次给出标准加(解)密函数的定义: void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type) 需要说明的是 PSubKey 是之前定义的 bool 类型的一个数据类型,即typedef bool (*PSubKey)[16][48],它的是为了控制密钥的位数而定义的。 Type的取值范围只有两种可能,即 ENCRYPT, DECRYPT,分别代表加密和解密, ENCRYPT, DECRYPT 是之前用枚举法 enum 所限定的取值范围。 其次,函数主要的实现功能是为了实现对数据和文件进行加密,即调用DES 类中的各类函数代码。 首先需要对输入明文或密文进行位 转化,调用ByteToBit()函数, ByteToBit()函数的目的是将文件中的字符串进行转化,转成可以进行数组操作的二进制类型。 然后按照图 的 DES 加密算法对其进行操作。 以下是程序的关键代码及注释: 定义相关数据, M 位明文字符串, tmp 位中间变量, Li 和 Ri 分别代表明文的左右两部分: static bool M[64], tmp[32], *Li=amp。 M[0], *Ri=amp。 M[32]。 调用 ByteToBit 进行位转化: ByteToBit(M, In, 64)。 初始 IP 置换: Transform(M, M, IP_Table, 64)。 判断操作类型,用 Type 取其对应的变量,用 if 语句进行判断: if( Type == ENCRYPT ) //进行加密 { …… //加密代码 } Else //进行解密,此时 Type 取 DECRYPT { 第 16 页,共 31 页 …… //解密代码 } 其中加密代码如下: F_func(Ri, (*pSubKey)[i])。 //F 函数 Xor(Ri, Li, 32)。 //异或操作 此代码进行 16 次迭代,用 for 循环实现迭代功能。 与加密过程相同 DES 的解密也同样进行以上两个操作,唯一不同的地方是函数中的参数不同, F 函数是对密文的左半边进行操作,异或函数的两个参数正好相反,其代码如下: F_func(Li, (*pSubKey)[i])。 //F 函数 Xor(Li, Ri, 32)。 //异或操作 解密过程也需要进行 16 次迭代,用 for 循环实现。 至此完成了全部标准 DES 加(解)密函数的编写,需要指出的是该函数在调用过程中需要调用到类似 Xor 异或操作的小函数,这些函数是实现在DES 类中编译好的,由于函数较多,在此就不一一赘述了,以下挑选一些较为关键的进行简单描述。 ② . 设置密钥函数 该函数的功能是对用户输入的初始密钥进行操作,其代码和注释如下: 首先将实现定义的密钥接口 deskey 数组初始化,这里选用 memset 库 函数 进行操作: memset(deskey, 0, 16)。 其次将密钥的值赋到 deskey 数组中,由于密钥的长度不确定,因此这里考虑用 memcpy 库函数进行操作,它的优点是可以对变量指定长度赋值: memcpy(deskey, Key, len16?16:len)。 最后就可以对密钥进行操作,调用设置子密钥函数: SetSubKey(amp。 SubKey[0], amp。 deskey[0])。 ③ .。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。