1 .导入pom
<dependency>
<groupId>net.i2p.crypto</groupId>
<artifactId>eddsa</artifactId>
<version>0.3.0</version>
</dependency>
2.生成公私钥
// 生成秘钥对
KeyPairGenerator keyPairGenerator = new KeyPairGenerator();
KeyPair keyPair = keyPairGenerator.generateKeyPair();
EdDSAPrivateKey key= (EdDSAPrivateKey)keyPair.getPrivate();
// 这里使用base64 编码
System.out.println("私钥:"+Base64.getEncoder().encodeToString(key.getSeed())) ;
System.out.println("公钥:"+Base64.getEncoder().encodeToString(key.getAbyte()));
私钥:tyUErIPCz4XBVN+lZBZQ7myRN19BkwrxdGuM59OSkGg=
公钥:9xd19cOmaR8h57SNL4tRXTSLedICOT/T7SJrsJJ8hyI=
3.根据指定私钥 签名
String data ="test";
String privetKey = "E64xrJ1V7e54v4O8XrORGiIHnAsnbFvdTxG0oydSI7Q=";
byte[] bytes = Base64.getDecoder().decode(privetKey);
// 使用ed25519签名
EdDSANamedCurveSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519);
PrivateKey privateKey = new EdDSAPrivateKey(new EdDSAPrivateKeySpec(bytes,spec));
EdDSAEngine edDSAEngine = new EdDSAEngine();
edDSAEngine.initSign(privateKey);
edDSAEngine.update(data.getBytes());
byte[] signature = edDSAEngine.sign();
System.out.println("签名结果:" + Base64.getEncoder().encodeToString(signature));
签名结果:9gsayYd6uS118FulCFjTokd96G6CErc57o+27t58ec7dJH259v88XB/A9cxBN7t8LAKz4or59bGI29pIT7D/Cw==
4.根据指定公钥 验签
// 公钥
String publicKeyStr = "9xd19cOmaR8h57SNL4tRXTSLedICOT/T7SJrsJJ8hyI=";
// 私钥加密后的签名
String signature = "9gsayYd6uS118FulCFjTokd96G6CErc57o+27t58ec7dJH259v88XB/A9cxBN7t8LAKz4or59bGI29pIT7D/Cw==";
// 需要验签的数据
String data = "test";
byte[] bytes = Base64.getDecoder().decode(publicKeyStr);
EdDSANamedCurveSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519);
PublicKey publicKey = new EdDSAPublicKey(new EdDSAPublicKeySpec(bytes, spec));
EdDSAEngine edg = new EdDSAEngine();
edg.initVerify(publicKey);
edg.setParameter(EdDSAEngine.ONE_SHOT_MODE);
// 需要验证的字符串
edg.update(data.getBytes());
// 和签名比较
boolean verify = edg.verify(Base64.getDecoder().decode(signature));
System.out.println(verify);