以前自己写了个小程序,是为了验证DSA数字签名算法的。也是利用了RSA公钥加密方法。
这是其中的几个主要方法。以前是在VJ下面做的,希望在JBuilder下也能做到吧。
不过主要的几个java类包都有,应该没问题吧。
//需要import的包
import java.security.*;
import sun.security.provider.*;
import java.security.interfaces.DSAParams;
//自动随机产生公、私钥的参数
private void Auto_Create()
{
try{
KeyPairGenerator KeyGen = KeyPairGenerator.getInstance("DSA");
KeyGen.initialize(1024,new SecureRandom());
KeyPair pair = KeyGen.generateKeyPair();
Signature dsa = Signature.getInstance("SHA/DSA");
DSAPrivateKey priv = (DSAPrivateKey)pair.getPrivate();
DSAPublicKey pub = (DSAPublicKey)pair.getPublic();
BigInteger x = pub.getY();
BigInteger y = priv.getX();
DSAParams Params = pub.getParams();
BigInteger p = Params.getP();
BigInteger q = Params.getQ();
BigInteger g = Params.getG();
editp.setText(p.toString());
editx.setText(x.toString());
edity.setText(y.toString());
editg.setText(g.toString());
editq.setText(q.toString());
}catch(Exception e){
editp.setText("caught exception"+e.toString());
}
}
//加密方法
private void button5_click(Object source, Event e)
{
try{
Signature dsa = Signature.getInstance("SHA/DSA");
BigInteger p = new BigInteger(editp.getText());
BigInteger q = new BigInteger(editq.getText());
BigInteger g = new BigInteger(editg.getText());
BigInteger y = new BigInteger(edity.getText());
DSAPrivateKey privatekey = new DSAPrivateKey(y,p,q,g);
PrivateKey priv = (PrivateKey)privatekey;
dsa.initSign(priv);
FileInputStream fis = new FileInputStream(MegSource.getText());
byte b;
while(fis.available()!=0)
{
b = (byte)fis.read();
dsa.update(b);
};
fis.close();
byte[] sig = dsa.sign();
FileOutputStream fos = new FileOutputStream(SignSource.getText());
fos.write(sig);
fos.close();
result.setText("成功!");
}catch(Exception a){
editp.setText("error!");
}
}
//验证方法
private void button6_click(Object source, Event e)
{
try{
Signature dsa = Signature.getInstance("SHA/DSA");
BigInteger p = new BigInteger(editp.getText());
BigInteger q = new BigInteger(editq.getText());
BigInteger g = new BigInteger(editg.getText());
BigInteger x = new BigInteger(editx.getText());
DSAPublicKey publickey = new DSAPublicKey(x,p,q,g);
PublicKey pub = (PublicKey)publickey;
dsa.initVerify(pub);
FileInputStream fis = new FileInputStream(MegSource.getText());
byte b;
while(fis.available()!=0)
{
         b = (byte)fis.read();
dsa.update(b);
}
fis.close();
fis = new FileInputStream(SignSource.getText());
byte[] sig = new byte[10000];
int i = 0;
while(fis.available()!=0){
sig[i] = (byte)fis.read();
i++;
}
boolean verifies = dsa.verify(sig);
if(verifies==true)result.setText("验证成功!");
else result.setText("验证失败!");
}catch(Exception a){
editp.setText("error!");
}
}