sp; 这里给出了门限签名方案的实现算法,其中需要运用java.io.*; java.security.*; java.math.*; javax.crypto.*; javax. crypto.spec.*;java.security.spec.*;java.security. interfaces.*; java.util.*; javax.crypto.interfaces.*等系统提供的类和方法。
(1) RSA签名私钥生成算法:
public class RSA {
KeyPairGenerator kpg=KeyPairGenerator.getInstance ("RSA");
kpg.initialize(1024);
KeyPair kp=kpg.genKeyPair();
PublicKey pbkey=kp.getPublic();
PrivateKey prkey=kp.getPrivate();
//保存RSA公钥
FileOutputStream f1=new FileOutputStream("skey_ RSA_pub.dat");
ObjectOutputStream b1=new ObjectOutputStream (f1);
b1.writeObject(pbkey);
//保存RSA私钥
FileOutputStream f2=new FileOutputStream("skey_ RSA_priv.dat");
ObjectOutputStream b2=new ObjectOutputStream (f2);
b2.writeObject(prkey);
}
(2)子密钥生成算法:
public class shareRSA {//读取私钥d及RSA参数
FileInputStream f=new FileInputStream ("skey_ RSA_priv.dat");
ObjectInputStream b=new ObjectInput Stream(f);
RSAPrivateKey prk=(RSAPrivateKey) b.readObject();
BigInteger d=prk.getPrivateExponent();
BigInteger n=prk.getModulus();
byte[] x=new byte[16];
Random d1=new Random();
d1.nextBytes(x);
BigInteger c=new BigInteger(x);
BigInteger m=c.mod(n);
BigInteger d2=d.subtract(m);
//保存秘密密钥d1
FileOutputStream f1=new FileOutput Stream("partkey1_RSA.dat");
ObjectOutputStream b1=new ObjectOutput Stream(f1);
b1.writeObject(d1);
//保存秘密密钥d2
FileOutputStream f2=new FileOutput Stream ("partkey2_RSA.dat");
ObjectOutputStream b2=new ObjectOutput Stream(f2);
b2.writeObject(d2);
}
然后根据实际选择的t和n值进行多项式的选择,以d2作为多项式的a0,计算n个子密钥分发给共享服务器。
(3)各共享服务器用子密钥进行数字签名算法:
public class signature {//获取要签名的数据存放在data数组
FileInputStream f=new FileInputStream("msg.dat");
int num=f.available();
byte[] data=new byte[num];
f.read(data);
//获取私钥
FileInputStream f1=new FileInputStream("partkey2i_ RSA_priv.dat");
|