当前位置: 首页 > 知识库问答 >
问题:

DER 解码 ECDSA Java 签名

傅博容
2023-03-14

我用Java生成了一个ECDSA签名,我想从中获得R和S值。我的理解是我生成的签名是DER编码的。有人能给我提供一些Java代码(也许用Bouncy Castle)来检索作为大整数的R和S值吗?

注意:如果有帮助,我通过JCE的Signature类使用内置提供程序生成签名,并且我的P_256EC密钥对的签名长度通常徘徊在70到72字节之间。

共有1个答案

孔厉刚
2023-03-14

我能够自己解决这个问题。如果它对这里的任何人有帮助,我就是这样做的(大多数异常处理已被删除以提高易读性):

import java.io.ByteArrayInputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Signature;
import java.security.spec.ECGenParameterSpec;

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DecodeEcdsaSignature {

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        byte[] signature = getSignature();      
        ASN1Primitive asn1 = toAsn1Primitive(signature);

        if (asn1 instanceof ASN1Sequence) {
            ASN1Sequence asn1Sequence = (ASN1Sequence) asn1;
            ASN1Encodable[] asn1Encodables = asn1Sequence.toArray();
            for (ASN1Encodable asn1Encodable : asn1Encodables) {
                ASN1Primitive asn1Primitive = asn1Encodable.toASN1Primitive();
                if (asn1Primitive instanceof ASN1Integer) {
                    ASN1Integer asn1Integer = (ASN1Integer) asn1Primitive;
                    BigInteger integer = asn1Integer.getValue();
                    System.out.println(integer.toString());
                }
            }
        }

    }

    private static ASN1Primitive toAsn1Primitive(byte[] data) throws Exception
    {
        try (ByteArrayInputStream inStream = new ByteArrayInputStream(data);
                ASN1InputStream asnInputStream = new ASN1InputStream(inStream);) 
        {
            return asnInputStream.readObject();
        }
    }

    private static byte[] getSignature() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA");
        ECGenParameterSpec ecParameterSpec = new ECGenParameterSpec("P-256");
        keyPairGenerator.initialize(ecParameterSpec);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        Signature signature = Signature.getInstance("SHA256withECDSA");
        signature.initSign(keyPair.getPrivate());
        signature.update("message to sign".getBytes("UTF-8"));

        return signature.sign();
    }

}
 类似资料:
  • 我试图用Java创建一个ECDSA签名。当我在python中创建一个时,它可以在Java中得到很好的验证。但是反之亦然,我得到了一个BadSignatureException,Python使用ECDSA库,Java使用SpongyCastle。 签名的Python实现:

  • 我已经在Java中生成了一个ECDSA签名,我希望从中获得R和S值,以便获得COSE编码的签名。根据我的理解,我生成的签名是DER编码的(默认情况下使用bouncyCastle)。当我使用P-256曲线(SHA256withECDSA)时,我正确地检索了R和S值。 当我使用其他曲线(P-521、P-384)时,从一种编码到另一种编码的签名解析有一些问题。

  • 我想做的是: 使用证书使用openssl对zip文件进行签名,并创建签名文件(PKCS#7) 我安装了openssl并打开了控制台 我创建了一个rsa密钥(openssl genrsa-out key.pem 2048) 我创建了一个请求(openssl req-batch-sha256-new-key key.pem-out request.pem-subj'/c=../st=../l=../o

  • 我在尝试验证类中的ECDSA签名时遇到此错误。错误代码为: 我在VerificationBox中调用这个方法。java类: 这是SDSGeneration.Signing: 我写了一个测试类来测试SDSGeneration.Signing代码和一切运行良好,签名和验证数据,但是在我的项目中导入和使用它时,会出现下面的错误。这是测试类代码:

  • 我有一个DER格式的证书文件和一个DER格式的密钥文件,密钥是加密的。 我想创建一个包含PEM格式的cert和加密密钥的cer文件,如下所示: 我可以使用以下命令获得PEM格式的证书: 我还可以使用以下命令获取PEM格式的未加密密钥: 这将创建一个以以下开头的文件: -----开始RSA私钥----- 然而,我找不到一个方法让它开始 开始加密私钥 这样我就可以连接两个文件并获得证书。 你知道我能做

  • 将der文件导入密钥存储后,如下所示 我得到一个错误时,试图组装发行版APK 如果我加上 对于导入,我得到了 如果我在保护后传递密码,我会收到使用帮助消息。不知道如何传递密码。 你知道我是否在正确的路径上签署谷歌上传证书文件吗?