发明内容
为克服上述解密的密钥存放在客户端软件中不安全的问题或者至少部分地解决上述问题,本发明提供了一种文件解密方法及装置。
根据本发明的第一方面,提供一种文件解密方法,包括:
接收客户端发送的请求密钥的信息,所述密钥位于Windows服务程序中,所述Windows服务程序和所述客户端通过命名管道进行通信;
将所述密钥发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
具体地,所述Windows服务程序和所述客户端通过命名管道进行通信,包括:
创建所述命名管道;
等待所述客户端连接所述命名管道;
读取所述客户端通过所述命名管道发送的请求密钥的信息;
在所述命名管道中写入所述密钥。
具体地,在所述接收客户端发送的请求密钥的信息之前,还包括:
监控是否存在客户端软件的进程。
具体地,所述监控是否存在客户端软件的进程,包括:
创建线程来监控是否存在所述客户端软件的进程。
具体地,所述监控是否存在所述客户端软件的进程,包括:
获取***中的进程名称列表;
在所述进程名称列表中查询是否存在所述客户端软件的进程名称。
具体地,所述监控是否存在所述客户端软件的进程,包括:
若判断不存在所述客户端软件的进程,则每隔预设时长重新监控是否存在所述客户端软件的进程。
根据本发明的第二方面提供一种文件解密方法,包括:
将请求密钥的信息发送给Windows服务程序,所述密钥位于所述Windows服务程序中,所述Windows服务程序和客户端通过命名管道进行通信;
接收所述Windows服务程序发送的密钥;
根据所述密钥对所述客户端上加密的文件进行解密。
具体地,所述Windows服务程序和客户端通过命名管道进行通信包括:
连接所述Windows服务程序创建的命名管道;
等待所述Windows服务程序的响应;
向所述命名管道中写入请求密钥的信息;
从所述命名管道中读取所述Windows服务程序发送的密钥。
根据本发明的第三方面提供一种文件解密装置,包括:
第一接收单元,用于接收客户端发送的请求密钥的信息,所述密钥位于Windows服务程序中,所述Windows服务程序和所述客户端通过命名管道进行通信;
第一发送单元,用于将所述密钥发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
根据本发明的第四方面提供一种文件解密装置,包括:
第二发送单元,用于将请求密钥的信息发送给Windows服务程序,所述密钥位于所述Windows服务程序中,所述Windows服务程序和客户端通过命名管道进行通信;
第二接收单元,用于接收所述Windows服务程序发送的密钥;
解密单元,用于根据所述密钥对所述客户端上加密的文件进行解密。
本发明将解密的密钥放入Windows服务程序中,所述Windows服务程序和使用所述加密文件的软件一起打包安装到客户端。当启动所述客户端软件时,启动所述Windows服务程序。所述软件在需要使用所述加密的文件时,对所述加密的文件进行解密。解密的密钥通过进程间通信的方式从所述Windows服务程序中获取,从而更隐秘地隐藏解密的密钥,增强加密的效果。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
图1为本发明实施例提供的文件解密方法流程图。如图1所示,包括:S11,接收客户端发送的请求密钥的信息,所述密钥位于Windows服务程序中,所述Windows服务程序和所述客户端通过命名管道进行通信;S12,将所述密钥发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
其中,S11中,所述客户端是指为客户提供本地服务的程序。所述密钥为解密算法中输入的参数,为解密的密钥。所述Windows服务程序用于保存解密的密钥。所述Windows服务程序和所述客户端通过命名管道进行通信。但不仅限于此方式。所述命名管道是通过网络来完成进程间的通信,屏蔽了底层的网络协议细节,仅需要通过进程中对应的通信端口进行连接,从而实现了所述Windows服务程序与所述客户端软件之间的直接通信。S12中,所述文件可以为图片文件、脚本文件、动画文件、声音文件等。在进行解密之前,需要先对所述文件进行加密。可以使用RSA算法生成的公钥对所述文件进程加密,使用RSA算法生成的私钥对所述文件进行解密,但不限于此种加密算法。所述Windows服务程序接收所述客户端发送的请求密钥的信息,所述密钥位于所述Windows服务程序中。所述Windows服务程序接收所述客户端发送的请求密钥的信息,将所述密钥加密后发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
具体地,在解密之前编写Windows服务程序。首先定义一个服务转发表结构,即,SERVICE_TABLE_ENTRY ServiceTable;ServiceTable[0].lpServiceName=_T(SERVICE_NAME);ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)service_main,其中,所述服务转发表结构为SERVICE_TABLE_ENTRY,定义的变量为ServiceTable。所述服务转发表结构有2个属性,即服务名称和回调函数。所述服务名称为创建的Windows服务的名称。所述回调函数指向所述Windows服务的入口函数。调用***API函数StartServiceCtrlDispatcher,将其中的参数写入创建的服务转发表中,创建所述服务名称和所述入口函数的对应关系。当所述Windows服务启动时,调用所述入口函数,即,voidWINAPI service_main(int argc,char**argv)。
当所述客户端获取到解密文件的密钥后,则可以使用解密算法对需要解密的文件进行解密。首先,将所述文件读取到内存,即,FILE*file=fopen(“xxx”,“rb”)。其中,fopen为***库函数,“xxx”为所述文件的文件名,“rb”为读取文件。将文件指针移动到文件尾部,获取文件大小,即,fseek(file,0,SEEK_END);uint filesize=ftell(file)。调用fread函数将整个文件读取到内存,并存储在缓存buf中,即,fread(buf,filesize,1,file)。如果加密使用的是RSA算法,则调用RSA算法解密所述文件,即,RSA.decrypt(SecretKey,buf,filesize)。
本实施例将解密的密钥放入Windows服务程序中,所述Windows服务程序和所述客户端软件一起打包安装到客户端。当启动所述客户端软件时,启动所述Windows服务。客户端软件在需要使用所述文件时,对所述文件进行解密。解密的密钥通过进程间通信的方式从所述Windows服务程序中获取,从而更隐秘地隐藏解密的密钥,增强加密的效果。
在上述各实施例的基础上,本实施例中所述Windows服务程序和所述客户端通过命名管道进行通信,包括:创建所述命名管道;等待所述客户端连接所述命名管道;读取所述客户端通过所述命名管道发送的请求密钥的信息;在所述命名管道中写入所述密钥。
具体地,所述Windows服务程序通过构建命名管道的形式与所述客户端建立通信连接。首先,所述Windows服务程序调用WindowsAPI函数CreateNamedPipe创建命名管道,需要说明的是,所述命名管道的名字可以随意设定,只要不与***其他进程的管道重名即可。再通过调用函数ConnectNamedPipe等待客户端的连接。所述Windows服务程序调用函数ReadFile读取所述客户端发送的信息,并通过调用函数WriteFile往所述命名管道中写入所述密钥,所述密钥可以是加密的,从而将所述密钥发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
本实施例通过构建命名管道实现所述Windows服务和所述客户端之间的数据通信,屏蔽了底层的网络协议,从而实现了所述Windows服务程序与所述客户端之间的直接通信,但不限于此种通信方式。
在上述各实施例的基础上,在所述接收客户端发送的请求密钥的信息之前,还包括监控是否存在客户端软件的进程。
其中,在解密之前,将编写好的所述Windows服务程序和所述客户端软件一起打包到安装程序中。所述Windows服务程序创建线程来监控是否存在所述客户端软件的进程。若判断不存在所述客户端软件的进程,则每隔预设时长重新监控是否存在所述客户端软件的进程。当启动所述客户端软件时,所述线程会监控到所述客户端软件的进程,所述Windows服务也被启动。当所述Windows服务被停止时,停止所述线程的执行,并释放所述线程,从而完成所述Windows服务的清理工作,如释放资源等。
具体地,在所述Windows的服务的入口函数中编写所述Windows服务停止的回调函数,同时创建线程以监控是否存在所述客户端软件的进程。其中,函数RegisterServiceCtrlHandler用于注册一个所述Windows服务的回调函数,其函数原型为SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler(LPCTSTRlpServiceName,LPHANDLER_FUNCTION lpHandlerProc),其中,LPCTSTR lpServiceName表示服务名称,LPHANDLER_FUNCTION lpHandlerProc表示服务的回调函数,指向所述Windows服务停止的回调函数,即void WINAPI ServiceHandler(DWORD fdwControl),其中,DWORDfdwControl表示服务控制事件类型。当接收到的服务控制事件类型为SERVICE_CONTROL_STOP、SERVICE_CONTROL_SHUTDOWN时,所述Windows的服务程序被停止,此时调用Windows的函数TerminateThread停止线程的执行。在所述Windows服务的入口函数中调用Windows函数CreateThread来创建线程,即,HANDLE task_handle=CreateThread(NULL,NULL,game_thread,NULL,NULL,NULL),其中,game_thread为线程的回调执行函数,执行线程的整个逻辑功能。然后使用所述线程监控是否存在所述客户端软件的进程。
本实施例中服务器通过创建线程来监控所述客户端软件是否启动。当启动客户端软件时,所述Windows的服务也被启动。当所述Windows服务被停止时,停止所述线程的执行,并释放线程。实现了在客户端软件启动时,启动所述Windows服务,进行解密,增强了保密的效果。在所述Windows服务停止时,停止线程,释放资源,减少资源的浪费。
在上述各实施例的基础上,本实施例中,监控是否存在所述客户端软件的进程,包括获取***中的进程名称列表;在所述进程名称列表中查询是否存在所述客户端软件的进程名称。
其中,所述Windows服务程序获取***中的进程名称列表的快照,然后获取所述进程名称列表的快照中的第一个进程名称。根据所述第一个进程名称获取***中其他的进程名称,从而获取当前正在运行的进程的进程名称列表。所述进程名称为当前运行的所有线程的进程名称。在所述进程名称列表中查询是否存在所述客户端软件的进程名称,即监控当前进程中是否有所述客户端软件的进程。如果存在所述客户端软件的进程名称,则启动所述Windows服务。如果不存在所述客户端软件的进程名称,则每隔预设时长重新获取***中的进程名称列表,然后在所述进程名称列表中查询是否存在所述客户端软件的进程名称。如果不存在,则继续等待预设时长后再次获取***中的进程名称列表。如果存在,则启动所述Windows服务。
具体地,所述Windows服务程序首先通过调用***API函数CreateToolhelp32Snapshot获取***中的进程名称列表的快照,即hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0)。其中,TH32CS_SNAPPROCESS表示获取的是进程名称列表的快照。然后通过调用***API函数Process32First从所述进程名称列表的快照中获取第一个进程名称,即,Process32First(hSnapshot,&procEntry32)。其中,第一个参数hSnapshot是获取的所述快照的句柄,&procEntry32用于返回获取的进程的信息,procEntry32的属性szExeFile为进程名称,即,procEntry32.szExeFile为进程名称。接着,获取***中其他的进程名称,即,while(bMore){bMore=Process32Next(hProcessSnap,&procEntry32);}。通过while循环调用函数Process32Next,获取下一个进程名称,直到所有进程名称都获取完毕。通过上述方法则可以获取到所述进程名称列表。在所述进程名称列表中查询是否存在所述客户端软件的进程名称。若存在,则启动所述Windows服务。服务器调用***命令注册一个Windows的服务程序。注册服务可以使用命令行:sc createsvnserve binpath=“服务程序的全路径”,然后调用命令行:sc start服务名,从而启动所述Windows服务。其中,服务名为Windows服务的服务名称。
本实施例通过获取***中的进程名称列表,在所述进程名称列表中查询是否存在所述客户端软件的进程名称,从而实现对所述客户端软件启动的监控。当监控到所述软件启动时,启动所述Windows服务,对文件进行解密,增强了保密效果。
图2为本发明实施例提供的文件解密方法流程图。如图2所示,包括:S21,将请求密钥的信息发送给Windows服务程序,所述密钥位于所述Windows服务程序中,所述Windows服务程序和客户端通过命名管道进行通信;S22,接收所述Windows服务程序发送的密钥;S23,根据所述密钥对所述客户端上加密的文件进行解密。
其中,S21中,将所述Windows服务程序作为服务端。所述密钥为解密算法中输入的参数,为解密的密钥。所述Windows服务程序用于保存解密的密钥。所述Windows服务程序和所述客户端通过命名管道进行通信。但不仅限于此方式。所述命名管道是通过网络来完成进程间的通信,屏蔽了底层的网络协议细节,仅需要通过进程中对应的通信端口进行连接,从而实现了所述Windows服务程序与所述客户端软件之间的直接通信。S22中,所述文件可以为图片文件、脚本文件、动画文件、声音文件等。S23中,所述解密可以根据加密算法调用相应的函数进行解密。所述密钥位于所述Windows服务程序中。所述客户端上的软件在需要使用所述文件时,若所述文件已被加密,则所述客户端向所述Windows服务程序发送请求密钥的信息。所述客户端在接收到所述Windows服务程序发送的加密的密钥后,将所述资源文件读取到内存,并将所述密钥作为参数传递给调用的解密函数,从而实现对所述资源的解密。
本实施例将解密的密钥放入Windows服务程序中,所述Windows服务程序和所述客户端软件一起打包安装到客户端。当启动所述客户端软件时,启动所述Windows服务程序。客户端软件在需要使用所述文件时,对所述文件进行解密。解密的密钥通过进程间通信的方式从所述Windows服务程序中获取,从而更隐秘地隐藏解密的密钥,增强加密的效果。
在上述实施例的基础上,本实施例中所述Windows服务程序和客户端通过命名管道进行通信包括:连接所述Windows服务程序创建的命名管道;等待所述Windows服务程序的响应;向所述命名管道中写入请求密钥的信息;从所述命名管道中读取所述Windows服务程序发送的密钥。
具体地,所述客户端通过调用函数CreateFile连接所述命名管道。再调用函数ConnectNamedPipe来等待所述Windows服务程序的响应,若所述客户端通过所述命名管道接收到所述Windows服务程序的响应后,调用函数WriteFile向所述命名管道中写入请求密钥的信息。所述客户端调用函数ReadFile来从管道中读取所述Windows服务程序发送的密钥,所述密钥可以是加密的。所述客户端对所述密钥进行解密得到原始的值,从而实现对所述文件的解密。
本实施例通过构建命名管道实现所述Windows服务和所述客户端之间的数据通信,屏蔽了底层的网络协议,从而实现了所述Windows服务程序与所述客户端之间的直接通信,但不限于此种通信方式。
图3为本发明实施例提供的文件解密装置结构图,如图3所示,包括第一接收单元11和第二发送单元12,其中:所述第一接收单元11用于接收客户端发送的请求密钥的信息,所述密钥位于Windows服务程序中,所述Windows服务程序和所述客户端通过命名管道进行通信;所述第一发送单元12用于将所述密钥发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
具体地,所述客户端是指为客户提供本地服务的程序。所述密钥为解密算法中输入的参数,为解密的密钥。所述Windows服务程序用于保存解密的密钥。所述文件可以为图片文件、脚本文件、动画文件、声音文件等。在进行解密之前,需要先对所述文件进行加密。可以使用RSA算法生成的公钥对所述文件进程加密,使用RSA算法生成的私钥对所述文件进行解密,但不限于此种加密算法。所述Windows服务程序接收所述客户端发送的请求密钥的信息,所述密钥位于所述Windows服务程序中。所述Windows服务程序和所述客户端通过命名管道进行通信。但不仅限于此方式。所述接收单元11接收所述客户端发送的请求密钥的信息后,所述发送单元12将所述密钥加密后发送给所述客户端,以供所述客户端根据所述密钥对所述客户端上加密的文件进行解密。
本实施例将解密的密钥放入Windows服务程序中,所述Windows服务程序和所述客户端软件一起打包安装到客户端。当启动所述客户端软件时,启动所述Windows服务。客户端软件在需要使用所述文件时,对所述文件进行解密。解密的密钥通过进程间通信的方式从所述Windows服务程序中获取,从而更隐秘地隐藏解密的密钥,增强加密的效果。
图4为本发明实施例提供的文件解密装置结构图,如图4所示,包括第二发送单元21、第二接收单元22和解密单元23,其中:所述第二发送单元21用于将请求密钥的信息发送给Windows服务程序,所述密钥位于所述Windows服务程序中,所述Windows服务程序和客户端通过命名管道进行通信;所述第二接收单元22用于接收所述Windows服务程序发送的密钥;所述解密单元23用于根据所述密钥对所述客户端上加密的文件进行解密。
具体地,将所述Windows服务程序作为服务端。所述密钥为解密算法中输入的参数,为解密的密钥。所述Windows服务程序用于保存解密的密钥。所述文件可以为图片文件、脚本文件、动画文件、声音文件等。所述解密可以根据加密算法调用相应的函数进行解密。所述密钥位于所述Windows服务程序中。所述Windows服务程序和所述客户端通过命名管道进行通信。但不仅限于此方式。所述客户端上的软件在需要使用所述文件时,若所述文件已被加密,则所述第二发送单元21向所述Windows服务程序发送请求密钥的信息。所述第二接收单元22接收所述Windows服务程序发送的加密的密钥后,所述解密单元23将所述资源文件读取到内存,并将所述密钥作为参数传递给调用的解密函数,从而实现对所述资源的解密。
本实施例将解密的密钥放入Windows服务程序中,所述Windows服务程序和所述客户端软件一起打包安装到客户端。当启动所述客户端软件时,启动所述Windows服务程序。客户端软件在需要使用所述文件时,对所述文件进行解密。解密的密钥通过进程间通信的方式从所述Windows服务程序中获取,从而更隐秘地隐藏解密的密钥,增强加密的效果。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。