📄 dsa.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 + -