1 .導(dǎo)入pom
<dependency>
<groupId>net.i2p.crypto</groupId>
<artifactId>eddsa</artifactId>
<version>0.3.0</version>
</dependency>
2.生成公私鑰
// 生成秘鑰對(duì)
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.根據(jù)指定私鑰 簽名
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("簽名結(jié)果:" + Base64.getEncoder().encodeToString(signature));
簽名結(jié)果:9gsayYd6uS118FulCFjTokd96G6CErc57o+27t58ec7dJH259v88XB/A9cxBN7t8LAKz4or59bGI29pIT7D/Cw==
4.根據(jù)指定公鑰 驗(yàn)簽
// 公鑰
String publicKeyStr = "9xd19cOmaR8h57SNL4tRXTSLedICOT/T7SJrsJJ8hyI=";
// 私鑰加密后的簽名
String signature = "9gsayYd6uS118FulCFjTokd96G6CErc57o+27t58ec7dJH259v88XB/A9cxBN7t8LAKz4or59bGI29pIT7D/Cw==";
// 需要驗(yàn)簽的數(shù)據(jù)
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);
// 需要驗(yàn)證的字符串
edg.update(data.getBytes());
// 和簽名比較
boolean verify = edg.verify(Base64.getDecoder().decode(signature));
System.out.println(verify);