繁体   English   中英

ECDSA DER 签名

[英]ECDSA DER signature

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

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

下面是我解析它的方式:

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 字节) long cose 签名),但只对 P-521 有效(138、139、140 字节长,即使这样做,cos 签名也只有 31 字节长......)

{hash}withECDSAinP1363Format成功了! 谢谢 ! 我什至不需要阅读所有这些规范来了解如何解析它......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM