JCE调用密码卡实现内置RSA密钥运算的方法及装置与流程

文档序号:12278128阅读:1068来源:国知局
JCE调用密码卡实现内置RSA密钥运算的方法及装置与流程

本发明涉及信息安全技术领域,特别涉及一种JCE调用密码卡实现内置RSA密钥运算的方法及装置。



背景技术:

Java是一中可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总成。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

Java平台定义了一组API,跨越主要安全领域,包括密码,公钥基础设施,认证,安全通信和访问控制。这些API使开发人员能够轻松地集成到他们的应用程序代码的安全性,主要围绕实施的独立性、实现互操作性和算法的可扩展性展开。

JCE是Java Cryptography Extension的简称,(Java密码扩展)提供用于加解密、密钥生成、密钥管理和密钥协商以及Message Authentication Code(MAC)算法的框架和实现。它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。JCE采用实现的独立和算法的独立,使JCE安全框架具有了良好的扩展性。它使用提供者(provider)的理念为管理和组织所有密码安全的实现并为应用程序提供服务。JAVA环境中可以同时存在多种不同的JCE实现,在security.provider中定义了一套标准接口,所有的JCE实现都要实现这一套标准接口。

JCE的服务提供者,应该提供一套基本的安全服务,其中RSA算法是当前应用最为广泛的一种非对称密码算法。RSA公钥由两部分组成:

n:RSA合数模,是一个正整数

e:RSA公开密,是一个正整数

RSA私钥可采用如下两种表示方法。

第一种表示方法,由一对整数(n,d)构成:

n:RSA合数模,是一个正整数

d:RSA私有幂,是一个正整数

第二种表示方法,由一个五元组(p,q,dP,dQ,qInv)构成:

p:第一个因子,是一个正整数

q:第二个因子,是一个正整数

dP:第一个因子的CRT幂,是一个正整数

dQ:第二个因子的CRT幂,是一个正整数

qInv:CRT系数,是一个正整数

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。RSA是公开密钥密码体制,所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)是公开信息,而解密密钥(即秘密密钥)是需要保密的。加密算法和解密算法也都是公开的,虽然解密密钥是由公开密钥决定的,但却不能根据公开密钥计算出解密密钥。所以,RSA算法的安全性关键在于私钥的安全性。

JCE中提供了关于RSA算法的相关接口,包括密钥生成、加密、解密、签名、验证等基础功能。其中,解密和签名需要传入对应的私钥对象才能进行具体的解密和签名操作,但私钥对象作为安全的核心,存储在应用内存中,非常容易被窃取。



技术实现要素:

本发明的目的在于克服现有技术的不足,提出一种克服上述问题或者至少部分地解决上述问题的一种JCE调用密码卡实现内置RSA密钥运算的方法,实现了JCE调用密码卡中存储的RSA密钥进行密钥运算,保证了私钥的安全存储及通信的安全。

本发明解决其技术问题所采用的技术方案是:

一种JCE调用密码卡实现内置RSA密钥运算的方法,包括密钥导出步骤和密钥运算步骤;

所述密钥导出步骤包括:

应用程序模块向JCE实现模块发送包括密钥标识的第一RSA密钥对导出请求;

JCE实现模块接收第一RSA密钥对导出请求,创建带有密钥标识的随机源,将密钥标识转换成密钥号,并向密码卡发送包括密钥号的第二RSA密钥对导出请求;

密码卡接收第二RSA密钥对导出请求,并向JCE实现模块发送已存储的指定密钥号对应的RSA密钥对的公钥数据;

JCE实现模块接收密码卡发送的公钥数据,根据公钥数据及密钥号组装假私钥数据,并将公钥数据、假私钥数据转换成密钥对象发送给应用程序模块;

所述密钥运算步骤包括:

应用程序模块向JCE实现模块发送包括密钥对象的第一RSA密钥运算请求;

JCE实现模块接收第一RSA密钥运算请求,将接收到的密钥对象进行解析,并根据解析结果向密码卡发送包括公钥或密钥号的第二RSA密钥运算请求;

密码卡接收第二RSA密钥运算请求,并向JCE实现模块发送运算结果;

JCE实现模块接收密码卡发送的运算结果,并将运算结果发送给应用程序模块。

进一步的,所述密钥导出步骤之前还包括密钥生成步骤,所述密钥生成步骤包括:

密码卡接收密码卡管理工具触发的密钥生成请求,获取密码卡管理工具指定的密钥号和膜长;

密码卡内部根据指定的密钥号和膜长完成RSA密钥对的生成及存储。

进一步的,密码卡中存储的RSA密钥对的私钥以密文形式存储且无法导出。

进一步的,所述假私钥按照RSA密钥对中私钥的格式进行组装。

进一步的,私钥由一对整数(n,d)构成时,所述假私钥的组装方法具体包括:

将除n以外的其他组成元素以二进制的随机数代替;

在元素d或者除n以外的其他元素中嵌入密钥号信息;

将嵌入密钥号后的二进制随机数转换成正整数并组装成假私钥。

进一步的,所述密钥运算步骤中,解析到的密钥对象中包括公钥时,将公钥转换成密码卡内部识别数据格式,发送给密码卡进行加密运算。

进一步的,所述密钥运算步骤中,解析到的密钥对象中包括假私钥时,则将假私钥中存储密钥号信息的元素由正整数转换成二进制数组,并找出嵌入元素d或者除n以外的其他元素中的密钥号,发送给密码卡进行解密运算。

进一步的,发送给密码卡进行加密运算的消息中还包括需要进行加密的数据。

进一步的,密码卡进行加密运算后将加密后的密文发送给JCE实现模块。

进一步的,发送给密码卡进行解密密运算的消息中还包括需要进行解密的数据。

进一步的,密码卡进行解密运算后将解密后的明文发送给JCE实现模块。

一种JCE调用密码卡实现内置RSA密钥运算的装置,包括终端设备和密码卡;所述终端设备包括应用程序模块、JCE实现模块和用于为密码卡生成RSA密钥对指定密钥号和膜长的密码卡管理工具;所述密码卡插接在所述终端设备上,与所述密码卡管理工具连接用于生成并存储指定密钥号和膜长的RSA密钥对;所述应用程序模块与所述JCE实现模块连接用于发送RSA密钥对导出或RSA密钥运算请求;所述JCE实现模块与所述密码卡连接用于将处理后的RSA密钥对导出请求或RSA密钥运算请求发送至所述密码卡,所述密码卡响应所述JCE实现模块的请求。

进一步的,所述密码卡通过PCI接口、PCI_E接口或usb接口插接到所述终端设备。

本发明提供的技术方案带来的有益效果是:

1、采用密码卡在硬件中生成并加密存储RSA密钥对,实现了私钥的安全保护;

2、使用JCE实现模块调用密码卡内部RSA密钥对,并使用密码卡硬件进行密码运算,解决了私钥在内存中存储或使用时容易被获取的问题;

3、采用密码卡管理工具配置密钥号和膜长,密码卡根据所配置的密钥号和膜长进行RSA密钥对生成并存储;由于密码卡管理工具为界面工具,用户需生成RSA密钥对时操作简单方便。

上述说明仅是本发明技术方案的概述,为了能够更清楚地了解本发明的技术手段,从而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下列举本发明的具体实施方式。

根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述及其他目的、优点和特征。

附图说明

图1为本发明装置的整体框图;

图2为本发明装置的密钥生成交互图;

图3为本发明装置的密钥导出交互图;

图4为本发明装置的密钥运算交互图;

图5为本发明方法的整体流程图;

图6为本发明方法的密钥生成流程图;

图7为本发明方法的密钥导出流程图;

图8为本发明方法的密钥运算流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步的详细描述。

需要说明的是,本实施方式的方法的执行主体为终端设备,所述终端可以为手机、平板电脑、掌上电脑PDA、笔记本或台式机等设备,当然,还可以为其他具有相似功能的设备,本实施方式不加以限制。

如图1至4所示,一种JCE调用密码卡实现内置RSA密钥运算的装置,包括终端设备10和密码卡20;所述终端设备10包括应用程序模块101、JCE实现模块102和用于为密码卡生成RSA密钥对指定密钥号和膜长的密码卡管理工具103;所述密码卡20插接在所述终端设备10上,与所述密码卡管理工具103连接用于生成并存储指定密钥号和膜长的RSA密钥对;所述应用程序模块101与所述JCE实现模块102连接用于发送RSA密钥对导出或RSA密钥运算请求;所述JCE实现模块102与所述密码卡20连接用于将处理后的RSA密钥对导出请求或RSA密钥运算请求发送至所述密码卡20,所述密码卡20响应所述JCE实现模块102的请求。

进一步的,所述密码卡20通过PCI接口、PCI_E接口或usb接口插接到所述终端设备10。

具体的,所述密码卡20是一种实现密钥生成、密钥存储以及密码运算的硬件设备。密码卡内部的密钥存储于硬件中,且应以密文的形式存储,防止被窃取。对于RSA密钥对,由于公钥是公开的,所以不需要加密存储,以明文形式存储即可,且可以导出到密码卡外部。而私钥则应以密文的形式存储与密码卡内部,且私钥不能够以明文的形式导出到密码卡外部。本实施例中的密码卡20,能够实现RSA密钥对的生成、导出公钥、RSA加密/解密、RSA签名/验签等功能。所述密码卡管理工具103是为方便用户对密码卡进行初始化、密钥生成、删除、备份、恢复等管理功能的界面工具,通过软件编程实现;所述密码卡管理工具103由对应的密码卡厂商提供。

所述应用程序模块101为用户实现需要功能的应用,所述JCE实现模块102实现一个JCE的服务提供者的功能,应用程序模块101和JCE实现模块102均通过软件编程实现,本实施例中,通过JAVA编程实现。所述应用程序模块101、JCE实现模块102和密码卡管理工具103均安装在所述终端设备10上,所述终端设备10上还安装有密码卡驱动程序。

如图5所示,一种JCE调用密码卡实现内置RSA密钥运算的方法,包括密钥生成步骤60、密钥导出步骤70和密钥运算步骤80。

如图6所示,所述密钥生成步骤60包括:

步骤601:密码卡管理工具根据指定的密钥号和膜长生成RSA密钥对,并将所述RSA密钥对发送到配套的密码卡;

步骤602,密码卡接收所述RSA密钥对并存储。

具体的,所述密钥号为密钥索引号或密钥的唯一标识。可通过密钥号来让密码卡管理工具生成内部密钥对并存储到密码卡中指定位置,所述密码卡可导出公钥、使用内部对应密钥进行加密/解密和RSA签名/验签等运算。

如图7所示,所述密钥导出步骤70包括:

步骤701,应用程序模块向JCE实现模块发送包括密钥标识的第一RSA密钥对导出请求;

步骤702,JCE实现模块接收第一RSA密钥对导出请求,创建带有密钥标识的随机源,将密钥标识转换成密钥号,并向密码卡发送包括密钥号的第二RSA密钥对导出请求;

步骤703,密码卡接收第二RSA密钥对导出请求,并向JCE实现模块发送已存储的指定密钥号对应的RSA密钥对的公钥数据;

步骤704,JCE实现模块接收密码卡发送的公钥数据,根据公钥数据及密钥号组装假私钥数据,并将公钥数据、假私钥数据转换成密钥对象发送给应用程序模块。

具体的,JCE实现模块中的SecureRandom类可通过getInstance(String algorithm,Provider provider)方法实例化一个随机数对象,其中algorithm参数为随机数生成的算法。本实施例中,作为标识内部密钥的参数;provider参数是服务提供商的名称,例如“FishermanJCE”为自实现的一套JCE提供者名称。具体实现时,构造方法中的算法参数输入对应的密钥标识,如“RandomRSAx”,“x”表示对应的密钥号,具体可表示为SecureRandom ran=SecureRandom.getInstance(“RandomRSA1”,"FishermanJCE")。

具体的,通过JCE实现模块的KeyPairGenerator类来获得密码卡内部的公钥和假私钥。KeyPairGenerator类可通过public static KeyPairGenerator getInstance(String algorithm,Provider provider)方法实例化一个对象,其中algorithm参数指定密钥对的算法,provider参数指定服务提供商。public void initialize(int keysize,SecureRandom random)方法,使用给定的随机源初始化确定密钥大小的密钥对生成器,其中keysize来确定密钥对的膜长,random是指定的随机源对象,本实施例中传入前一步骤中创建的随机源SecureRandom对象ran。public KeyPair generateKeyPair()方法,根据initialize初始化的内容进行密钥生成工作,返回一对非对称密钥对的对象。公钥为真实的,可直接进行运算;密钥对中的私钥为假私钥,对应参数均为假的,并在内部嵌入密钥号信息“RSA_x”,其中x为密钥号。

具体的,public KeyPair generateKeyPair()方法内部,根据密钥号,导出密码卡内部存储的公钥,而私钥则将除n以外的其他组成元素以二进制的随机数代替,并在元素d(或者除n以外的其他元素)中嵌入密钥号信息,如“RSA_x”,x为密钥号。将嵌入后的二进制随机数转换成正整数并组装成假私钥。最后将公钥和对应的假私钥返回。

具体生成流程如下:

KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA","FishermanJCE");

kpg.initialize(2048,ran);

KeyPair kp=kpg.generateKeyPair();

PublicKey pubkey=kp.getPublic();

PrivateKey prikey=kp.getPrivate()。

如图8所示,所述密钥运算步骤80包括:

步骤801,应用程序模块向JCE实现模块发送包括密钥对象的第一RSA密钥运算请求;

步骤802,JCE实现模块接收第一RSA密钥运算请求,将接收到的密钥对象进行解析,并根据解析结果向密码卡发送包括公钥或密钥号的第二RSA密钥运算请求;

步骤803,密码卡接收第二RSA密钥运算请求,并向JCE实现模块发送运算结果;

步骤804,JCE实现模块接收密码卡发送的运算结果,并将运算结果发送给应用程序模块。

具体的,JCE实现模块中定义Cipher类来实现加解密的密码功能。

public static final Cipher getInstance(String transformation,Provider provider)方法可实例化一个Cipher对象,其中,transformation参数传入对应的算法名称,provider传入指定的服务提供商。public final void init(int opmode,Key key,SecureRandom random)方法进行Cipher类的初始化,其中,opmod来指定进行加密操作还是解密操作,加密运算需要传入“Cipher.ENCRYPT_MODE”,解密运算传入“Cipher.DECRYPT_MODE”;key为参加运算的密钥对象,random为指定的随机源。进行加密运算时,传入已获得的真公钥pubkey,进行解密运算时,传入已获得的假私钥prikey。public final byte[]doFinal(byte[]input)方法进行具体的加解密工作,其中,input参数为输入数据,当进行加密运算时,input是需要加密的明文数据,返回加密后的密文数据;当进行解密运算时,input是需要解密的密文数据,返回解密后的明文数据。

具体的,public final void init(int opmode,Key key,SecureRandom random)方法内部实现中,当解析出的key为一个公钥,则直接存储,若为一个私钥,则将存储密钥号信息的元素由正整数转换成二进制数组,并找出嵌入的密钥号信息存储下来。public final byte[]doFinal(byte[]input)方法内部实现中,若进行加密操作,则将输入数据input、公钥传入到密码卡中,密码卡进行RSA加密运算可得到加密后的密文;若进行解密操作,则将输入数据input、密钥号、传入到密码卡中,密码卡进行RSA解密运算最终得到解密后的明文。

具体的加解密流程如下:

上述说明仅是本发明技术方案的概述,为了能够更清楚地了解本发明的技术手段,从而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下列举本发明的具体实施方式。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1