首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java用露娜HSM签名EDDSA

用Java用露娜HSM签名EDDSA
EN

Stack Overflow用户
提问于 2020-03-14 06:01:51
回答 2查看 353关注 0票数 1

我正在尝试用露娜HSM(Gemalto)实现EDDSA签名。

代码语言:javascript
复制
Signature signature = null;
signature = Signature.getInstance("EDDSA", "LunaProvider");
PrivateKey privateKey = getPrivateByAlias(privateKeyLabel);
signature.initSign(privateKey);
signature.update(payload);
byte[] byteArray = signature.sign();

但是在签名之后,byteArray大小为71,但EDDSA签名大小根据规范为64。我不知道我在这里错过了什么。我在网上也找不到任何文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-14 13:27:17

这正是您所期望的X9.63兼容签名的大小,该签名由两个带符号的大数整数组成。如果您想要一个64字节的签名,那么您应该使用the following explanation转换内部的2个整数。I2OSP和OS2IP的Java实现可以找到here

这些步骤是:

使用signature;

  • convert constructor;

  • use I2OSP将
  1. 解析为BigInteger值,将r值和s值作为字节数组创建(32位字节输出size);
  2. concatenate r和s以创建64字节签名。

)

票数 1
EN

Stack Overflow用户

发布于 2020-03-16 02:37:56

我尝试了如下方法,但是验证失败了(代码更新了,现在起作用了)

代码语言:javascript
复制
        Signature signature = Signature.getInstance("SHA512withEDDSA", "LunaProvider");
        signature.setParameter(new LunaEDDSAParameterSpec(false));
        signature.initSign(privateKey);
        signature.update(payload);
        byte[] byteArray = signature.sign();

        ASN1InputStream decoder = new ASN1InputStream(byteArray);
        DERSequence seq = (DERSequence) decoder.readObject();
        DERInteger r = (DERInteger) seq.getObjectAt(0);
        DERInteger s = (DERInteger) seq.getObjectAt(1);
        LOGGER.info("R: {}", r.getValue());
        LOGGER.info("S: {}", s.getValue());
        decoder.close();

        byte[] rByte = i2osp(r.getValue(), 32);
        byte[] sByte = i2osp(s.getValue(), 32);

        byte[] concat = Bytes.concat(rByte, sByte);

        return concat;

不确定这是正确的做法

利用恒星java库进行验证

代码语言:javascript
复制
        PublicKey publicKey = getPublicByAlias(publicKeyLabel);
        LunaPublicKeyEC lunaPublicKeyEC = (LunaPublicKeyEC) publicKey;
        byte[] pubKeySub = Arrays.copyOfRange(lunaPublicKeyEC.getP(), 2, lunaPublicKeyEC.getP().length);
        org.stellar.sdk.KeyPair keyPair = org.stellar.sdk.KeyPair.fromPublicKey(pubKeySub);
        boolean verified = keyPair.verify(payload, signatureByte);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60680180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档