我已经在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字节长的cose签名),但是只工作了P-521的一半时间(138,139,140字节长,即使它做的时候只有31字节长.)。
发布于 2021-10-12 22:27:35
{hash}withECDSAinP1363Format成功了!谢谢!我甚至不需要看所有的规格来看如何解析它..。
https://stackoverflow.com/questions/69545649
复制相似问题