一、作品总体设计
“基于USB端口的数据保密及信息恢复管理软件”以安全软件与USB设备为载体,以各项功能为手段,以持续性服务为支撑,打造出集监测、防御、控制为一体的新型安全体系——SDCS(Spy Defense Control System)。
该体系的所有功能实现与服务支撑都由安全性软件和带有USB端口的设备共同构成。每份软件与USB硬件设备(U盘)单独匹配,在加解密时只有匹配成功才可进行相应操作,否则只能登陆软件进行简单磁盘监控。USB端口设备带有认证功能,在后期可以由此构成了企业的多级安全模型基础。革命性的改变了登录方法并且废除了现有的考勤制度,带有个人身份认证的USB设备是SDCS中的重要组成部分,与安全性软件进行组合则可完成加密文件、维护与监控数据、限制访问权限等功能。
软件与USB硬件的有机结合,共同实现了SDCS体系中对用户电脑全局监测、对文件敏感监控、对数据传输保护、对个人信息保护。使其适用于各个行业公司、企业、军工、政府等,并且以操作的便捷性与功能的全面性填补市场上此类设备的空白。目前市场上还没有一款产品具有如此全面的功能(基本覆盖了现行对个人与系统的所有需求与信息安全隐患)。
“SDCS安全管理卫士 V1.0”是基于Microsoft Visual Studio 2010上开发,一款专门针对以上安全方案,对计算机所有的USB接口进行监视、控制,保护计算机保存内容的软件。具备即时认证多种文件加密方式、查询电脑磁盘或USB存储设备历史使用记录及操作内容、USB端口加锁加密三大核心功能,同时还兼具病毒查杀、修复注册表等其他功能。运行稳定可靠,环境兼容(包括WIN XP/WIN 7/WIN 8/WIN 10),无需安装操作较为简便,同时提供用户专用登录密码,保护软件使用安全。
二、功能设计
1、R-Mess(n)新型加密算法设计(1024位):
加密流程:
(1)对于系统生成的随机数以二进制的形式放入一个R[1024]的数组内,数组内不足的位数补零
RàR[1024] (2-1)
(2)根据明文M数量依次将明文转换为n组以二进制数组M(n)[1024]为基本组成单位的明文数组群。(这里要注意的是明文分组的位数必须与随机数组的位数相等)
M(0)[1024]
M(1)[1024]
M è : (2-2)
M(n)[1024]
(3)依次将n组明文数组与加密后的数组R[1024]进行异或运算,再次按序组合完成加密形成密文C
M(0)[1024]⊕R[1024]=C(0)
M(1)[1024]⊕R[1024]=C(1)
C =è : (2-3)
M(n)[1024]⊕R[1024]=C(n)
C=C(0)+C(1)+C(2)+…+C(n)
(这里相加并不是进行加法运算,而是将分段加密密文依次衔接排放形成总密文)
(4)对随机数R进行RSA加密操作C(R),将加密的结果CR以二进制的形式放入一个CR[2048]的数组内,并将随机数的加密结果CR置于密文C之前(CR+C)
CR=R^e mod N, (2-4)
(5)对需要加密的明文内容M进行哈希函数运算,取得哈希值。哈希值将在加密结束后保存在文尾,以保证完整性,防止有人对密文进行篡改
MD5(CR+C) (2-5)
完成以上五步操作,最终完成加密,进行保存操作,保存结果为:
CR+C
MD5(CR+C) (2-6)
解密流程:
(1) 将需要解密的文本进行MD5运算,并与文本中的MD5(M)进行校验,确保完整性。
è 正确 继续解密
校验 MD5(CR+C) (2-7)
è 错误 恢复密文
(2) 打开文件提取出密文中的CR,使用解密密钥d对CR进行RSA解密恢复出R,将恢复出的R放入一个1024位的数组R[1024]
R=CR^d mod N (2-8)
RèR[1024] (2-9)
(3) 因为在加密中对明文只使用了异或运算,因此明文与加密后密文的长度是相等的。将密文的二进制位以1024为一组分割为n组,并将每组与R[1024]进行异或运算便可恢复出明文M
C(0)[1024]⊕R[1024]=M(0)
C(1)[1024]⊕R[1024]=M(1)
M =è : (2-10)
C(n)[1024]⊕R[1024]=M(n)
M=M(0)+M(1)+M(2)+…+M(n)
2.恢复密文功能
(技术保密,暂不公开)
3.磁盘(包括移动设备)操作监控
创建新进程,进程中无限循环API函数ReadDirectoryChangesW,通过判断ReadDirectoryChangesW的返回值向主窗口发送消息,消息内容包含监视路径,文件操作(文件创建,文件修改,文件重命名,文件删除),操作时间。主窗口消息响应函数接受消息,将消息内容添加到表格中。
实现了对电脑中所有磁盘、文件的监控记录功能。
4.密钥即时更新
在系统中植入了密钥产生更新程序,写入到软件中。使得用户可以根据自身需要即时变更密钥。密钥更新程序设计由密钥产生和密钥植入两个子程序构成。
密钥更新根据RSA密钥生成原理,全局依靠随机数在一定范围内产生公钥(e,n),私钥d。因为目前大整数算法未优化运算时间较长,因此只先实现短位密钥更新。但是一旦优化了整个大整数算法,便可以扩展至所有位长加密体制中。此外因为我们的密钥更新是即时产生,没有预先运算存储,可以防止敌手对软件系统的破解而破坏整个加密体制。
密钥传输是将产生的密钥传输到软件及相应的硬件设备中,以确保必须使用USB硬件设备完成加解密,这样更加确保了安全性。
5.其他功能
(除加解密与监控模块外所有功能技术架构)
模块名称 |
关键类 |
功能简介 |
关键函数 |
函数功能 |
显示磁盘信息 |
CMyDlg2 |
报表展示PC所有磁盘信息(盘符、总量、余量) |
Setexpandstyle() |
控制样式 |
insertcolumn() |
插入具体项目 |
|||
EnumDrives() |
磁盘列举 |
|||
病毒查杀 |
CMyDlg7 |
检测Autorun病毒 |
dosomething()检测按钮 |
执行查杀 |
dosomething()插拔设备 |
||||
FindAutorun() |
寻找autorun.inf文件 |
|||
SetFileAttributes() |
修改为正常属性 |
|||
进程列举分析与结束 |
AdjustPrivileges() |
提取权限 |
||
GetProcessList() |
列举进程 |
|||
OnMCopyPath() |
拷贝路径 |
|||
OnMRefreshList() |
进程刷新 |
|||
OnMEdnTask() |
定位文件 |
|||
OnMFindExe() |
结束进程 |
|||
调用第三方查杀 |
ShellExecute() |
选择第三方程序 |
||
WritePrivateProfileString() |
写入login.inf文件 |
|||
GetPrivateProfileString() |
存储在login.inf文件 |
|||
显示使用记录 |
CMyDlg3 |
显示连接PC的USB设备信息与使用时间 |
RegOpenKeyEx() |
打开指定注册表键 |
RegCreateKeyEx() |
创建不存在键 |
|||
RegEnumValue() |
列出所用名称的值 |
|||
RegEnumKey() |
返回注册表键信息 |
|||
RegQueryInfoKey() |
返回设备详细信息 |
|||
RegCloseKey() |
关闭注册表键 |
|||
USB端口加锁 |
CMyDlg4 |
对USB端口进行权限管理 |
OnBnClickedButton1() |
执行操作 |
m_Btn1=1/0 |
USB盘符分配开启/关闭 |
|||
m_Btn2=1/0 |
USB自动运行开启/关闭 |
|||
m_Btn3=1/0 |
拷贝电脑资料允许/禁止 |
|||
辅助功能 |
CMyDlg5 |
对注册表、CMD、任务管理器进行修复或者禁止 |
OnStnClickedStaticReg() |
修复注册表 |
OnStnClickedStaticCmd() |
禁用注册表 |
|||
OnStnClickedStaticTask() |
修复cmd |
|||
OnStnClickedStaticNo1() |
禁用cmd |
|||
OnStnClickedStaticNo2() |
修复任务管理器 |
|||
OnStnClickedStaticNo3() |
禁用任务管理器 |
|||
综合设置 |
CMyDlg6 |
修改软件登录密码 |
OnBnClickedButton1() |
设置开机启动 |
OnBnClickedButton3() |
重置登录密码 |
|||
软件帮助 |
CMyStatic |
帮助文档 |
OnLButtonUp |
打开txt帮助文档 |
软件登录 |
CLOGIN |
软件登录 |
OnOK() |
密码输入验证 |
OnInitDialog() |
密码初始化 |
三、R-Mess(n)算法安全性论证
1.针对随机数破解
R-Mess(n)加密算法中的安全性主要依赖于对明文的长位分组和对与明文等长位的随机数R进行加密。而且对R的加密也是整个算法中唯一需要的数学运算。因此想要破译使用R-Mess(n)算法加密明文的一种方法就是攻破使用RSA加密的随机数R。
随机数本身由系统产生,每次执行加密都会产生1024位不同的随机数,完成明文加密后随机数R被RSA加密为CR,随即R被销毁。只有对CR解密才能恢复出正确的随机值。但是目前并没有一种有效的可以攻破长位RSA加密的方法,尤其是使用长位数的密钥。我们在R-Mess(n)算法中使用密钥长度为1024位,因此对于攻破RSA加密恢复出R来破译明文的可能性,在量子计算机技术未成熟前,几乎不存在任何可能性。
2.对密文进行统计分析
因为在一次性密码本加密中密码本的长度必须与明文长度相等,但是在R-Mess(n)
加密算法中只是使用一个1024位的随机数,也就是说对于n个明文段重复使用了同一组一次性密码本,这就必须要考虑到利用频率统计分析对密文进行破译了。
但是必须要指出的是,采用频率统计对于英文来说是较为管用的,因为英文的组成字只用26个.。而对于汉字来说,文章组成的基本单位是汉字,汉字因为数量众多,对于汉字的统计分析并没有什么效果。根据清华大学汉字频率表统计资料,汉字使用频率最高的500个字可以覆盖到日常使用的%78.53,其余列表如下:
字数 |
覆盖面(%) |
500 |
78.53202 |
1000 |
91.91527 |
1500 |
96.47563 |
2000 |
98.38765 |
2500 |
99.24388 |
3000 |
99.63322 |
3500 |
99.82015 |
4000 |
99.91645 |
(表3-1)
可以看到,4000字已经基本覆盖了我们日常使用的%99.9以上,那也就意味着在频率统计分析里会有4000种频率,而且对于一个1024明文组中会有64个汉字,这64个汉字中就算有相同的字也会因为R[1024]而在密文中以不同的二进制表示。n组明文分组中只有同一个汉字被同位置的随机数R反复加密才会出现同样的二进制位。
此外,对于n个1024位中,出现相同的16位概率极大,所以这又无形的增加了统计的难度,因此,对于R-Mess(n)算法的统计分析攻击是行不通的。
3.对密文进行组异或破解
在R-Mess(n)加密算法中对明文进行了1024位的分组操作,加密时只是与随机数数组R[1024]进行异或。因此破译时可以在n个明文组中选择其中一组密文进行同位异或遍历(即从1024位的0000 0000…0000 0000到1024位的 1111 1111…1111 1111),并将每次同位异或出的结果转为文字进行判别。
那么对于一个1024位的密文数组,就会产生2^1024个结果,筛选出较有逻辑性的结果,并计算出相对应的R。再将R带入到密文C中,统计出所有可能的结果,筛选出全文较有逻辑性与价值的明文,最后由人力或者智能判别系统来判定哪一个才是原始正确的明文。
下面以一组32位的密文组进行示范:
计算机中一个汉字的二进制为16位,两个汉字便为32位,示范词组为“海洋”
将“海洋”转二进制放入数组m[32]中
m[32]=1011 1010 1010 0011 1101 0001 1111 0011
我们设随机数数组为
r[32]=1100 0010 0001 1101 1010 0110 0000 1100
那么根据R-Mess(n)算法进行一次运算,得到c[32]
m[32]=1011 1010 1010 0011 1101 0001 1111 0011
c[32]= ⊕
r[32]=1100 0010 0001 1101 1010 0110 0000 1100
c[32]=0111 1000 1011 1110 0111 0111 1111 1111
开始进行对c[32]进行同位异或遍历
c[32]=0111 1000 1011 1110 0111 0111 1111 1111
C(0)= ⊕
0000 0000 0000 0000 0000 0000 0000 0000
c0=c[32]
c0è“×緖”
c[32]=0111 1000 1011 1110 0111 0111 1111 1111
C(2^0)= ⊕
0000 0000 0000 0000 0000 0000 0000 0001
c1=0111 1000 1011 1110 0111 0111 1111 1110
c1è“×緖 ”(注意与c0的区别,此处带有空格)
依次进行,直到c31
c[32]=0111 1000 1011 1110 0111 0111 1111 1111
C(2^32)= ⊕
1111 1111 1111 1111 1111 1111 1111 1111
C(2^32)=1000 0111 0100 0001 1000 1000 0000 0000
C(2^32)è“口参”
从32位的实验我们可以看到,2^32=4294967296那么总共就会有4294967296个结果,而且在这将近40亿的结果中寻找具有逻辑性的词语,对于智能判别系统都是一个庞大的工作量量,而我们采用1024位的随机数,那么采用密文组异或遍历破译法就会有2^1024种结果,而2^1024=179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
对于如此庞大的数据量进行逻辑判别选择,结果也是可想而知的。
4.对密文切分碎片破解
尽管我们保存密文的格式为CR+C+Hash(M),也就是说进行密文破译时将密文转为二进制时,前面的一部分都是加密后随机数CR的二进制位,那么对于敌手来说,首先要确定的是密文组C是从哪个二进制位置开始的。基于对敌手的能力和资源进行充分的假设,也就是假设了敌手知道密文组C的起始位置。那么敌手就可以将密文切分为16位为一个碎片的碎片群,当然碎片群里的碎片是前后衔接的,不能随意改变碎片位置的,因为每一个密文碎片的明文对应了一个相应汉字。
那么对于破译问题就简化为了每个密文碎片对应汉字的可能性以及碎片与碎片之间的逻辑关系这两个子问题。
(1) 密文碎片对应汉字的可能性
因为密文碎片每个为十六位,那么在理论上就有2^32=4294967296种可能性。但是根据由中国国家标准总局1980年发布的《信息交换用汉字编码字符集》GB-2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。(GB-2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。)
如果加密明文全是汉字没有任何符号字符(这也是比较好的假设),那么其实一个密文碎片对应可能性的汉字就是6763个。这已经基本囊括了日常使用的所有汉字了。
(2) 密文碎片之间的逻辑关系
因为碎片明文之间的所有逻辑关系共同构成了明文的逻辑语义,且碎片之间的关系是线性的,那么如果可以用一种方法得到碎片与碎片之间的逻辑语义,那么就可以极大地增加破解出明文的概率。但遗憾的是,每一个密文碎片都包含了日常使用汉字出现的所有可能性,所以即使得到了的碎片也不能提供有效的线索。如果没有有效的观测值,就很难去确定碎片之间隐含的关系,因此隐马尔科夫模型在这里并不适用。
我们假设这里有四个密文碎片,分别为P1,P2,P3,P4,每个密文碎片均对应6763个汉字。