我正在尝试用露娜HSM(Gemalto)实现EDDSA签名。
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。我不知道我在这里错过了什么。我在网上也找不到任何文件。
发布于 2020-03-14 13:27:17
这正是您所期望的X9.63兼容签名的大小,该签名由两个带符号的大数整数组成。如果您想要一个64字节的签名,那么您应该使用the following explanation转换内部的2个整数。I2OSP和OS2IP的Java实现可以找到here。
这些步骤是:
使用signature;
BigInteger值,将r值和s值作为字节数组创建(32位字节输出size);)
发布于 2020-03-16 02:37:56
我尝试了如下方法,但是验证失败了(代码更新了,现在起作用了)
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库进行验证
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);https://stackoverflow.com/questions/60680180
复制相似问题