网站运营优化 » JAVA » 在JAVA中编程实现数字签名系统

在JAVA中编程实现数字签名系统

    一个数字签名系统主要分为三个部分:
    1。生成密钥对
    2。在数据发送端对数据进行签名
    3。在数据接收端对数据进行校验数据签名
    下面从这三个方面分别说明:
    1。生成密钥对
    生成密钥对可用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!=1){
    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(0);
    }
    try{
    System.out.println("Generating a key pair.....");
    KeyPairGenarator keyGen=KeyPairGenerator.getInstance("DSA");//使用DSA算法
    KeyGen.initialize(1024,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[0]);
    fileOut.write(pubKey);
    fileOut.close();
    fileOut=new FileOutputStream("privateKey_"+args[0]):
    fileOut.write(privateKey);
    file.out.close();
    System.out.println("OK!");
    }catch(Exception e){
    }
    }
    }
    }

    2.生成数字签名
    从私钥文件读取数据文件并将其转换为PrivateKey对象,可以使用KeyFactory类和PKCS8EncodeKeySpec类。KeyFactory可以利用给定的蜜月规范来建立不透明的密钥对象,也可以适当的格式取出蜜月对象中的密钥信息。 Signature是个引擎类,提供了诸如DSA或是RSA with MD5这样的数字签名算法。密
    码学上安全的签名算法可接受任意大小的输入和一个私月,并产生一个比较短的(常常是固定大小的)前名字揭穿。并且,签名和公钥部反映有关私钥的任何内容。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!=3)
    {
    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[0]);
    byte[] encodedprivateKey=new byte[fileIn.available()];

    finleIn.read(encodedprivateKey);
    fileIn.close();

    PKCS8EncodeKeySpec privKeySpec=
    new PKCS8EncodeKeySpec(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[1]);
    while(fis.available()!=0){
    b=(byte)fis.read();
    dsa.update(b);
    }
    fis.close();
    byte[] sig=dsa.sign();
    fileOut=new FileOutputStream(args[2]);
    fileOut.write(sig);
    fileOut.close();
    System.out.println("OK");
    }catch(Exception e){
    /////////
    }
    }
    }
    ///////////////////////End of SignData.java//////////////////
    SignData.java从文津中读取已编码的私钥字节,利用PKCS8EncodeKeySpec对象将已编码的四月字节转换为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!=3){
    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(0);
    }
    try{
    FileInputStream fileIn=new FileInputStream(args[0]);
    byte[] encodedpubKey =new byte[fileIn.available()];
    fileIn.read(encodedpubKey);
    fileIn.close();
    X509EncodedKeySpec pubKeySpec=
    new X509EncodedKeySpec(encodedpubKey);
    KeyFactory keyFactory=KeyFactory.getInstance("DSA");
    PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
    FileInputStream sigStream=new FileInputStream(args[2]);
    byte[] signature=new byte[sigStream.available()];
    sigStream.read(signature);
    sigStream.close();
    signature sigObj=Signature.getInstance("SHA1WithDSA");
    sigObj.initVerify(pubKey);
    fileIn=new FileInputStream(args[1]);
    byte b;
    while(fileIn.available())!=0)
    {
    b=(byte)fileIn.read();
    sigObj.update(b);
    };
    fileIn.close();
    boolean verifies=sigObj.verify(signature);
    System.out.println("Signature verifies:"+verifies);
    }catch(Exception e){/////////////
    }
    }
    }

相关文章

发表留言


点击更换验证码