⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa.java

📁 Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种
💻 JAVA
字号:
package dsa;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;

import javax.swing.JOptionPane;

import sun.security.provider.DSAKeyPairGenerator;

public class DSA
{
    public static void main(String[] args)
    {

    	String s1,s2;
  	    s1=JOptionPane.showInputDialog("请输入要签名的信息,DSA算法将对它进行数字签名.");
  	
    	
    	byte[] myInfo = s1.getBytes();

        byte[] wrongInfo = (s1+".").getBytes();

        System.out.println("您输入的信息是: " + new String(myInfo));

        generateKeyPair();//生成密钥

        byte[] signature = generateSignature(myInfo);

        System.out.println("The signature is " + new String(signature));

        System.out.println("此签名是否为其真正的源消息签名: "
                + verifySignature(myInfo, signature));

        System.out.println("此签名与假消息比较之后的结果是: "
                + verifySignature(wrongInfo, signature));
        
        System.out.println();
  	  
  	  System.out.print("Press enter to exit!");
  		
  		try{ 
  			System.in.read();
  			System.in.read();
  			}
  			catch(IOException e){} 
  			

    }

    public static void generateKeyPair()
    {
        DSAKeyPairGenerator kg = new DSAKeyPairGenerator();
        kg.initialize(1024, false, new SecureRandom());

        KeyPair keyPair = kg.generateKeyPair();

        PrivateKey privateKey = keyPair.getPrivate();
        writeKeyToDisk("C:\\privateKeyDSA.dat", privateKey);

        PublicKey publicKey = keyPair.getPublic();
        writeKeyToDisk("C:\\publicKeyDSA.dat", publicKey);

    }

    public static byte[] generateSignature(byte[] info)
    {
        try
        {
            PrivateKey privateKey = (PrivateKey) readKeyFromDisk("C:\\privateKeyDSA.dat");

            Signature sign = Signature.getInstance("DSA");

            sign.initSign(privateKey);

            sign.update(info);

            return sign.sign();
        }
        catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (SignatureException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return new byte[0];
    }

    public static boolean verifySignature(byte[] info, byte[] signature)
    {
        PublicKey publicKey = (PublicKey) readKeyFromDisk("C:\\publicKeyDSA.dat");

        Signature sign;
        try
        {
            sign = Signature.getInstance("DSA");
            sign.initVerify(publicKey);
            sign.update(info);
            return sign.verify(signature);
        }
        catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (SignatureException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;

    }

    private static void writeKeyToDisk(String file, Key key)
    {
        try
        {
            ObjectOutputStream out = new ObjectOutputStream(
                    new FileOutputStream(file));

            out.writeObject(key);

        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static Key readKeyFromDisk(String file)
    {
        try
        {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                    file));
            return (Key) in.readObject();
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -