java 使用ED25519 验签

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);

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容