`
hongsoft
  • 浏览: 292373 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BouncyCastle JCE实践(六)

阅读更多

签名的实现过程<!----><o:p></o:p>

1)读取自己的私钥<o:p></o:p>

??? 对于自己的私钥文件,要用File类来声明。读取时,将用FileInputStream格式来作为输入流。而读出的密钥是字节数组,所以应该将读出的密钥用ByteArrayOutStream来保存,再用toByteArray格式来将它转化为字节数组。<o:p></o:p>

生成签名要使用自己的私钥,而私钥使用PKCS8#编码。所以我们还要将字节数组转化为PKCS8#编码形式。实现方法如下:<o:p></o:p>

PKCS8EncodedKeySpec keyspec=new PKCS8EncodedKeySpec(keybytes);<o:p></o:p>

KeyFactory keyfactory=KeyFactory.getInstance("RSA");<o:p></o:p>

syprivatekey=keyfactory.generatePrivate(keyspec);<o:p></o:p>

其中keybytes是从原文中读出的字节数组形式的密钥。用KeyFactory对象的实例化方法来指定算法,并用generatePrivate方法产生PKCS8#编码的私钥。<o:p></o:p>

2)从对话框中取得要签名的文件<o:p></o:p>

该步骤的实现比较简单,不做过多说明。<o:p></o:p>

3)将文件内容读取为字节数组格式<o:p></o:p>

因为签名时Signature类的Update()方法的参数是字节数组形式,所以要求<o:p></o:p>

先将原文读为字节数组。并且,在此处可以获得原文的内容长度。<o:p></o:p>

4)生成签名<o:p></o:p>

按照前面的描述,先用Signature类的getInstance()方法指定MD5WithRSA<o:p></o:p>

算法,然后用前面得到的私钥作为参数调用initSign()方法来初始化,最后用原文作为参数调用update()方法来传送数据,用字节数组形式的私钥作为参数调用Sign()方法来产生签名。<o:p></o:p>

将生成的签名按照前面设计的文件格式写入文件流中,就完成了签名的全部工作。签名的实现过程可用下面的图来表示:

<o:p></o:p>

?????图 数字签名过程<o:p></o:p>

代码实现如下:<o:p></o:p>

//读取私钥<o:p></o:p>

???? PrivateKey syprivatekey=null;<o:p></o:p>

????? File syfile=new File("c:\\安全文件\\"+misClass.username+"\\非对称\\本人公私钥\\yhb.private");<o:p></o:p>

????? try<o:p></o:p>

???? {<o:p></o:p>

???? FileInputStream fis=new FileInputStream(syfile);<o:p></o:p>

???? ByteArrayOutputStream baos=new ByteArrayOutputStream();<o:p></o:p>

?<o:p></o:p>

???? int thebyte=0;<o:p></o:p>

????? while((thebyte=fis.read())!=-1)<o:p></o:p>

????? {baos.write(thebyte);<o:p></o:p>

????? }<o:p></o:p>

????? fis.close();<o:p></o:p>

????? byte[] keybytes=baos.toByteArray();<o:p></o:p>

????? baos.close();<o:p></o:p>

?<o:p></o:p>

????? PKCS8EncodedKeySpec keyspec=new PKCS8EncodedKeySpec(keybytes);<o:p></o:p>

????? KeyFactory keyfactory=KeyFactory.getInstance("RSA");<o:p></o:p>

????? syprivatekey=keyfactory.generatePrivate(keyspec);<o:p></o:p>

??? }<o:p></o:p>

??? catch(Exception e9)<o:p></o:p>

???? {<o:p></o:p>

???? System.out.print("error when read the rsa private key");<o:p></o:p>

???? System.exit(0);<o:p></o:p>

???? }<o:p></o:p>

???? //从对话框中取得要签名的文件<o:p></o:p>

???? File file=new File(dirstring1,string1);<o:p></o:p>

???? String filename=file.getName();<o:p></o:p>

???? //首先将文件读为byte[]对象<o:p></o:p>

??? int len=(int)file.length();<o:p></o:p>

??? if(len>100000000)<o:p></o:p>

??? {System.out.println("the file length is too long!");<o:p></o:p>

??? System.exit(0);<o:p></o:p>

??? }<o:p></o:p>

??? byte[] inbuf=new byte[len];<o:p></o:p>

??? try{<o:p></o:p>

??? FileInputStream instream=new FileInputStream(file);<o:p></o:p>

??? int inbytes=instream.available();<o:p></o:p>

??? //inbuf[]=new byte[inbytes];<o:p></o:p>

??? int bytesread=instream.read(inbuf,0,inbytes);<o:p></o:p>

??? instream.close();<o:p></o:p>

??? //System.out.println(inbuf);<o:p></o:p>

??? }<o:p></o:p>

??? catch(Exception eq2)<o:p></o:p>

??? {<o:p></o:p>

??? System.out.println("error when change the file to byte[]");<o:p></o:p>

??? System.exit(0);<o:p></o:p>

??? }<o:p></o:p>

??? //签名的具体过程<o:p></o:p>

??? try{<o:p></o:p>

??? //byte[] signaturebytes=new byte[150];<o:p></o:p>

??? Signature sig=Signature.getInstance("MD5WithRSA");<o:p></o:p>

??? sig.initSign(syprivatekey);<o:p></o:p>

??? sig.update(inbuf);<o:p></o:p>

??? byte[] signaturebytes=sig.sign();<o:p></o:p>

?????????? //写入对象流中<o:p></o:p>

?? DataOutputStream outfile=new DataOutputStream(new FileOutputStream(<o:p></o:p>

????????????????? "c:\\安全文件\\文件\\"+filename+".yhb3"));<o:p></o:p>

??? outfile.writeInt(signaturebytes.length);<o:p></o:p>

??? outfile.write(signaturebytes);<o:p></o:p>

??? outfile.writeInt(len);<o:p></o:p>

??? outfile.write(inbuf);<o:p></o:p>

??? outfile.close();<o:p></o:p>

??? }<o:p></o:p>

??? catch(Exception eh3)<o:p></o:p>

??? {<o:p></o:p>

??? System.out.println("error when generate the outfile");<o:p></o:p>

??? System.exit(0);<o:p></o:p>

??? }

?

?

作者又名HongSoft,研究领域:1)基于工作流的BPM系统研究2)基于JAVA的信息安全技术.欢迎和大家讨论JAVA相关各方面问题 hongbosoftware@163.com

分享到:
评论

相关推荐

    简易图片检索软件(图像动态显示软件)

    首先设置待检索文件夹路径,设置完成解锁开始按钮,点击即可自动查阅文件夹下的图像。可设置每张图像的显示高度、显示停留时间及整体循环次数。 exe应用界面文件在路径disk/load_picture/load_picture.exe 点击exe应用及即可。

    树状数组详解资源.zip

    树状数组

    哈尔滨工程大学单独考试2020考研专业课初试大纲.pdf

    哈尔滨工程大学考研初试大纲

    基于OpenWatcom的链接器的链接器.zip

    链接器 二、链接器主要任务: GNU ld(链接器)是用于将多个目标文件(包括目标文件、共享库、目标文件的归档文件等)合并成一个可执行文件或共享库的重要工具。它的主要功能包括:符号解析和重定位:链接器识别并解析输入文件中的符号引用,然后执行重定位操作以确保这些引用指向正确的地址。这包括将模块中的符号引用与其定义进行匹配,以便在合并时连接它们。 合并输入文件:链接器将多个输入文件中的代码段、数据段等模块合并成一个单一的地址空间。这包括将不同模块中的代码和数据安排到正确的内存地址中。 生成输出文件:链接器将合并的模块和符号表等信息写入输出文件中,该输出文件可以是可执行文件、共享库、目标文件等,具体类型取决于链接器的参数和配置。 符号表处理:链接器生成输出文件的符号表,其中包含了可供调试和动态链接器使用的符号信息。 处理重定位信息:如果存在重定位信息,链接器将生成重定位表,用于在加载时修正代码和数据的地址。这使得程序可以在不同的内存地址上运行。 处理链接器脚本:链接器可以根据链接器脚本(linker script)中的规则和指令来组织和排列模块,以满足特定需求。链接器脚本可以

    tensorflow-2.9.0-cp37-cp37m-win-amd64.whl

    tensorflow安装

    基于STM32或RP2040的Asksinpp CO2传感器

    用于Homematic的CO2传感器,采用STM32或RP2040 pico 受到MHSteve出色工作的启发,我通过以下功能增强了他的解决方案: 使用 STM32 板(Blue Pill 或 Maple Mini)或 RP2040 微微板 与标准传感器外壳 (86x86 mm) 兼容 可选使用 Winsen MH-Z19 CO2 传感器代替 SCD30 使用触摸板作为配置按钮 使用RGB LED代替红绿灯 由于 STM32 和 RP2040 板缺少电池支持以及空间限制,我省略了可充电电池,这对我来说似乎是可以忍受的,因为无论如何都需要电源。

    基于Java的工程项目管理系统(源码+论文+任务书+数据库文件+演示视频).zip

    “工程项目管理系统”主要是为公司的经营活动提供信息服务,系统能够对客户信息管理、订单管理、零件信息管理、供应商管理、库存管理,系统用户管理等信息提供存储、更新、查询、统计的功能,使公司能够合理控制进销存各个环节,提高资金的利用率和结算速度,实现管理的高效率、实时性、安全性、科学化、现代化和智能化。系统的数据来源由各职能部门的业务人员通过键盘输入。此外,对系统的安全性方面也提出了明确的信息要求。 本基于Web技术的B/S结构的系统采用jsp技术进行开发设计,开发环境是MyEclipse,服务器采用tomcat,通过jdbc驱动和数据库进行无缝连接,具有较高的完整性,一致性和安全性。

    SM2258XT Q0407A 闪迪 海力士

    SM2258XT Q0407A 闪迪 海力士

    html如何用html+css写出一个漂亮的“众成教育”页面

    源码+图片资源

    大创研究总结报告pdf

    汽车悬架系统主要由弹性、阻尼元件及悬架导向机构组成,转向机构主要由梯形结构及摇臂机构组成,悬架系统与转向传动机构在运动过程必然引起干涉,这种干涉将引起车轮定位参数的变化,行驶中车轮摆振和轮胎异常磨损、制动时的干涉跑偏、以及稳态转向特性变差等。对于重型及大型车辆而言,悬架系统与转向传动机构的运动干涉问题尤为突出,有时会带来无法弥补的经济损失。

    grpcio-1.14.1-cp35-cp35m-macosx_10_7_intel.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    cryptography-2.2.1-cp34-abi3-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASP+ACCESS客户管理信息系统(开题报告+源代码+论文+答辩PPT)【ASP】.zip

    ASP+ACCESS客户管理信息系统(开题报告+源代码+论文+答辩PPT)【ASP】

    PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip

    PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、项目初期立项演示等用途。 4.如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能。 PyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zipPyQt5基于深度学习卷积神经网络开发的鼠标手写数字识别系统python源码+模型(含擦除、插入图片等多功能).zip

    yolo开发教程以及案例

    yolo开发教程以及案例

    分享一个比较万能的Python爬虫案例

    分享一个比较万能的Python爬虫案例

    jsptop200.txt

    jsptop200

    协同过滤 简单web+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    919362194569161草莓视频11.1.apk

    919362194569161草莓视频11.1.apk

    grpcio-1.20.1-cp36-cp36m-macosx_10_9_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics