第一篇:基于U盘和网络的加密解密系统
软件 2016年32卷
IT传媒品牌
基于U盘和网络的加密解密系统
许永正[1]
(1.连云港杰瑞深软科技有限公司,江苏 连云港 222006)摘要:本文提出并实现了一种基于U盘和网络的加密解密系统,介绍了系统的功能和组成。整个系统由相对独立的加密系统、解密系统和校核系统三个部分组成,利用成熟的加密算法和数字签名等技术对传输的数据进行加密、解密和校验。实验结果表明,该系统极大的提高了数据的保密性和安全性。关键词:信息安全技术;加密;解密;数据安全
中图分类号:TP393.09 文献标识码:A
An Encryption and Decryption System Based on U-disk and
Network
XU Yong-zheng
(Lian Yun Gang JARI Deep Soft Technology Co.,Ltd,Lian Yun Gang
222006,China)Abstract: This paper proposes and implements a encryption to decrypt system based on u-disk and network, this paper introduces the system function and composition.The whole system consists of relatively independent system of encryption, decryption and checking system of three parts, using the mature encryption algorithm and digital signature technology for the transmission of data encryption, decryption and validation.The experimental results show that the system greatly improves the privacy and the security of data.Key words: information security technology, encryption, decryption, data security
0、引言
随着计算机网络技术的发展和Internet的普及,病毒、木马、黑客等问题日益威胁着计
[1]算机和网络的正常使用,信息安全技术越来越受到人们的重视,尤其是在商业、军事等对数据的保密性、安全性要求很高的领域。
在日常工作中,网络由于数据传输方便快捷,U盘等可读写的移动存储介质由于携带方便、可重复使用等特点,已经成为人们传输数据的主要手段和工具,但是网络数据传输容易被他人截取,移动存储介质上的数据一般都是明文存储,他人可以直接读取,数据的保密性和安全性很低。
本文实现的加密解密系统不管是通过网络还是U盘传输数据,都可以方便的对数据进行加密和解密,极大的提高了数据保密性和安全性。
1、定义
1.1 加密算法
加密解密系统的技术难点在于加密算法,如何选择合适加密算法,产生强固的密钥,提升系统安全性可靠性,是所有加密系统都要仔细考虑的。目前流行的加密算法分为单向散[3][3][3]列算法、公开密钥算法、对称算法三类。
[8]软件 2016年32卷
IT传媒品牌
1.2 单项散列算法
单项散列函数算法也称为Hash算法,是一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(不可逆过程)。Hash函数主要用于数字签名、消息的完整性检测、消息起源的认证检测等。常见的散列算法有MD5、SHA、N-hash、PIPI-MD、HAVAL等。
1.3 公开密钥算法
公开密钥算法也称为非对称算法,用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来。加密密钥可以公开,即陌生人能用加密密钥加密信息,但只有用相应的解密密钥才能解密。加密密钥叫公钥,解密密钥称为私钥。公开密钥算法的安全性都是基于复杂的数学难题,根据所基于的数学难题分类,以下三类系统目前被认为是安全有效的:大整数因子分解系统(代表性的有RSA算法)、离散对数系统(代表性的有DSA、EIGamal算法)和椭圆曲线离散对数系统(ECC算法)。公钥算法的主要局限在于,这种加密形式的速度相对较低。
1.4 对称算法
对称加密算法的加密密钥和解密密钥完全相同,所以也称为共享密钥加密或机密密钥加密。其安全性依赖于以下两个因素:第一、加密算法必须是足够强,仅仅基于密文本身去解密信息在实践中是不可能的;第二、加密数据的安全性依赖于密钥的秘密性,而不是算法的秘密性。衡量对称算法优劣的主要尺度是其密钥的长度。密钥越长,在找到解密数据所需的正确密钥之前必须测试的密钥数量就越多。需要测试的密钥越多,破解这种算法就越困难。有了好的加密算法和足够长的密钥,如果有人想在一段实际可行的时间内逆转转换过程,并从暗文中推导出明文,从计算的角度来讲,这种做法是行不通的。典型的对称加密算法包括:DES、BlowFish等。
1.5 数字签名
对文件进行加密只解决了传送信息的保密问题,而防止他人对传输的文件进行破坏,以
[5]及如何确定发信人的身份还需要采取其它的手段,这一手段就是数字签名。在电子商务安全保密系统中,数字签名技术有着特别重要的地位,在电子商务安全服务中的源鉴别、完整性服务、不可否认服务中,都要用到数字签名技术。在电子商务中,完善的数字签名应具备签字方不能抵赖、他人不能伪造、在公证人面前能够验证真伪的能力。
电子商务中数据传输的几个安全性需求 :
(1)数据的保密性:用于防止非法用户进入系统及合法用户对系统资源的非法使用;通过对一些敏感的数据文件进行加密来保护系统之间的数据交换,防止除接收方之外的第三方截获数据及即使获取文件也无法得到其内容。如在电子交易中,避免遭到黑客的袭击使信用卡信息丢失的问题。
(2)数据的完整性:防止非法用户对进行交换的数据进行无意或恶意的修改、插入,防止交换的数据丢失等。
(3)数据的不可否认性:对数据和信息的来源进行验证,以确保数据由合法的用户发出;防止数据发送方在发出数据后又加以否认;同时防止接收方在收到数据后又否认曾收到过此数据及篡改数据。
上述需求对应于防火墙、加密、数字签名、身份认证等技术,但其关键在于数字签名技术。
1.6 密钥管理体制
密码系统的两个基本要素是加密算法和密钥管理。加密算法是一些公式和法则,它规定了明文和密文之间的变换方法。由于密码系统的反复使用,仅靠加密算法已难以保证信息的安全了。事实上,加密信息的安全可靠依赖于密钥系统,密钥是控制加密算法和解密算法的关键信息,它的产生、传输、存储等工作是十分重要的。[5]软件 2016年32卷
IT传媒品牌
2、概述
本文实现的系统由加密系统、解密系统和校核系统三个部分组成。加密系统负责对待加密文件进行加密并产生密钥,将加密后的数据按照自定义格式存入移动存储介质(在本文中称之为目标卡),密钥存入另一个移动存储介质(在本文中称之为解锁卡)。同时加密系统还提供网络接口,将目标密文文件和解锁文件传输给解密系统,将待加密文件传送给校核系统;解密系统是加密系统的逆过程,它从网络接口或者可移动存储介质获得目标密文文件和密钥,将目标密文文件解密为明文,同时解密系统提供的网络接口将解密后的明文发送给校核系统;校核系统通过网络接口或者移动存储介质获得待加密文件和明文,对二者进行比对验证,并得出验证结果。三个系统分别安装在三台计算机上,它们通过预定义的接口进行通信和数据交换。
系统流程图如图1所示: 软件 2016年32卷
IT传媒品牌
加密系统加密操作选择待加密文件加密处理甲密文文件储存目标卡密钥文件储存解锁卡校核处理乙乙校核系统验证结果* 解密系统目标卡甲密文文件甲解锁卡甲密钥文件+*解密处理乙+乙明文备注:+ : 表示取甲数据或者乙数据,二者之一* : 表示取甲数据和乙数据,二者缺一不可: 表示数据流从网络传输:表示移动存储介质数据:表示存储数据:表示处理过程图1 加密解密系统流程图
由上述系统功能可见,加密数据安全性主要取决于解锁卡,需要防止非法人员同时获取解锁卡和目标卡后进行破解,所以系统还要对解锁卡中密钥进行二级加密,即采用所谓的二级密钥管理体制。
在实际使用中,如果没有校核系统,为了保证解密后数据的正确性,需要采用数字签名技术,对加密数据和密钥进行签名验证。这样保证了解密时使用的密文数据与密钥是由合法的加密系统产生的,并且没有被修改或破坏,最终确保解密后数据的正确性。
同时,解密系统需要加强密码保护机制,因为其中有用于验证签名文件的密钥文件,保护这些密钥,成为保卫系统安全的最后一道屏障。软件 2016年32卷
IT传媒品牌
由于三个系统之间需要交换数据,它们之间的数据接口也容易成为攻破系统保密措施的一个弱点。因此需要合理设计数据接口,交换数据时采用安全的加密协议。
3、加密系统
加密系统的功能为选择加密算法对原始数据进行加密,并生成密钥。然后将加密后的数据按照自定义格式存入目标卡(防止别人直接读取数据),密钥存入解锁卡。流程图如图2所示:
原原原原原原*原/原原原原原原原原原原原原原原原原原原原原原原原原原原原原*原原原原原原RSA原原原原原原原原*原原原原原原原原G0原原原原原原原原原原原原原原原原原原原原原*原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原*原原原原原S0 RSA原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原原*原原原原原原原原原原原原原原原原原原原*原原原* : 原原原原原原原原原原原原原原原原原原原原原原原原:原原原原原:原原原原原原原原原原:原原原原原原原原:原原原原图2 加密系统流程图
:原原原原原原首先用户选择加密算法对原始数据进行加密,所有的加密算法都封装在DLL中,其优点一是隐藏了算法的实现细节,二是增强了系统的可维护性和扩展性。原始数据加密后生成密文和主密钥,密文和其签名文件储存到目标卡,主密钥进行RSA加密生成工作密钥,并对工作密钥进行数字签名,然后再对RSA算法产生的私钥S0进行加密,最后将这些结果储存到解锁卡中。系统启动时调用RSA算法产生了一对安全的密钥(公钥G0和私钥S0),利用公钥G0对主密钥加密,同时进行签名文件的加密(见1.1),另外也对私钥S0进行了加密软件 2016年32卷
IT传媒品牌
(见1.2),增强系统的安全性。
加密时,系统处理流程按以下步骤进行:
(1)用户输入待加密原始数据文件(定义为OF),然后选择加密算法。(2)系统调用的加密算法程序(定义为DLL),选择的算法序号为XH, 生成“主密钥”(定义为PK),并用PK和DLL对原始数据OF加密,生成密文文件(定义为SF)。
(3)系统调用RSA算法,生成密钥对(公钥G0,私钥S0),该过程定义为WK。(4)用G0对SF进行数字签名,生成签名文件(定义为SSF)。(5)将SF与SSF合并,生成合成为已加密目标文件(定义为MSF),并保存到目标卡中;(6)用WK中的公钥G0对PK加密,生成“工作密钥”(定义为SPK)。(7)用G0对SPK进行数字签名,生成签名文件(定义为SSPK)。
(8)利用算法对WK中的私钥S0进行加密,生成“加密后内容”(定义为SS0)。(9)将XH、SS0、SPK、SSPK合并,生成合成解锁文件(定义为MSPK),并保存到解锁卡中。
3.1 数字签名及签名文件加密处理流程
数字签名及签名文件处理完成两个功能:数字签名和签名文件加密。签名文件加密时采用加密系统产生的公钥G0进行加密,因为公钥G0是随机产生的,安全性较高,并且解密用到的私钥S0也经过了加密。流程图如图3所示:
来自待签名、加密文件Hash函数计算密文散列值RSA随机算法生成的公钥G0图3 数字签名及签名文件加密流程图
RSA加密
3.2 私钥S0加密处理流程
流程图如图4所示:
随机获得一组RSA密钥对来自私钥S0甲*公钥G1*乙密钥对集合丙密钥对数组序号私钥S1RSA加密关键密钥送给加密后的内容送给加密后的内容 图4私钥S0加密流程图
私钥S0是一个相当关键的密钥,获得它就能破解工作密钥得到主密钥。传统的加密系统多采用人为方式来保证私钥的安全性,这样就降低了系统的安全性。为了增强系统的安全软件 2016年32卷
IT传媒品牌
性,这里使用了一种策略,即对私钥S0进行加密。对私钥加密采用固定密钥对,这些固定密钥对是由RSA算法产生的安全密钥对。每次私钥S0加密时,系统随机提取一组密钥对(公钥G1和私钥S1),利用公钥G1对私钥S0进行加密,然后将加密后的关键密钥和密钥对集合序号合并到解锁文件中,私钥S1不作任何处理。
4、解密系统
解密系统通过读取解锁卡上的密钥文件解密目标卡上的数据文件,从而得到还原的数据。然后将还原的数据存储到指定位置,并通过网络接口发送给校核系统。流程图如图5所示:
已加密目标文件分解甲解锁文件分解乙*密文签名文件密文**丙**工作密钥戊丁密钥对数组序号甲关键密钥*乙加密算法编号工作密钥签名文件签名验证解密私钥S0签名验证丙私钥S0*解密主密钥主密钥乙甲*解密明文明文*发送给校核系统图5解密系统流程图
解密系统还提供签名验证功能(见2.1),用来确保密文的合法性,一旦密文遭到非法篡改,系统能够及时发现。为解密出明文,系统要一步步获得密钥,首先根据关键密钥和密钥对集合序号解密出私钥S0(见2.2),再根据私钥S0和工作密钥解密出主密钥,最后才通过主密钥、密文、加密算法编号解密出明文(见2.3)。
解密系统工作步骤为:
(1)将已加密目标文件进行分解,获得密文签名文件(SSF)和密文(SF)。
(2)对SSF进行签名验证,如果合法则继续解密,若不合法则提示信息并结束解密。(3)将解锁文件进行分解为密钥对序列号(定义为KXH)、关键密钥(定义为GK)、工作密钥(SPK)、加密算法编号(XH)、工作密钥签名文件(SSPK)。
(4)将密钥对序列号(KXH)和关键密钥(GK)解密获得私钥S0。(5)将私钥S0和工作密钥SPK解密获得主密钥(PK)。(6)利用密文(SF)、主密钥(PK)和加密算法编号(XH)解密出明文(OF)。(7)提供网络接口将明文发送给校核系统。
4.1 签名验证处理流程
签名验证处理实现文件的合法性验证。如果签名文件经RSA算法解密的散列值1与被软件 2016年32卷
IT传媒品牌
签名文件经过Hash变换后的散列值2一致,则表示验证成功,否则验证失败。这里的Hash函数要和加密系统中数字签名的Hash函数一致,这样签名验证才能正常工作。流程图如图6所示:
私钥S0来自签名文件甲*RSA解密乙散列值1*甲验证成功比对+相同不同来自被签名文件(如密文)Hash函数计算散列值2乙验证失败,结束解密图6签名验证处理流程图
4.2 解密私钥S0处理流程
流程图如图7所示:
来自密钥对序号乙加密的密钥对集合*获得对应的一组密钥对甲已加密的公钥G1*乙已加密的私钥S1甲*解密私钥S1甲解密系统登录密码乙乙来自关键密钥甲*解密私钥S0送往私钥S0 图7解密私钥S0处理流程图
根据密钥对序号,系统从密钥对集合中取出已加密的公钥G1和已加密的私钥S1,对已加密的S1进行解密得到私钥S1,再利用S1将关键密钥解密为私钥S0。值的注意的是,解密系统中的密钥对集合与加密系统中的密钥对集合存在对应关系不一致。实际上,解密系统中的密钥对集合是经过加密的,它使用了解密系统登录密码进行对称算法加密。有了这样的策略,即使目标卡、解锁卡、解锁软件都被盗取(解密软件登录密码未被盗取),盗取者仍然不能解密出明文,就算盗取者通过暴力手段跳过了密码验证环节,仍然解密不出明文,因为没有软件登录密码就无法解密出私钥S1,也就无法解密出明文。
4.3 解密明文处理流程
首先系统根据加/解密算法编号确定加/解密算法,然后系统利用加/解密算法、密文、主密钥解密出明文。其中解密系统用到的加/解密算法库和加密系统使用的加/解密算法库一软件 2016年32卷
IT传媒品牌
致。流程图如图8所示:
来自密文来自主密钥来自加密算法编号乙*确定加/解密算法加/解密算法库甲乙丙加/解密算法甲**解密送给明文
图8解密明文处理流程图
5、校核系统
校核系统用来验证加密、解密的正确性和可靠性。原始数据和解密系统解密后的数据通过移动存储介质或者网络传输到校核系统进行比对,并生成验证报告。流程图如图9所示:
来自加密系统的待加密明文比对来自解密系统解密获得的明文验证报告 图9校核系统流程图
6、结论
以上设计充分考虑了系统各方面可能存在的漏洞,严密防范了各种可能攻击,让一般技术手段很难破解。首先,假设非法人员先获取了目标卡,显然他是无法单靠目标卡解密上面保存的加密数据的;那么他同时获得了目标卡和解锁卡,同样他还是无法获得数据,因为解锁卡上的密钥是被加密的,而加密它们的密钥保存在解密系统的密钥对集合中,所以他还需要获取解密系统;如果他只是想通过修改或更换数据,导致我们使用错误的数据,那么他还需要过数字签名验证这关,这同样需要工作密钥来解密签名文件;解密系统安装在舰船加固机上,我们可以通过各种硬件或软件手段保证它的安全;然后我们再假设非法人员通过某种手段又获得了解密系统的完整拷贝,那么现在他会碰到软件密码保护这个问题了,如果他没有获取到密码,即使他通过软件运行跟踪、修改跳转指令等破解手段,他会发现没有密码还是无法获取关键的工作密钥,而通过散列值反推出密码也是不可能的;最后,如何保证密码安全,这就已经不属于技术范畴的问题了。当然,以上种种分析都是建立在加密算法高强度的基础上的,只有难以在有限时间内解出的算法才能最终保护系统安全。
参考文献:
[1] 赵泽茂,朱芳.信息安全技术[M].西安:电子科技大学出版社,2009.软件 2016年32卷
IT传媒品牌 [2] 武新华.加密解密全攻略(第2版)[M].北京:中国铁道出版社,2008.[3] 林明星.数据加密技术的具体应用[J].软件,2014.35(1):100.[4] 吕素忠,张毅霞.磁盘信息的加密[N].河南通信报,2000.[5] 卿斯汉.密码学与计算机网络安全[M].北京:清华大学出版社,2001.[6] 刘芳.一种数据库加密系统的设计与实现[J].软件,2012,33(11):97-98.[7] 李晋丽,段小波,王琳.基于过滤驱动的安全密码框的研究与实现[J].软件,2013,34(4):19-22.[8] 马萌.Internet 密钥交换改进协议研究[J].软件,2013,34(5):74-75.作者简介:
许永正,男,1981--,工程师,主要研究方向:网络信息安全、企业管理软件。
江苏省科技型中小企业创新资金项目“烟草零售网络管理信息系统”(项目编号:BC2007120)。
第二篇:RSA加密解密算法C语言代码
#include
#include
#include
void sub(int a[MAX],int b[MAX] ,int c[MAX]);
struct slink {
int bignum[MAX];/*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/
struct slink *next;};
/*/-------自己建立的大数运算库------*/
void print(int a[MAX])
{
int i;
for(i=0;i printf(“%d”,a[a[99]-i-1]); printf(“nn”); return; } int cmp(int a1[MAX],int a2[MAX]){ int l1, l2;int i;l1=a1[99];l2=a2[99];if(l1>l2) return 1; if(l1 return-1; for(i=(l1-1);i>=0;i--) { if(a1[i]>a2[i]) return 1; if(a1[i] return-1; } return 0;} void mov(int a[MAX],int *b){ int j; for(j=0;j b[j]=a[j]; return;} void mul(int a1[MAX],int a2[MAX],int *c){ int i,j;int y;int x;int z;int w;int l1, l2;l1=a1[MAX-1];l2=a2[MAX-1];if(a1[MAX-2]=='-'&& a2[MAX-2]=='-') c[MAX-2]=0;else if(a1[MAX-2]=='-') c[MAX-2]='-';else if(a2[MAX-2]=='-') c[MAX-2]='-';for(i=0;i for(j=0;j { x=a1[i]*a2[j]; y=x/10; z=x%10; w=i+j; c[w]=c[w]+z; c[w+1]=c[w+1]+y+c[w]/10; c[w]=c[w]%10; } } w=l1+l2;if(c[w-1]==0)w=w-1;c[MAX-1]=w;return;} void add(int a1[MAX],int a2[MAX],int *c){ int i,l1,l2;int len,temp[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-')){ c[MAX-2]='-';} else if(a1[MAX-2]=='-'){ mov(a1,temp);temp[MAX-2]=0;sub(a2,temp,c);return;} else if(a2[MAX-2]=='-'){ mov(a2,temp);temp[98]=0;sub(a1,temp,c);return;} if(l1 c[i]=(a1[i]+a2[i]+k)%10; k=(a1[i]+a2[i]+k)/10;} if(l1>len){ for(i=len;i { c[i]=(a1[i]+k)%10; k=(a1[i]+k)/10; } if(k!=0) { c[l1]=k; len=l1+1; } else len=l1;} else { for(i=len;i { c[i]=(a2[i]+k)%10; k=(a2[i]+k)/10; } if(k!=0) { c[l2]=k; len=l2+1; } else len=l2;} c[99]=len; return;} void sub(int a1[MAX],int a2[MAX],int *c){ int i,l1,l2;int len,t1[MAX],t2[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-')){ mov(a1,t1); mov(a2,t2);t1[MAX-2]=0; t2[MAX-2]=0;sub(t2,t1,c);return;} else if(a2[MAX-2]=='-'){ mov(a2,t2);t2[MAX-2]=0;add(a1,t2,c);return;} else if(a1[MAX-2]=='-'){ mov(a2,t2);t2[MAX-2]='-';add(a1,t2,c);return;} if(cmp(a1,a2)==1){ len=l2;for(i=0;i if((a1[i]-k-a2[i])<0){ c[i]=(a1[i]-a2[i]-k+10)%10; k=1;} else { c[i]=(a1[i]-a2[i]-k)%10; k=0; } } for(i=len;i { if((a1[i]-k)<0){ c[i]=(a1[i]-k+10)%10; k=1;} else { c[i]=(a1[i]-k)%10; k=0; } } if(c[l1-1]==0)/*使得数组C中的前面所以0字符不显示了,如1000-20=0980--->显示为980了*/ { len=l1-1; i=2; while(c[l1-i]==0)/*111456-111450=00006,消除0后变成了6;*/ { len=l1-i; i++; } } else { len=l1; } } else if(cmp(a1,a2)==(-1)){ c[MAX-2]='-'; len=l1; for(i=0;i if((a2[i]-k-a1[i])<0){ c[i]=(a2[i]-a1[i]-k+10)%10; k=1;} else { c[i]=(a2[i]-a1[i]-k)%10; k=0; } } for(i=len;i { if((a2[i]-k)<0){ c[i]=(a2[i]-k+10)%10; k=1;} else { c[i]=(a2[i]-k)%10; k=0; } } if(c[l2-1]==0) { len=l2-1; i=2; while(c[l1-i]==0) { len=l1-i; i++; } } else len=l2; } else if(cmp(a1,a2)==0) { len=1; c[len-1]=0; } c[MAX-1]=len;return;} void mod(int a[MAX],int b[MAX],int *c)/*/c=a mod b//注意:经检验知道此处A和C的数组都改变了。*/ { int d[MAX];mov(a,d);while(cmp(d,b)!=(-1))/*/c=a-b-b-b-b-b.......until(c sub(d,b,c); mov(c,d);/*/c复制给a*/ } return;} void divt(int t[MAX],int b[MAX],int *c ,int *w)/*//试商法//调用以后w为a mod b, C为a div b;*/ { int a1,b1,i,j,m;/*w用于暂时保存数据*/ int d[MAX],e[MAX],f[MAX],g[MAX],a[MAX]; mov(t,a); for(i=0;i e[i]=0;for(i=0;i d[i]=0;for(i=0;i b1=b[MAX-1];if(cmp(a,b)==(-1)){ c[0]=0; c[MAX-1]=1; mov(t,w); return;} else if(cmp(a,b)==0){ c[0]=1; c[MAX-1]=1; w[0]=0; w[MAX-1]=1; return;} m=(a1-b1); for(i=m;i>=0;i--)/*341245/3=341245-300000*1--->41245-30000*1--->11245-3000*3--->2245-300*7--->145-30*4=25--->25-3*8=1*/ { for(j=0;j d[j]=0; d[i]=1; d[MAX-1]=i+1; mov(b,g); mul(g,d,e); while(cmp(a,e)!=(-1)) { c[i]++; sub(a,e,f); mov(f,a);/*f复制给g*/ } for(j=i;j e[j]=0; } mov(a,w);if(c[m]==0)c[MAX-1]=m;else c[MAX-1]=m+1; return;} void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m)/*解决 了 m=a*b mod n;*/ { int c[MAX],d[MAX];int i;for(i=0;i d[i]=c[i]=0;mul(a,b,c); divt(c,n, d,m); for(i=0;i printf(“%d”,m[m[MAX-1]-i-1]); printf(“nm length is : %d n”,m[MAX-1]);} /*接下来的重点任务是要着手解决 m=a^p mod n的函数问题。*/ void expmod(int a[MAX] ,int p[MAX] ,int n[MAX],int *m){ int t[MAX],l[MAX],temp[MAX];/*/t放入2,l放入1;*/ int w[MAX],s[MAX],c[MAX],b[MAX],i;for(i=0;i b[i]=l[i]=t[i]=w[i]=0;t[0]=2;t[MAX-1]=1;l[0]=1;l[MAX-1]=1; mov(l,temp);mov(a,m); mov(p,b); while(cmp(b,l)!=0){ for(i=0;i divt(b,t,w,c);/*// c=p mod 2 w= p /2*/ mov(w,b);/*//p=p/2*/ if(cmp(c,l)==0)/*/余数c==1*/ { for(i=0;i mul(temp,m,w); mov(w,temp); for(i=0;i divt(temp,n,w,c);/* /c为余c=temp % n,w为商w=temp/n */ mov(c,temp);} for(i=0;i mul(m,m,s);//s=a*a for(i=0;i divt(s,n,w,c);/*/w=s/n;c=s mod n*/ mov(c,m);} for(i=0;i mul(m,temp,s); for(i=0;i divt(s,n,w,c); mov(c,m);/*余数s给m*/ m[MAX-2]=a[MAX-2];/*为后面的汉字显示需要,用第99位做为标记*/ return;/*/k=temp*k%n;*/ } int is_prime_san(int p[MAX]){ int i,a[MAX],t[MAX],s[MAX],o[MAX]; for(i=0;i s[i]=o[i]=a[i]=t[i]=0; t[0]=1; t[MAX-1]=1; a[0]=2;// { 2,3,5,7 } a[MAX-1]=1; sub(p,t,s); expmod(a, s, p ,o); if(cmp(o,t)!= 0) { return 0; } a[0]=3; for(i=0;i expmod(a, s, p ,o); if(cmp(o,t)!= 0) { return 0; } a[0]=5; for(i=0;i expmod(a, s, p ,o); if(cmp(o,t)!= 0) { return 0; } a[0]=7; for(i=0;i expmod(a, s, p ,o); if(cmp(o,t)!= 0) { return 0; } return 1;} int coprime(int e[MAX],int s[MAX])/*//// 求两个大数之间是否互质////*/ { int a[MAX],b[MAX],c[MAX],d[MAX],o[MAX],l[MAX]; int i;for(i=0;i l[i]=o[i]=c[i]=d[i]=0;o[0]=0;o[MAX-1]=1;l[0]=1;l[MAX-1]=1;mov(e,b);mov(s,a);do { if(cmp(b,l)==0){ return 1;} for(i=0;i }while(cmp(c,o)!=0);/* printf(“Ihey are not coprime!n”);*/ return 0;} void prime_random(int *p,int *q){ int i,k;time_t t; p[0]=1; q[0]=3; // p[19]=1;// q[18]=2; p[MAX-1]=10; q[MAX-1]=11; do { t=time(NULL); srand((unsigned long)t);for(i=1;i k=rand()%10;} p[p[MAX-1]-1]=k; }while((is_prime_san(p))!=1); printf(“素数 p 为 : ”); for(i=0;i printf(“nn”); do { t=time(NULL); srand((unsigned long)t);for(i=1;i }while((is_prime_san(q))!=1); printf(“素数 q 为 : ”); for(i=0;i printf(“nn”);return;} void erand(int e[MAX],int m[MAX]){ int i,k;time_t t;e[MAX-1]=5;printf(“随机产生一个与(p-1)*(q-1)互素的 e :”); do { t=time(NULL); srand((unsigned long)t);for(i=0;i k=rand()%10;e[e[MAX-1]-1]=k;}while(coprime(e, m)!=1); for(i=0;i printf(“nn”);return;} void rsad(int e[MAX],int g[MAX],int *d){ int r[MAX],n1[MAX],n2[MAX],k[MAX],w[MAX];int i,t[MAX],b1[MAX],b2[MAX],temp[MAX];mov(g,n1);mov(e,n2);for(i=0;i k[i]=w[i]=r[i]=temp[i]=b1[i]=b2[i]=t[i]=0;b1[MAX-1]=0;b1[0]=0;/*/b1=0;*/ b2[MAX-1]=1;b2[0]=1;/*/b2=1;*/ while(1){ for(i=0;i k[i]=w[i]=0; divt(n1,n2,k,w);/*/k=n1/n2;*/ for(i=0;i temp[i]=0; mul(k,n2,temp);/*/temp=k*n2;*/ for(i=0;i r[i]=0; sub(n1,temp,r); if((r[MAX-1]==1)&&(r[0]==0))/*/r=0*/ { break; } else { mov(n2,n1);/*/n1=n2;*/ mov(r,n2);/*/n2=r;*/ mov(b2, t);/*/t=b2;*/ for(i=0;i temp[i]=0; mul(k,b2,temp);/*/b2=b1-k*b2;*/ for(i=0;i b2[i]=0; sub(b1,temp,b2); mov(t,b1); } } for(i=0;i t[i]=0; add(b2,g,t); for(i=0;i temp[i]=d[i]=0; divt(t,g,temp,d); printf(“由以上的(p-1)*(q-1)和 e 计算得出的 d : ”); for(i=0;i printf(“nn”);} /*/求解密密钥d的函数(根据Euclid算法)***68000*/ unsigned long rsa(unsigned long p,unsigned long q,unsigned long e)/*/求解密密钥d的函数(根据Euclid算法)*/ { unsigned long g,k,r,n1,n2,t;unsigned long b1=0,b2=1; g=(p-1)*(q-1);n1=g;n2=e; while(1){ k=n1/n2; r=n1-k*n2; if(r!=0) { n1=n2; n2=r; t=b2; b2=b1-k*b2; b1=t; } else { break; } } return(g+b2)%g;} /*/-----------导入导出公钥和私钥-----/*/ void loadpkey(int e[MAX],int n[MAX])//导入公钥 { FILE *fp;char filename[25],str[MAX],ch;int i,k;for(i=0;i e[i]=n[i]=0;while(1){ printf(“n”);printf(“为导入(e,n),请输入加密密钥对文件路径: n”); scanf(“%s”,filename); if((fp=fopen(filename,“r”))==NULL) printf(“输入的文件不存在,请重新输入!n”); else break;} k=0; while((ch=fgetc(fp))!=EOF) { if(ch!=' ') { str[k]=ch; k++; } else { for(i=0;i { e[i]=str[k-i-1]-48; } e[MAX-1]=k; k=0; } } for(i=0;i n[i]=str[k-i-1]-48; n[MAX-1]=k; printf(“n加密密钥 e : ”); for(i=0;i printf(“%d”,e[e[MAX-1]-i-1]); printf(“n”); printf(“n 公钥 n : ”); for(i=0;i printf(“%d”,n[n[MAX-1]-i-1]); printf(“n”); fclose(fp); printf(“n导入(e,n)成功!n”); getchar();} void loadskey(int d[MAX],int n[MAX])//导入私钥 { { FILE *fp;char filename[25],str[MAX],ch;int i,k;for(i=0;i d[i]=n[i]=0;while(1){ printf(“为导入(d,n),请输入解密密钥对文件的路径: n”); scanf(“%s”,filename); if((fp=fopen(filename,“r”))==NULL) { printf(“输入的文件不存在,请重新输入!n”); } else break;} k=0; while((ch=fgetc(fp))!=EOF) { if(ch!=' ') { str[k]=ch; k++; } else { for(i=0;i { d[i]=str[k-i-1]-48; } d[MAX-1]=k; k=0; } } for(i=0;i n[i]=str[k-i-1]-48; n[MAX-1]=k; printf(“n解密密钥 d : ”); for(i=0;i printf(“%d”,d[d[MAX-1]-i-1]); printf(“n”); printf(“n 公钥 n : ”); for(i=0;i printf(“%d”,n[n[MAX-1]-i-1]); printf(“n”); fclose(fp); printf(“n导入(d,n)成功!n”); getchar();} } void savepkey(int e[MAX],int n[MAX])//导出公钥 { FILE *fp; int i; char savefile[25],ch;printf(“导出加密密钥(e,n),存放的文件路径为: ”); scanf(“%s”,savefile);printf(“n”); fp=fopen(savefile,“w”);for(i=0;i ch=e[e[MAX-1]-i-1]+48; fputc(ch,fp);} ch=' ';fputc(ch,fp);for(i=0;i ch=n[n[MAX-1]-i-1]+48; fputc(ch,fp);} fclose(fp);printf(“n保存(e,n)操作完成!n”);} void saveskey(int d[MAX],int n[MAX])//导出私钥 { FILE *fp; int i; char savefile[25],ch;printf(“导出解密密钥(d,n),存放的文件路径为: ”); scanf(“%s”,savefile);printf(“n”); fp=fopen(savefile,“w”);for(i=0;i ch=d[d[MAX-1]-i-1]+48; fputc(ch,fp);} ch=' ';fputc(ch,fp);for(i=0;i ch=n[n[MAX-1]-i-1]+48; fputc(ch,fp);} fclose(fp);printf(“n保存(d,n)操作完成!n”); } /*/-----------加密和解密的块-----/*/ void printbig(struct slink *h){ struct slink *p; int i; p=(struct slink *)malloc(LEN); p=h; if(h!=NULL)do { for(i=0;i bignum[MAX-1];i++) printf(“%d”,p->bignum[p->bignum[MAX-1]-i-1]); p=p->next;} while(p!=NULL); printf(“nn”); } void tencrypto(int e[MAX], int n[MAX])/*//对有需要的文件进行加密*/ { FILE *fp; int i,k,count,temp,c; char filename[25],ch,encryfile[25]; struct slink *p,*p1,*p2; struct slink *h; h=p=p1=p2=(struct slink *)malloc(LEN); h=NULL; printf(“n输入需要加密的文件路径 : ”); scanf(“%s”,filename); if((fp=fopen(filename,“r”))==NULL) { printf(“Cannot open file!n”); exit(0); } printf(“n文件的原文内容:nn”); count=0; while((ch=fgetc(fp))!=EOF) { putchar(ch); c=ch; k=0;if(c<0){ c=abs(c);/*/把负数取正并且做一个标记*/ p1->bignum[MAX-2]='0';} else { p1->bignum[MAX-2]='1';} while(c/10!=0){ temp=c%10; c=c/10; p1->bignum[k]=temp; k++;} p1->bignum[k]=c; p1->bignum[MAX-1]=k+1;count=count+1;if(count==1) h=p1;else p2->next=p1;p2=p1; p1=(struct slink *)malloc(LEN);} p2->next=NULL; printf(“n”); fclose(fp); // printf(“加密后文件的保存路径 : n”);// scanf(“%s”,encryfile);// fp=fopen(encryfile,“w”); fp=fopen(filename,“w”); p=p1=(struct slink *)malloc(LEN); p=h; printf(“n加密后文件中所形成密文:nn”); if(h!=NULL)do { expmod(p->bignum , e ,n ,p1->bignum); ch=p1->bignum[MAX-2]; printf(“%c”,ch); fputc(ch,fp); if((p1->bignum[MAX-1]/10)==0)/*/判断p1->bignum[99]的是否大于十;*/ { ch=0+48; printf(“%c”,ch); fputc(ch,fp); ch=p1->bignum[MAX-1]+48; printf(“%c”,ch); fputc(ch,fp); } else { ch=p1->bignum[MAX-1]/10+48; printf(“%c”,ch); fputc(ch,fp); ch=p1->bignum[MAX-1]%10+48; printf(“%c”,ch); fputc(ch,fp); } for(i=0;i bignum[MAX-1];i++) { printf(“%d”,p1->bignum[i]); ch=p1->bignum[i]+48; fputc(ch,fp); } p=p->next; p1=(struct slink *)malloc(LEN);}while(p!=NULL);printf(“nn”); fclose(fp);return;} void tdecrypto(int d[MAX], int n[MAX]){ FILE *fp; struct slink *h,*p1,*p2; char ch,encryfile[25],decryfile[25]; int i,j,k,c,count,temp; printf(“n输入加密过的文件路径 : ”); scanf(“%s”,encryfile); if((fp=fopen(encryfile,“r”))==NULL) { printf(“此文件不存在!n”); exit(0); } printf(“n文件中密文内容:nn”); i=0; j=3; count=0; h=p1=p2=(struct slink *)malloc(LEN); while((ch=fgetc(fp))!=EOF) { putchar(ch); c=ch; if(j==3) { p1->bignum[MAX-2]=c; j--; } else if(j==2) { temp=c-48; j--; } else if(j==1) { p1->bignum[MAX-1]=temp*10+c-48; j--; } else if(j==0) { p1->bignum[i]=c-48; i++; if(i==p1->bignum[MAX-1]) { i=0; j=3; count++; if(count==1) h=p1; else p2->next=p1; p2=p1; p1=(struct slink *)malloc(LEN); } } } p2->next=NULL; printf(“n”); fclose(fp); // printf(“解密后的明文文件保存路径 : n”);// scanf(“%s”,decryfile);// fp=fopen(decryfile,“w”); fp=fopen(encryfile,“w”);printf(“n解密密文后文件中的明文:nn”);p2=(struct slink *)malloc(LEN); p1=h;k=0;if(h!=NULL)/*/temp为暂存ASIIC码的int值*/ do { for(i=0;i p2->bignum[i]=0; expmod(p1->bignum , d ,n ,p2->bignum); temp=p2->bignum[0]+p2->bignum[1]*10+p2->bignum[2]*100; if((p2->bignum[MAX-2])=='0') { temp=0-temp; }/*/转化为正确的ASIIC码,如-78-96形成汉字 */ ch=temp;/* str[k]--->ch */ printf(“%c”,ch);/* str[k]--->ch */ fputc(ch,fp);/*/写入文件str[k]--->ch*/ k++; p1=p1->next; p2=(struct slink *)malloc(LEN); }while(p1!=NULL); printf(“nn”); fclose(fp);return;} struct slink *input(void)/*/输入明文并且返回头指针,没有加密时候转化的数字*/ { struct slink *head; struct slink *p1,*p2; int i,n,c,temp; char ch; n=0;p1=p2=(struct slink *)malloc(LEN);head=NULL;printf(“n请输入你所要加密的内容 : n”);while((ch=getchar())!='n') { i=0;c=ch;if(c<0){ c=abs(c);/*/把负数取正并且做一个标记*/ p1->bignum[MAX-2]='0';} else { p1->bignum[MAX-2]='1';} while(c/10!=0){ temp=c%10; c=c/10; p1->bignum[i]=temp; i++;} p1->bignum[i]=c; p1->bignum[MAX-1]=i+1;n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1; p1=(struct slink *)malloc(LEN);} p2->next=NULL; return(head);} struct slink *jiami(int e[MAX],int n[MAX],struct { struct slink *p; struct slink *h; struct slink *p1,*p2; int m=0,i;printf(“n”); printf(“加密后形成的密文内容:n”);p1=p2=(struct slink*)malloc(LEN);h=NULL; p=head; if(head!=NULL)do slink *head){ expmod(p->bignum , e ,n ,p1->bignum); for(i=0;i bignum[MAX-1];i++){ printf(“%d”,p1->bignum[p1->bignum[MAX-1]-1-i]);} m=m+1;if(m==1) h=p1;else p2->next=p1;p2=p1; p1=(struct slink *)malloc(LEN); p=p->next;} while(p!=NULL);p2->next=NULL; p=h; printf(“n”); return(h); } void jiemi(int d[MAX],int n[MAX],struct slink *h){ int i,j,temp; struct slink *p,*p1; char ch[65535]; p1=(struct slink*)malloc(LEN); p=h; j=0; if(h!=NULL) do { for(i=0;i p1->bignum[i]=0; expmod(p->bignum , d ,n ,p1->bignum); temp=p1->bignum[0]+p1->bignum[1]*10+p1->bignum[2]*100; if((p1->bignum[MAX-2])=='0') { temp=0-temp; } ch[j]=temp; j++; p=p->next;}while(p!=NULL);printf(“n”);printf(“解密密文后所生成的明文:n”);for(i=0;i printf(“%c”,ch[i]);printf(“n”);return; } void menu(){ printf(“nnn”);printf(“nnn”);printf(“ R--------产生密钥对 nnn”); printf(“ S--------保存密钥对 nnn”);printf(“ L--------载入密钥对 nnn”);printf(“ E--------对文件加密 nnn”);printf(“ D--------对文件解密 nnn”);printf(“ T--------简单测试 nnn”);printf(“ Q--------退出 nnn”);printf(“请选择一种操作:”);} /*/------------------主MAIN函数----/*/ void main(){ int i; char c; int p[MAX],q[MAX],n[MAX],d[MAX],e[MAX],m[MAX],p1[MAX],q1[MAX];struct slink *head,*h1,*h2; for(i=0;i m[i]=p[i]=q[i]=n[i]=d[i]=e[i]=0;/*/简单初始化一下*/ while(1) { menu(); c=getchar(); getchar();//接受回车符 if((c=='r')||(c=='R'))//操作r产生密钥对 { for(i=0;i m[i]=p[i]=q[i]=n[i]=d[i]=e[i]=0; printf(“nnnnnnnnn”); printf(“nn随机密钥对产生如下:nn”); prime_random(p,q);/*/随机产生两个大素数*/ mul(p,q,n); printf(“由 p、q 得出 n :”); print(n); mov(p,p1); p1[0]--; mov(q,q1); q1[0]--; /*/q-1;*/ mul(p1,q1,m);//m=(p-1)*(q-1) erand(e,m); rsad(e,m,d); printf(“密钥对产生完成,现在可以直接进行加解密文件!n”); printf(“n按任意键回主菜单…………”); getchar();} else if((c=='l')||(c=='L')) { printf(“nn选择导入密钥类型:加密密钥(P)还是解密密钥(S)?”); c=getchar(); getchar(); if((c=='p')||(c=='P')) loadpkey(e,n); else if((c=='s')||(c=='S')) loadskey(d,n); printf(“n按任意键回主菜单…………”); getchar(); } else if((c=='e')||(c=='E')) { tencrypto(e, n); printf(“n加密文件操作完成!n”); printf(“n按任意键回主菜单…………”); getchar(); getchar(); } else if((c=='d')||(c=='D')) { tdecrypto(d, n); printf(“n解密文件操作完成!n”); printf(“n按任意键回主菜单…………”); getchar(); getchar(); } else if((c=='s')||(c=='S')) { savepkey(e,n); printf(“n”); saveskey(d,n); printf(“n按任意键回主菜单…………”); getchar(); getchar(); } else if((c=='T')||(c=='t')) { head=input(); h1=jiami(e, n, head); jiemi(d, n, h1); printf(“nRSA测试工作完成!n”); printf(“n按任意键回主菜单…………”); getchar(); } else if((c=='Q')||(c=='q')) break; } } 台电“加密大师”制作方法 Ver:3.0 ※注意:请在操作前一定要做好重要数据备份的工作! 如果您没有“加密大师”程序,可到“台电网站“(www.xiexiebang.com)—>”驱动下载“—>”可移动存储驱动程序“栏下载;下载时一定要对应产品型号。 此制作方法适用于钛金系列、晶彩系列、晶灵III系列、晶致系列、欣悦系列、风尚系列、晶典系列、酷奇系列、精英系列、潮系列。 一、“格式化”(设置_删除加密大师)操作说明 *、特别提示——使用台电“格式化”工具(设置_删除加密大师)格式化“已开启了加密大师”的产品时,必须是在未输入密码登入到加密区之前进行格式化操作;一定不能在输入密码登入到加密区后再执行台电“格式化”工具(设置_删除加密大师)进行格式化操作。1.1 将本产品插入到电脑后,然后打开“我的电脑”并双击“台电酷闪”盘符,进入到“台电酷闪”中,如图 一、图二所示; 图一 图二 1.2 双击运行“使用工具及帮助文档”文件夹,如图三所示; 图三 1.3 双击运行“设置_删除加密大师”软件,此时将弹出如下图四所示的窗口; 图四 1.4 直接点击“开始格式化”,程序将对整个U盘进行格式化,此时所有数据将被删除,U盘将格式化成一个公共区;单击“确定”后再安全移除U盘,即完成“格式化”操作;如图五所示; 图五 注1:当“格式化”完成后移动存储盘内将会产生“应用工具﹝设置_删除加密大师.exe﹞” 的备份; 二、开启“加密大师”(设置U盘密码) 2.1 首先参照本说明的“1.1-1.3”小节,运行“设置_删除加密大师”,并选择“安全”项;如图六所示; 图六 注2:“输入密码”——输入保密区的使用密码,最少为一个字符,最多为13个字符; 注3:“确认密码”——再次确认保密的使用密码; 注4:“提示”——保密区之密码提示,可输入任何字符,最多为 16 个字符, 2.2 勾选“密码”框,此时“输入保密”及“确认密码”栏中可能是输入您想设置的密码,密码最多13个字符,最少为一个字符。输入完成后您请再点选“分区”项并在此项中调节“保密区”容量的百分比,若您未调节分区的大小则“加密区”默认为“3MB”;如图七所示; 图七 注4: 当您点选“安全”项设定中的“密码”并设置后,“分区”项里的容量拖动条才可以任意滑动; 注5:您可调整“公共区”及“保密区”的调整杆来设定分割各区域的容量,保密区与公共区启用后最小分割容量均为“3MB”; 2.3 设置好“密码”及“容量百分比”设定后,点击“开始格式化”进行加密制作,格式化完成后安全移除U盘即完成加密设置; 图八 注6: 加密设置成功后,U盘会生产“保密区”及”“公共区”;“公共区”可直接使用,“加密区”需要运行“加密大师”并输入正确密码后才能访问; 2.3 “加密大师”程序为“Lock.exe”,您只需用鼠标双击她即可运行;如图九所示; 图九 注7:“已加锁”表示保密区已上锁,此时U盘仅可使用的是公共区;若为“未加锁”则表示保密区未上锁,可使用 U盘 “保密区”; 注8:“开锁”——若U盘设定有保密功能,输入密码后按下“开锁”按钮将可进入保密数据区; 注9:“更改密码”——按下此按钮將会出現更改密码的对话框,用户只需按照提示进行密码更换;如下图十所示; 图十 2.4 退加密区时,请双击加密区中的“密大师”程序为“Lock.exe”,再点击“加锁”按键即可;如图十一所示; 图十一 C 语 言 课 程 设 计 实 验 报 告 实验名称:文件加密解密 院系:软件学院 学号: 年9月3日—9月17日 日期:2012 一:设计题目 1:设计图形用户界面。 2:对文件进行加密并对加密文件进行保存。3:对加密了的文件进行解密。 二:设计过程 设计过程中遇到的困难和解决方法: 1:不能很好地理解题意(通过老师的讲解)。 2:不知道如何设计加密解密程序(通过翻阅书籍和上网查找资料)过程: 首先通过学习老师提供的资料了解大致的设计过程并懂得运用一些以前没有学习过的c语言。先利用文本文件设计出加密解密的主要过程并能运行。知道如何运用fopen将原文件打开并用fread将原文件内容读出来,然后进行加密设计并将加密的数据用fwrite写进指定的文件中并保存。然后读出加密的文件并解密并保存。最后在写出的程序中加入图形用户界面,运用window,box,gotoxy等进行设计。 三:源代码 #include ///////////////////////////////////////////////////////////////加密解密 */ void fun(char *list,char *sd)/*加密过程*/ { FILE *fp1,*fp2;char buf[1000];/*文件临时存放处*/ register int ch;fp1=fopen(“e:list.txt”,“r”);/*用可读方式打开文件*/ fp2=fopen(“e:sd.txt”,“w”);/*用可写方式创建一个文件*/ if(fp1==NULL){ printf(“cannot open filen”);exit(1);} if(fp2==NULL){ printf(“cannot build filen”);exit(1);} ch=fgetc(fp1);/*读出打开文件的光标处的一个字符*/ while(!feof(fp1))/*读出的字符不是最后的字符*/ { ch=ch<<1;/*加密方法*/ fputc(ch,fp2);/*加密的字符存放在指定的地方*/ ch=fgetc(fp1); } rewind(fp2);/*将光标移动到第一个字符前面*/ fread(buf,sizeof(buf),1,fp2);/*从文件的当前位置开始中读取buf中存放的数据*/ printf(“%s”,buf);/*fclose(fp1);fclose(fp2);*/ } void man(char *sd,char *ds)/*解密过程*/ { /*int n=0;*/ FILE *fp2,*fp3;register int fh;char buf1[1000]; fp2=fopen(“e:sd.txt”,“rb”);/*用可读方式打开文件*/ fp3=fopen(“e:ds.txt”,“wb”);/*用可写方式创建一文件*/ if(fp2==NULL){ printf(“cannot open filen”);exit(1);} if(fp3==NULL){ printf(“cannot build filen”);exit(1);} fh=fgetc(fp2);/*从光标处读出一个字符*/ while(!feof(fp2))/*当读出的字符到达最后一个则停止*/ { fh=fh>>1;/*解密方式*/ fputc(fh,fp3);/*解密的字符存放在指定的地方*/ fh=fgetc(fp2);} fread(buf1,sizeof(buf1),1,fp3);/*读出buf1中所存放的数据*/ printf(“%s”,buf1);} void main(){ int k;char *f[]={“jiami”,“jiemi”};/**界面的形式/ int key,y;int j,q;char list[300];char sd[300];char ds[300];char ch,fh;char buf[1000];char buf1[1000];FILE *fp1;FILE *fp2;int l1,l2;window(1,1,80,25);/*left,top,right,bottom,相对于屏幕的字符坐标,屏幕原点在左上角*/ gettext(20,10,40,14,buf);/*保存矩形屏幕上的字符*/ textbackground(7);/*背景颜色*/ textcolor(0);/*字体颜色*/ clrscr();/*清除矩形屏幕上的所有字符*/ gotoxy(24,10);/*将当前字符屏幕的光标位置移动到x,y的坐标位子*/ printf(“%s”,f[0]);gotoxy(24,14);printf(“%s”,f[1]);gettext(10,8,60,16,buf);box(22,9,3,30);/*建立一个小窗口*/ key=0;while(1){ while(bioskey(1)==0);/*读取键盘值查询键盘是否按下*/ key=get_key();/*按下了什么键盘*/ if(key==key_up||key==key_down){ y=wherey();/*得到字符模式下窗口光标的x坐标数值*/ if(key==key_up)y=y==10? y+4:10;/*当y=10光标向下移动四个位置否则将光标移动到y=10处*/ if(key==key_down)y=y==14? y-4:14;/*当y=14光标向下移动四个位置否则将光标移动到y=14处*/ puttext(10,8,60,16,buf);/*将gettext函数保存的字符恢复到屏幕上 */ gotoxy(24,y); if(y==10){ textbackground(7);textcolor(0);box(22,9,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[0]);} else { textbackground(7);textcolor(0);box(22,13,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[1]);} } if(key==key_enter&&y==10)且光标在y=10处 /*当按下enter键且光标在y=10处进行下步*/ { clrscr();textbackground(3);textcolor(15);/*clrscr();*/ gotoxy(24,5);printf(“input the file name for jiamin”);/*用户给需要加密的文件加密 */ l1=strlen(“input the file name for jiami:”);/*待求长度的字符串指针*/ gotoxy(24+l1,5);scanf(“%s”,list);gotoxy(24,10);printf(“input file name for saven”);/*给加密后的文件命名,并保存*/ l2=strlen(“input file name for save:”);gotoxy(24+l2,10);scanf(“%s”,sd);fun(list,sd);fp1=fopen(“e:sd.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp1);gotoxy(10,15);printf(“%sn”,buf1);getch();printf(“file haven jiami ,save now”);getche();break;} if(key==key_enter&&y==14){ clrscr();textbackground(3);textcolor(15);gotoxy(24,5); printf(“input the file name for jiemi n”);/*用户给需要解密的文件解密 */ l1=strlen(“input the file name for jiemi: ”);gotoxy(24+l1,5);scanf(“%s”,sd);gotoxy(24,10);printf(“input file name for save:n”);/*对解密的文件系统又可以提供保存路径 */ l2=strlen(“input file name for save: ”);gotoxy(24+l2,10);scanf(“%s”,ds);man(sd,ds);fp2=fopen(“e:ds.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp2);gotoxy(10,15);printf(“%sn”,buf1);getch(); printf(“file haven jiemi,save now”);getche();break;} } window(1,1,80,25);gettext(20,10,40,14,buf); textbackground(7);textcolor(0);clrscr();gotoxy(24,10);printf(“%s”,f[0]);gotoxy(24,14);printf(“%s”,f[1]);gettext(10,8,60,16,buf);box(22,9,3,30);key=0;while(1){ while(bioskey(1)==0);key=get_key(); if(key==key_up||key==key_down){ y=wherey();if(key==key_up)y=y==10? y+4:10;if(key==key_down)y=y==14? y-4:14;puttext(10,8,60,16,buf); gotoxy(24,y); if(y==10)/*光标在10处的窗口*/ { textbackground(7);textcolor(0);box(22,9,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[0]);} else { textbackground(7);textcolor(0);box(22,13,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[1]);} } if(key==key_enter&&y==10){ clrscr();textbackground(3);textcolor(15);/*clrscr();*/ gotoxy(24,5);printf(“input the file name for jiamin”);/*用户给需要加密的文件加密 */ l1=strlen(“input the file name for jiami:”);gotoxy(24+l1,5);scanf(“%s”,list);gotoxy(24,10);printf(“input file name for saven”);/*给加密后的文件命名,并保存*/ l2=strlen(“input file name for save:”);gotoxy(24+l2,10);scanf(“%s”,sd);fun(list,sd);fp1=fopen(“e:sd.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp1);gotoxy(10,15);printf(“%sn”,buf1);getch();printf(“file haven jiami ,save now”);getche();} if(key==key_enter&&y==14){ clrscr();textbackground(3);textcolor(15);gotoxy(24,5); printf(“input the file name for jiemi n”);/*用户给需要解密的文件解密 */ l1=strlen(“input the file name for jiemi: ”);gotoxy(24+l1,5);scanf(“%s”,sd);gotoxy(24,10);printf(“input file name for save:n”);/*对解密的文件系统又可以提供保存路径 */ l2=strlen(“input file name for save: ”);gotoxy(24+l2,10);scanf(“%s”,ds);man(sd,ds);fp2=fopen(“e:ds.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp2);gotoxy(10,15);printf(“%sn”,buf1);getch(); printf(“file haven jiemi,save now”);getche();break;} } } int get_key(){ union REGS rg;rg.h.ah=0;int86(0x16,&rg,&rg);return rg.h.ah;getchar();} void box(int startx,int starty,int high,int width)/*的建立*/ { int i;gotoxy(startx,starty);putch(0xda);for(i=startx+1;i for(i=starty+1;i 屏幕 } gotoxy(startx,starty+high-1);putch(0xc0);gotoxy(startx+1,starty+high-1);for(i=startx+1;i 通过这次的作业我觉得最大的收获是不仅把平时学习到的知识理解的更加透彻,而且使知识更加系统化,同时还把有些平时不太注意的小问题发现了出来,这不但有利于我学习C语言,而且对于我学习任何一门课程都是很有益处的。总之,做这份作业对于我们学习C语言有很大的帮助。 在做课程设计时,由于运用了很多新知识,新的方法,还有题目更加复杂,应用性更强,在编写过程中遇到了很多困难,从而使自己能够学习到更多以前不懂,难懂的东西。 计算机信息的加密与解密课程内容提要 本课程介绍了计算机信息加密与解密的主要技术,包括下面一些内容:压缩文件密码技术、办公软件密码技术、PKI体系、常用文件加密软件、密码设置技术、系统密码技术、QQ病毒与网页密码和高级密码破解技术。 随着Iternet在全球的普及,几乎每一台计算机都与别的计算机相互连接。计算机网络犯罪日益增多,技术含量越来越高,危害越来越大。信息安全已经成为社会关注的一个焦点,已经涉及国家安全的各个方面。密码技术是衡量一个国家信息安全技术的重要标志。现代密码学不仅用于解决信息的保密,而且也用于解决修的完整性、可用性、可控性和不可抵赖草。可以说信息安全的问题说到底就是密码的问题。一方面要加强密码学的理论和技术研究,另一方面也要普及密码技术的应用,这样才能提高全民族的信息安全意识和技术水平。 本课程开设的目的就在于通过介绍常用的加密解密技术,使广大读者对密码技术有更加深入了了解,从而提高个人的信息安全意识和技术水平。本课程共9章,各章的主要内容如下: 第一章主要介绍最常用的.zip、.rar压缩软件的加密技术和密码恢复技术,通过图文的讲解使读者学会如何给压缩文件加密,同时也讲解了如何恢复压缩软件的密码。 第二章主要介绍MS Office系列办公文件和PDF文件的加密和密码恢复技术。为提高恢复密码的速度,本章还可介绍如何用密码字典器制备字典文件以及RadHat办公软件的加密技术。 第三章主要介绍在PKI架构下的安全认证中心的原理和如何搭建一个基于Windows 2000 Server 的CA系统。 第四章主要介绍加密软件的使用,包括文件加密工具、文件夹加密工具和磁盘加密工具的使用,使读者的加密能力进一步提高。 第五章主要介绍密码设置技术,包括简单方法和高级变换技术在内的20多种方法,使得普通人设置强度高,易记忆的密码成为可能。 第六章主要介绍系统密码的设置与恢复技术。包括BIOS密码的设置与清除,操作系统密码的设置与清除。 第七章主要介绍了QQ木马病毒的防治、电子邮件密码技术和“*”号密码查看工具的使用,主要为读者在日常使用计算机发生问题,提供一种解决方法。 第八章主要介绍了密码高级破解技术。其中包括Debug、Win32Adsm、UtarEdit、OliIceddv等工具的使用。 第九章主要介绍了在VC下软件中身份认证,加密程序的编写,以及配合使用软件分析技术强化应用软件的安全性。第三篇:台电U盘加密大师操作说明
第四篇:c语言课程设计-文件加密解密(含源代码)
第五篇:计算机信息的加密与解密课程介绍