准备工作
云服务器中操作
- 已经领取或者购买的服务器,复制公网IP
- 打开XShell 7,连接云服务器
- 新建
- 主机名填写刚刚复制的公网IP地址,名称随便写,点击连接
- 弹出以下对话框,输入登录的用户名root,记住用户名,点击确定
- 弹出输入密码的对话框,输入领取云服务器时设置的密码,忘记了可以到官网控制台重置,记住密码,点击确定
- 终端显示以下内容说明连接成功
- 新建
- 下载jdk,下载过程中判断[y/n]就输入y
sudo apt update
sudo apt install openjdk-11-jdk
- 下载完毕检查java版本来验证一下,能够显示具体的版本号即安装成功
java -version
-
在JPBC库官网点击下载下载以下压缩包,本地解压以jar包
直接使用7-zip进行提取
-
在我们连接的窗口这里,打开xftp的图标
-
打开xftp,左边为本地,右边为云服务器,在右边右键新建文件夹 repository
所有jar包选择拖到右边,这里右边多了一个opencsv.jar
的jar包,用来将数据写入csv表格的
至此,运行jpbc库的工作准备完毕
代码运行
- 在本地idea编辑好代码,这里使用官方给的
BLS01
做演示
import it.unisa.dia.gas.crypto.jpbc.signature.bls01.engines.BLS01Signer;
import it.unisa.dia.gas.crypto.jpbc.signature.bls01.generators.BLS01KeyPairGenerator;
import it.unisa.dia.gas.crypto.jpbc.signature.bls01.generators.BLS01ParametersGenerator;
import it.unisa.dia.gas.crypto.jpbc.signature.bls01.params.BLS01KeyGenerationParameters;
import it.unisa.dia.gas.crypto.jpbc.signature.bls01.params.BLS01Parameters;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.digests.SHA256Digest;
public class BLS01 {
public BLS01() {
}
public BLS01Parameters setup() {
BLS01ParametersGenerator setup = new BLS01ParametersGenerator();
setup.init(PairingFactory.getPairingParameters("a.properties"));
return setup.generateParameters();
}
public AsymmetricCipherKeyPair keyGen(BLS01Parameters parameters) {
BLS01KeyPairGenerator keyGen = new BLS01KeyPairGenerator();
keyGen.init(new BLS01KeyGenerationParameters(null, parameters));
return keyGen.generateKeyPair();
}
public byte[] sign(String message, CipherParameters privateKey) {
byte[] bytes = message.getBytes();
BLS01Signer signer = new BLS01Signer(new SHA256Digest());
signer.init(true, privateKey);
signer.update(bytes, 0, bytes.length);
byte[] signature = null;
try {
signature = signer.generateSignature();
} catch (CryptoException e) {
throw new RuntimeException(e);
}
return signature;
}
public boolean verify(byte[] signature, String message, CipherParameters publicKey) {
byte[] bytes = message.getBytes();
BLS01Signer signer = new BLS01Signer(new SHA256Digest());
signer.init(false, publicKey);
signer.update(bytes, 0, bytes.length);
return signer.verifySignature(signature);
}
public static void main(String[] args) {
BLS01 bls01 = new BLS01();
// Setup
AsymmetricCipherKeyPair keyPair = bls01.keyGen(bls01.setup());
// Test same message
String message = "Hello World!";
System.out.println((bls01.verify(bls01.sign(message, keyPair.getPrivate()), message, keyPair.getPublic())));
// Test different messages
System.out.println((bls01.verify(bls01.sign(message, keyPair.getPrivate()), "Hello Italy!", keyPair.getPublic())));
}
}
该方案用的是A曲线,需要新建a.properties
这样一个文件,用于对称的双线性映射
type a
q 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791
h 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776
r 730750818665451621361119245571504901405976559617
exp2 159
exp1 107
sign1 1
sign0 1
如果是非对称的双线性映射则使用F曲线,新建一个f.properties
的文件
type f
q 205523667896953300194896352429254920972540065223
r 205523667896953300194895899082072403858390252929
b 40218105156867728698573668525883168222119515413
beta 115334401956802802075595682801335644058796914268
alpha0 191079354656274778837764015557338301375963168470
alpha1 71445317903696340296199556072836940741717506375
- 左边切换到代码所在的目录,右边新建javaTest目录并进入,将java 代码和曲线文件都拖到右边
java代码和曲线文件一定要在同一目录
- 运行代码,回到XShell,切换到代码所在目录,执行以下命令,先用javac编译
javac -cp ~/repository/*:. BLS01.java
用ls
查看,有一个BLS01.class
文件,编译成功
执行运行命令,得到结果
java -cp ~/repository/*:. BLS01
- 后续更新如何使用opencsv.