近年来,有关不法分子通过私刻假公章伪造、篡改政府部门公文、法律文书进行诈骗的事情层出不穷,为此我们提出利用二维条形码技术对相关法律文书进行数字签名,通过智能手机等智能设备简单互操作从而实现查验相关具有法律效力文书真实性、完整性与不可抵赖性的作用,还可满足数据加密传送的需求。
一、方案二维码应用
二维码是用某种特定的几何图形,按一定规律在平面分布的黑白相间的小方格,以图形来记录数据信息。
(1)存储容量大,可存储4000多个字母或1800多个汉字信息,可满足大多数的文书信息化应用;
(2)制作成本低,实现简单;
(3)识别率高,具有纠错功能,即使些许破损仍能识读;
(4)普及速度快,得益于智能手机高普及率,二维码已经慢慢走进人民群众的生活。
二、设计与实现
1、总体设计
通过在有关部门的文书流程化系统中集成数字签名、二维码生成打印、短信或彩信、WAP(无线应用协议)交互程序、数字签名校验功能,即可满足本方案所需功能,还可按需加入IVR(交互式语音应答系统)与TTS(文本转语音)语音自助服务,提供更为人性化的服务。
2、普通公文二维码生成
具体流程如下:
(1)文书查验系统为提取文书内容(全文或关键信息),如某传票文书内容简化为:案号:(2013)龙民一初字第XXX号;案由:合同纠纷;开庭时间:2013年5月21日;开庭地点:第二法庭。
(2)加入时间戳,形成原码。
(3)将原码经MD5摘要算法生成系统惟一查验码。
(4)将查验码、原码信息、文书查验提示说明合并生成二维码内容。
(5)进而通过二维码生成程序生成最终的二维码。二维码生成方案都较为实用与成熟。可根据自身部署环境进行选择。
(6)将二维码连同文书一起打印,或是附加在文书上,二维码生成步骤结束。
采用Google 2xing类库创建二维码图片方法代码如下:
/**
*@Description:根据传人的字符串生成对应二维码图像
*@param qrStnng 二维码字符串信息
*@param width 生成的图像位宽
*@param height 生成的图像位高
*@param path 二维码图像存放目录
*@throws Exception
*@return String 二维码图像名称
*/
public void generate(String qrString, String path,int width,int height) throws Exception{
log.info( "GenerateQRCode->start to generate qrcode.");
File file=new File(path);
//创建二维码图片数据数组对象
BitMatnx bitMatrix=new MultiFormatWriter-().encode(qrString, BarcodeF-ormat.QR_CODE, width, height);
//图片采用32位十六进制数的ARGB色彩模式进行存储
Bufferedlmage image=new Bufferedlmage (width, height,Bufferedlmage.TYPE_INT_ARGB);
用二维码数据创建图片像素,根据数组元素分别设为黑白两色
for (int x=0;x<width; x++)(
for (int y=0;y<height; y++)( image.setRGB (x,y,bitMatrix.get(x,y)== true?BLACK:WHITE); } } ImagelO.write(image, PNG_TYPE, file); log.info(’’GenerateQRCode->end to generate qrcode");
)
3、加密文书二维码生成
加密文书二维码生成是在普通文书二维码生成基础上深化而来,下面以法院案件移送函为例将具体流程分解如下所述(见图1)。
按照第普通文书二维码生成第(4)步骤合并生成如下二维码内容:
查验码:……[关于……一案,因……。根据……,现将该案移送你处,请查收。时间戳:…]
(1)将查验码经RSA算法与对应私钥进行加密,生成文书的数字签名。
(2)对于需要加密传送数据的文书,可将待加密的敏感信息通过RSA算法与接收方的公钥进行加密,形成密文。待加密数据如下:
被告银行账户:中国…银行,6226-,余额:…
经RSA算法与接收方的公钥进行加密,获得密文。考虑到加密算法计算量较大,加密大数据量的信息会不切实际,因此有必要限制需加密的信息量,从而保障加密功能的时效性。
(3)将查验码、原码信息、数字签名与密文合并生成二维码内容:
查验码:……[关于……一案,因……。根据……,现将该案移送你处,请查收。时间戳:…]数字签名:…。密文:…。
随后将二维码打印或是附加在文书上,生成步骤结束。
相应的核心代码简述如下:
String content=¨”;
String beEncrypt=””;
//在信息内容后面加入时间戳
Timestamp timeStamp = new Time-stamp( System.currentTimeMillis());
content+=timeStamp;
//使用MD5加密算法生成信息摘要,即查验码
String md5Code=MD5UtiI.MD5(con-tent)
查验码经RSA算法与对应私钥进行加密,生成数字签名= RSAUtil.encrypt-ByPrivateKey(md5Code, privateKey);
删等需加密的内容经RSA算法与接收方的公钥进行加密,获得密文
String encryptContent=RSAUtil.encrypt-ByPublicKey( beEncrypt, targetPublicKey);
//将各部分组合形成最终二维码内容
String endContent=’’查验码:”+md5Code+ content+”数字签名:"+ signCode+”密文:”+encryptContent;
根据内容生成二维码图像
QRUtil.generate(endContent, path,width, height);
//加密文书二维码生成过程结束
4、文书交互查验
如图2所示。文书真实性与完整性查验流程如下:
(1)当事人收到文书后,通过普通智能设备二维码扫描应用,对准查验二维码进行扫描;扫描结果包含查验码、文书原始码信息、文书查验提示说明、数字签名与密文;
(2)根据文书查验说明,当事人可将文书查验码以短信、WAP或拨打语音服务等方式发送至有关部门的文书查验系统;
(3)文书查验系统接收文书查验码。通过将查验码与数据库中的记录进行比对,由于是系统惟一标识,从而实现文书真实性查验的目的;
(4)文书查验系统发送真实性查验结果反馈给当事人,如果查验通过则在查验结果中告知进行完整性查验的相关说明与方式;
(5)当事人根据真实性查验结果进行校验;若文书为真,当事人可选进行文书完整性查验。在文书真实性查验结果中,包含文书完整性临时查验码,当事人进行完整性查验时需附加该临时查验码;
(6)文书查验系统接收完整性临时查验码;根据该临时查验码调取系统相关文书完整性数据;根据当事人请求方式将文书的完整性数据进行反馈;
(7)当事人通过智能设备获取到文书完整性数据;将文书完整性数据与纸面文书进行比对;若比对结果为通过,则说明文书完整性未被破坏,验证通过。
5、加密数据提取
包含文书查验方案二——文书本地一次性查验所与密文解密流程,具体步骤如下:
(1)接收方从二维码扫描结果中提取文原始码;对文书原始码使用MD5摘要算法进行计算:获取文书信息摘要;接收方从二维码扫描结果中提取数字签名。
(2)对数字签名通过RSA算法与发送方公钥进行计算,获取原始文书摘要信息;将摘要信息进行比对。
(3)若结果为不通过,则说明文书原始码内容或二维码信息在传送过程中已被篡改。
(4)接收方需与发送方联系进行二次确认,以保护双方的利益。
(5)若比对结果为通过,则可对二维码中密文解密,可先提取二维码中的密文信息;对密文通过RSA算法与接收方的密钥进行计算,获取其中的原始信息,从而达到使用二维码传送加密信息的目的。
相应的核心代码简述如下:
//将提取的正文实施摘要算法
String md5Code=MD5UtiI.MD5(content);
//将提取的数字签名经RSA算法与发送方公钥进行解密
String otherMd5Code=RSAUtil.decryptByPublicKey (sign-Code, sourcePublicKey);
//将摘要信息进行比对
if( !md5Code.equals( OtherMd5Code)){
alert(”文书信息已被篡改,请联系发送方进行二次确认”);
return;
}
//比对通过
密文经RSA算法与接收方的私钥进行解密,获取原加密信息
String sourceContent= RSAUtil.decryptByPrivateKey (beEn-crypt, targetPrivateKey);
//加密数据提取过程结束
小知识之二维条码
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。