我用Java生成了一个ECDSA签名,我想从中获得R和S值。我的理解是我生成的签名是DER编码的。有人能给我提供一些Java代码(也许用Bouncy Castle)来检索作为大整数的R和S值吗?
注意:如果有帮助,我通过JCE的Signature类使用内置提供程序生成签名,并且我的P_256EC密钥对的签名长度通常徘徊在70到72字节之间。
我能够自己解决这个问题。如果它对这里的任何人有帮助,我就是这样做的(大多数异常处理已被删除以提高易读性):
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 如果我加上 对于导入,我得到了 如果我在保护后传递密码,我会收到使用帮助消息。不知道如何传递密码。 你知道我是否在正确的路径上签署谷歌上传证书文件吗?