知识大全 如何在java中编程实现数字签名系统
Posted 知
篇首语:盛年不重来,一日难再晨。及时当勉励,岁月不待人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何在java中编程实现数字签名系统相关的知识,希望对你有一定的参考价值。
生成密钥对 生成密钥对可用java提供的类KeyPairGenerator 用其中的getInstance方法创建KeypairGenerator对象 在用initialize进行初始化 最后用generateKeyPair生成密钥对 密钥对生成后 就可以将其写入文件中 通过网络或其他方式公告用户 用户接收到数据文件和签名文件后 就可以使用公约来校验数据文件的数字签名 判断数据在网络中的传输是否被非法修改 ////GenerateKeyPair java///////////// import java io *; import java security *; public class GenerateKeyPair public static void main(String[] args) boolean bHelp=false;//sign for show help FileOutputStream fileOut;//输出密钥到文件 byte[] pubkey;//存储已编码的公钥字节 byte[] privKey;//存储已编码的私钥字节 if(args length!= ) System out println( Usage:GenerateKeyPair <keyname>; System out println( Option: ); System out println( <keyname>:The key name that using to genera te filename ); System exit( ); try System out println( Generating a key pair ); KeyPairGenarator keyGen=KeyPairGenerator getInstance( DSA );//使用DSA算法 KeyGen initialize( new SecureRandom()); KeyPair pair=keyGen generateKeyPair(); PublicKey pub=pair getPublic(); PrivateKey priv=pair getPrivate(); pubkey=pub getEncoded(); privateKey= priv getEncoded(); fileOut=new FileOutputStream( PublicKey_ +args[ ]); fileOut write(pubKey); fileOut close(); fileOut=new FileOutputStream( privateKey_ +args[ ]): fileOut write(privateKey); file out close(); System out println( OK! ); catch(Exception e) 生成数字签名 从私钥文件读取数据文件并将其转换为PrivateKey对象 可以使用KeyFactory类和PKCS EncodeKeySpec类 KeyFactory可以利用给定的蜜月规范来建立不透明的密钥对象 也可以适当的格式取出蜜月对象中的密钥信息 Signature是个引擎类 提供了诸如DSA或是RSA with MD 这样的数字签名算法 密 码学上安全的签名算法可接受任意大小的输入和一个私月 并产生一个比较短的(常常是固定大小的)前名字揭穿 并且 签名和公钥部反映有关私钥的任何内容 Signature对象即可用于数据签名 也可用于校验某个签名是否为预制关联的数据的真实签名 签名或教研签名的第一步是创建signature实例 为特定类型的签名算法或取signature对象的途径是调用signature德getInstance静态方法 初始化方法有两个 取决于Signature的用途 initSign( )////用于签名 initVerify( )//用于校验 如果sigature初始化为签名 则可将带钱数据通过update方法提供给对象在调用sign来产生签名即可 下面以一个实例来说明 ///////////////////SignData java//////////////// import java io *; import java security *; import java security spec *; public class SignData public static void main(String [] args) FileOutputStream fileOut; byte b; if(args length!= ) System out println( Usage:SignData <PrivateKey> <dataFile> <SignatureFile> ); System out println( Option: ); System out println( <PrivateKey>:The file name of the private Key ); System out println( <DataFile>: The filename that want to signature ); System out println( <signatureFile>:the filename containing signture data ); try System out println( Generating a digital signature ); FileInputStream fileIn=new FileInputStream(args[ ]); byte[] encodedprivateKey=new byte[fileIn available()]; finleIn read(encodedprivateKey); fileIn close(); PKCS EncodeKeySpec privKeySpec= new PKCS EncodeKeySpec(encodedprivateKey); KeyFactory keyFactory=KeyFactory getInstance( DSA ); PrivateKey privKey=keyFactory generatePrivate(privateKeySpec); Signature dsa=Signature getInstance( SHA/DSA ); dsa initSign(privKey); FileInputStream fis=new FileInputStream(args[ ]); while(fis available()!= ) b=(byte)fis read(); dsa update(b); fis close(); byte[] sig=dsa sign(); fileOut=new FileOutputStream(args[ ]); fileOut write(sig); fileOut close(); System out println( OK ); catch(Exception e) ///////// ///////////////////////End of SignData java////////////////// SignData java从文津中读取已编码的私钥字节 利用PKCS EncodeKeySpec对象将已编码的四月字节转换为PrivateKey对象 然后利用Signature签名数据文件 生成签名数据 并将签名数据写道文件中 //////VerifySign java///////////// import java io *; import java security *; import java security spec *; public class VerifySign public static void main(String [] args) if(args length!= ) System out println( Usage:VerifySign <PublicKey> <dataFile> <SignatureFile> ); System out println( Option: ); System out println( <Public Key >The filename of the public key ); System out println( <DataFile>The filename that want to signature ); System out println( <SignatureFile>:The file name containing signature data ); System exit( ); try FileInputStream fileIn=new FileInputStream(args[ ]); byte[] encodedpubKey =new byte[fileIn available()]; fileIn read(encodedpubKey); fileIn close(); X EncodedKeySpec pubKeySpec= new X EncodedKeySpec(encodedpubKey); KeyFactory keyFactory=KeyFactory getInstance( DSA ); PublicKey pubKey=keyFactory generatePublic(pubKeySpec); FileInputStream sigStream=new FileInputStream(args[ ]); byte[] signature=new byte[sigStream available()]; sigStream read(signature); sigStream close(); signature sigObj=Signature getInstance( SHA WithDSA ); sigObj initVerify(pubKey); fileIn=new FileInputStream(args[ ]); byte b; while(fileIn available())!= ) b=(byte)fileIn read(); sigObj update(b); ; fileIn close(); boolean verifies=sigObj verify(signature); System out println( Signature verifies: +verifies); catch(Exception e)///////////// cha138/Article/program/Java/Javascript/201311/25387相关参考