首页
学习
活动
专区
圈层
工具
发布

ECDSA签名
EN

Stack Overflow用户
提问于 2021-10-12 18:54:13
回答 1查看 340关注 0票数 1

我已经在Java中生成了一个ECDSA签名,我希望从它获得R和S值,以便得到COSE编码的签名。据我理解,我生成的签名是DER编码的(默认情况下使用bouncyCastle)。当我使用P-256曲线(SHA256withECDSA)时,我正确地检索了R和S值.

当我使用其他曲线(P-521,P-384)时,我在将签名从一种编码解析到另一种编码时有一些问题。

下面是我如何解析它的方法:

代码语言:javascript
复制
public static byte[] extractRandSToCose(byte[] signature) {

    if (signature[0] == 0x30) {
        //parse R
        int rSize = signature[3];
        BigInteger rBigInt = new BigInteger(Arrays.copyOfRange(signature, 4, rSize+4));
        //strip out sign byte 0x00
        byte[] r = toByteArrayUnsigned(rBigInt);

        //parse S
        int sSize = signature[5 + rSize];
        int index = rSize + 6;
        BigInteger sBigInt = new BigInteger(Arrays.copyOfRange(signature, index, index+sSize));
        //strip out sign byte 0x00
        byte[] s = toByteArrayUnsigned(sBigInt);

        return Bytes.concat(r,s);
    }
    return null;
}


public static byte[] toByteArrayUnsigned(BigInteger bigInteger) {
    byte[] extractedBytes = bigInteger.toByteArray();
    int skipped = 0;
    boolean skip = true;
    for (byte b : extractedBytes) {
        boolean signByte = b == 0x00;

        if (skip && signByte) {
            skipped++;
            continue;
        } else if (skip){
            skip = false;
        }
    }
    extractedBytes = Arrays.copyOfRange(extractedBytes, skipped, extractedBytes.length);
    return extractedBytes;
}

我不明白我做错了什么。

PS:这些方法不时地起作用。它每次都适用于P-256 (无论DER签名是70 71字节还是72字节,正确地给我一个64字节长的Cose签名),P-384 ( 102,103 104字节长,适当地给我一个96字节长的cose签名),但是只工作了P-521的一半时间(138,139,140字节长,即使它做的时候只有31字节长.)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-12 22:27:35

{hash}withECDSAinP1363Format成功了!谢谢!我甚至不需要看所有的规格来看如何解析它..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69545649

复制
相关文章

相似问题

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