Ed25519算法签名与验签的Java实现

Ed25519是一种比较快速的椭圆曲线算法,区块链中有较多应用。
这里是签名和验签的Java实现,笔者用的是JDK17

package org.example;

import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class SignTest {
    public static void main(String[] args) throws Exception {
        String msg = "This is a very important message.";
        //生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("Ed25519");
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        String pk = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        String sk = Base64.getEncoder().encodeToString(privateKey.getEncoded());
        System.out.println("Public Key:" + pk);
        System.out.println("Private Key:" + sk);

        //签名
        String signatureBase64 = sign(msg, sk);
        System.out.println("Signature:" + signatureBase64);

        //验签
        boolean success = verify(msg, signatureBase64, pk);
        System.out.println("验签结果:" + success);

        success = verify(msg + "这是加上去的篡改内容", signatureBase64, pk);
        System.out.println("验签结果:" + success);

    }

    public static String sign(String msg, String skBase64) throws Exception{
        //从base64中把PrivateKey反序列化还原回来,KeySpec用PKCS8EncodedKeySpec
        byte[] keyBytes =  Base64.getDecoder().decode(skBase64);
        KeyFactory keyFactory = KeyFactory.getInstance("Ed25519");
        PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes));

        Signature signer = Signature.getInstance("Ed25519");
        signer.initSign(privateKey); //设置PrivateKey
        signer.update(msg.getBytes()); //设置要签名的数据
        byte[] signedBytes = signer.sign(); //生成签名
        String encodedMsg = Base64.getEncoder().encodeToString(signedBytes); //序列化编码,base64格式
        return encodedMsg;
    }

    public static boolean verify(String msg, String signatureBase64, String pkBase64) throws Exception{
        //从base64还原PublicKey, KeySpec用 X509EncodedKeySpec
        byte[] keyBytes = Base64.getDecoder().decode(pkBase64);
        KeyFactory keyFactory = KeyFactory.getInstance("Ed25519");
        PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(keyBytes));
        Signature verifier = Signature.getInstance("Ed25519");

        verifier.initVerify(publicKey);
        verifier.update(msg.getBytes());
        byte[] signedBytes = Base64.getDecoder().decode(signatureBase64);
        boolean verify = verifier.verify(signedBytes);
        return verify;
    }
}

运行结果:

Public Key:MCowBQYDK2VwAyEAXfZ3xKG0ym2kygw18irwPVkMx4rbT2MGSpS2HoQpR+E=
Private Key:MC4CAQAwBQYDK2VwBCIEIOFp7lvboCTEk4+5EiNPOimF4IL80S63P1hksaq2TFka
Signature:sRte+V0FM/d6JGT/HOm8Qp6/+S47E8Wo3jxOeuFAWF80yAjbEwaPhZvxuR2Jk4+CEbjtjxA9MoTBSZZPd9+LDA==
验签结果:true
验签结果:false
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容