标签: ecdsa

如何从先前生成的 ECDSA 编码密钥对构造私钥?

生成私钥如下:

    fun getKeyPair(): Pair<ByteArray, ByteArray> {
        Security.addProvider(provider)
        val generator = KeyPairGenerator.getInstance("ECDSA")
        val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
        generator.initialize(ecSpec)
        val keyPair = generator.generateKeyPair()
        val publicKey = keyPair.public as ECPublicKey
        val privateKey = keyPair.private
        return Pair(publicKey.q.getEncoded(true), privateKey.getEncoded())
    }
Run Code Online (Sandbox Code Playgroud)

公钥可以像这样再次重建:

    Security.addProvider(...spongy castle provider)
    val ecSpecs = ECNamedCurveTable.getParameterSpec("secp256r1")
    val q = ecSpecs.curve.decodePoint(publicKeyEncoded)
    val pubSpec = ECPublicKeySpec(q, ecSpecs)
    val keyFactory = KeyFactory.getInstance("ECDSA")
    val generatedPublic = keyFactory.generatePublic(pubSpec)
Run Code Online (Sandbox Code Playgroud)

如何同时从字节重建私钥?

更新:

此代码在实际应用程序中运行良好,但在 JUnit 测试中则不然:

val keyFactory = KeyFactory.getInstance("ECDSA")
val privSpec = PKCS8EncodedKeySpec(privateEncoded)
val generatedPrivate = keyFactory.generatePrivate(privSpec)
Run Code Online (Sandbox Code Playgroud)

在 JUnit 测试中我收到此错误:

java.security.spec.InvalidKeySpecException: …
Run Code Online (Sandbox Code Playgroud)

android cryptography bouncycastle kotlin ecdsa

5
推荐指数
1
解决办法
1143
查看次数

在python中将EC私钥从PEM转换为DER

我正在尝试编写一个 Python 脚本,以使用 Python 中的加密技术将 EC 私钥从 PKCS8 PEM 转换为 DER 。

我之前可以使用 openssl 执行此操作,如下所示:

openssl pkcs8 -nocrypt -in pem_key.p8 -out der_key.der -outform der
Run Code Online (Sandbox Code Playgroud)

我通过执行以下操作来验证使用 OpenSSL 生成的 DER 文件是否正确:

from ecdsa import SigningKey
file = open('der_key.der', 'rb')

SigningKey.from_der(file.read())

>>> <ecdsa.keys.SigningKey at 0x112bd3630>
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用 Python 做同样的事情

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

pem_key_bytes = str.encode(pem_key)

key = serialization.load_pem_private_key(
    pem_key_bytes, password=None, backend=default_backend()
)

pri_der = key.private_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption(),
)
Run Code Online (Sandbox Code Playgroud)

然而,当使用上面相同的方法在 DER 编码中测试此密钥时,我得到:

UnexpectedDER:DER 私钥开始时预期为“1”,结果为 0

我缺少什么?

python cryptography public-key ecdsa

5
推荐指数
1
解决办法
2702
查看次数

How to generate the ECDSA public key from its private key?

The following site is frequently referenced and, I assume, accurate:

https://gobittest.appspot.com/Address

I'm trying to repro these steps in Golang but failing at the first step :-(

Is someone able to provide me with a Golang snippet that, given a ECDSA private key, returns the public key? I think I may specifically mean the private key exponent and public key exponent per the above site's examples.

i.e. given e.g. a randomly-generated (hex-encoded) private key (exponent?) E83385AF76B2B1997326B567461FB73DD9C27EAB9E1E86D26779F4650C5F2B75 returns the public key 04369D83469A66920F31E4CF3BD92CB0BC20C6E88CE010DFA43E5F08BC49D11DA87970D4703B3ADBC9A140B4AD03A0797A6DE2D377C80C369FE76A0F45A7A39D3F …

go ecdsa

5
推荐指数
2
解决办法
1万
查看次数

使用 ECDSA 和 SHA256 证书进行 C# 签名验证

我正在尝试使用 C# 和内置加密库来验证使用 EC 密钥 + SHA256 创建的签名。这就是我正在做的事情。

我使用 openssl 创建了私钥和相应的证书:

$ openssl ecparam -genkey -name prime256v1 -out ca.key
$ openssl req -x509 -new -SHA256 -nodes -key ca.key -days 36500 -out ca.crt
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的键(不用担心,它们并不重要):

$ cat ca.key 
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHd3OvRV1nEnoDxGzzemX1x8l2rHasWH3L/LflUGg5vloAoGCCqGSM49
AwEHoUQDQgAE7f1xwQL5m/UcN4zL+zsly6V1g3/wNcL5TdCfWt0XfnUfg0x+RsIf
1uerBnhrmhH0cN9o0xfXg5B3hURFlXVuEQ==
-----END EC PRIVATE KEY-----

$ cat ca.crt 
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIUKt0WdaKI2eRXBO2nVk+OF6AZqHMwCgYIKoZIzj0EAwIw
RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAgFw0yMDA1MDcxMzM2MTNaGA8yMTIwMDQx
MzEzMzYxM1owRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAf
BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABO39ccEC+Zv1HDeMy/s7JculdYN/8DXC+U3Qn1rdF351H4NMfkbC
H9bnqwZ4a5oR9HDfaNMX14OQd4VERZV1bhGjUzBRMB0GA1UdDgQWBBRGuUmsyB2h
JCXMRTVMRTcdoWZQaDAfBgNVHSMEGDAWgBRGuUmsyB2hJCXMRTVMRTcdoWZQaDAP
BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIGG8tQZlh7aJaI34Y7jq
44SmSc/ule9MgjIX+Gg+i5vwAiEA9Jb/304KO4t9OMqFMQeWZXIHdzhDFBwx7FWz
78+UsnY=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

然后我有一个包含字符串“Hello”的简单数据文件。然后我使用 openssl 对该文件进行签名,如下所示:

$ openssl dgst -sha256 -sign …
Run Code Online (Sandbox Code Playgroud)

c# cryptography digital-signature x509certificate2 ecdsa

5
推荐指数
1
解决办法
3983
查看次数

如何在基于 PKCS11 的 SafeNet HSM 中使用 Brainpool 曲线生成 ECDSA 密钥?

我正在尝试使用 Safenet HSM 上的脑池曲线生成 ECDSA 密钥。我在 Safenet HSM 上启用了用户定义的域参数,但我们遇到了异常

 java.security.InvalidAlgorithmParameterException: params must be either a subtype of java.security.spec.ECParameterSpec or of type ECGenParameterSpec!
    at iaik.security.ec.common.ECKeyPairGenerator.initialize(Unknown Source) ~[iaik_eccelerate.jar:5.0]
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码

ECDSAPrivateKey obj_privateKeyTemplate = new ECDSAPrivateKey();
    ECDSAPublicKey obj_publicKeyTemplate = new ECDSAPublicKey();

    obj_privateKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
    obj_privateKeyTemplate.getToken().setBooleanValue(Boolean.FALSE); // temporary session key ?

    obj_publicKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
    obj_publicKeyTemplate.getToken().setBooleanValue(Boolean.FALSE); // temporary session key  ?
    ObjectID eccCurveObjectID = new ObjectID("1.3.36.3.3.2.8.1.1.1");
    obj_publicKeyTemplate.getEcdsaParams().setByteArrayValue(DerCoder.encode(eccCurveObjectID));
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "IAIK ECCelerate");
    AlgorithmParameterSpec keyPairGenerationSpec = (AlgorithmParameterSpec) new PKCS11KeyPairGenerationSpec(
            null, obj_publicKeyTemplate, obj_privateKeyTemplate).setUseUserRole(true)
            .setTokenManager(this.m_objTokenManager);
    keyPairGenerator.initialize(keyPairGenerationSpec, new SecureRandom());
    obj_keypair = keyPairGenerator.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。

java hsm ecdsa iaik-jce java-security

5
推荐指数
0
解决办法
430
查看次数

使用Python验证Metamask签名(以太坊)

我想使用python验证在 MetaMask 中制作的以太坊(ETH)签名。我正在开发一个使用 Flask 作为后端的网站。Javascript 代码向后端发送 POST 请求,其中包含以下 3 个变量:

{'signature': '0x0293cc0d4eb416ca95349b7e63dc9d1c9a7aab4865b5cd6d6f2c36fb1dce12d34a05039aedf0bc64931a439def451bcf313abbcc72e9172f7fd51ecca30b41dd1b', 'nonce': '6875972781', 'adress': '0x3a806c439805d6e0fdd88a4c98682f86a7111789'}
Run Code Online (Sandbox Code Playgroud)

我的目标是验证签名是否包含随机数(随机整数)并且是由公共地址签名的

我使用 javascript 使用以太库来签署随机数

const ethereum = window.ethereum;
const provider = new ethers.providers.Web3Provider(ethereum)
const signer = provider.getSigner()
var signature = await signer.signMessage(nonce);
Run Code Online (Sandbox Code Playgroud)

我尝试了几个 python libraires,但我无法格式化签名、地址和随机数以使其正常工作。这是使用 ECDSA 库进行的不成功尝试:

vk = ecdsa.VerifyingKey.from_string(bytes.fromhex(address), curve=ecdsa.SECP256k1, hashfunc=sha256) 
vk.verify(bytes.fromhex(hex(signature)), bytes(nonce, 'utf-8'))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValueError: non-hexadecimal number found in fromhex() arg at position 1
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 !

python digital-signature ecdsa ethereum metamask

5
推荐指数
1
解决办法
5491
查看次数

Javascript ECDSA获取私钥和​​公钥?

我只需要获得ECDSA的私钥和公钥.斯坦福Javascript加密库以非标准方式(https://groups.google.com/forum/?fromgroups#!topic/sjcl-discuss/UaWUyMWS3Rs)进行,这对我来说毫无用处 - 就像制作一个MD5库可以为其他所有内容提供不同的结果吗?

是否有一种在javascript中使用ECDSA的实际工作方式?

javascript cryptography ecdsa

4
推荐指数
1
解决办法
2837
查看次数

在known_hosts文件中有哪些部分ECDSA条目

我正在尝试从我的known_hosts文件中提取ecdsa公钥,ssh用它来验证主机.我下面有一个例子.

这是我的known_hosts文件中"127.0.0.1 ecdsa-sha2-nistp256"的条目:

AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF3QCzKPRluwunLRHaFVEZNGCPD/rT13yFjKiCesA1qoU3rEp9syhnJgTbaJgK70OjoT71fDGkwwcnCZuJQPFfo =

我通过base64解码器运行它来得到这个:

ECDSA-SHA2-nistp256nistp256A] 2F [RUF =wXʈ'ZSzħ2r`M:: WL0rp

所以我假设这些问号是某种分隔符[ 编辑:那些是长度].我认为nistp256是使用的椭圆曲线,但最后一个值究竟是什么?根据我一直在阅读的内容,ecdsa的公钥有一对值x和y,代表曲线上的一个点.有没有办法从那里提取x和y?

我正在尝试将其转换为java公钥对象,但我需要x和y才能这样做.

ssh cryptography ecdsa

4
推荐指数
2
解决办法
5698
查看次数

Openssl ECDSA:私钥密码

我是Openssl的新手,我生成了一个私钥myprivatekey.pem和一个publickey mypublickey.pem:

openssl ecparam -genkey -name secp160k1 -noout -out myprivatekey.pem
Run Code Online (Sandbox Code Playgroud)

和我的公钥:

openssl -ec  -in myprivatekey.pem -pubout -out mypublickey.pem
Run Code Online (Sandbox Code Playgroud)

我接下来要做的是用密码私钥加密我的ecdsa并为我的公钥发出认证请求,谢谢你的帮助.

security encryption openssl ecdsa

4
推荐指数
2
解决办法
4357
查看次数

与ECDsaCng算法一起使用的密钥必须具有ECDsa的算法组

我有以下问题,无法找到解决方案:

在使用APN(Apple推送通知)API时,我实现了标记化授权.这是苹果推送通知api的新授权方式.

Apple为我提供了私钥,我用它来创建c#CngKey对象,然后我用它来签署数据.

    CngKey key = CngKey.Import(
       Convert.FromBase64String(privateKey),
       CngKeyBlobFormat.Pkcs8PrivateBlob);

using (ECDsaCng dsa = new ECDsaCng(key))
{
    dsa.HashAlgorithm = CngAlgorithm.Sha256;
    var unsignedJwtData =
        Url.Base64urlEncode(Encoding.UTF8.GetBytes(header)) + "." + Url.Base64urlEncode(Encoding.UTF8.GetBytes(payload));
    var signature =
        dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
    return unsignedJwtData + "." + Url.Base64urlEncode(signature);
}
Run Code Online (Sandbox Code Playgroud)

结果是签名令牌,然后我在使用API​​和发送推送通知时将其用作授权标头.

它在我的开发机器上运行良好,但是当我将它部署到Windows Server时,当这段代码运行时,我接下来:

System.ArgumentException: Keys used with the ECDsaCng algorithm must have an algorithm group of ECDsa.
Parameter name: key
   at System.Security.Cryptography.ECDsaCng..ctor(CngKey key)
   at OTTCommon.Encryption.ECDSA.SignES256(String privateKey, String header, String payload, ILog log)
Run Code Online (Sandbox Code Playgroud)

我找不到解决方案,它是windows密钥存储或类似的东西....

我该怎么办?

c# apn apple-push-notifications cng ecdsa

4
推荐指数
1
解决办法
1656
查看次数