标签: ecdsa

如何使用 OpenSSL 命令验证 ECC 签名?

我有一个公钥、一个192位散列和一个384位签名,全部为.txt十六进制文件,曲线是prime192v1。

我可以使用哪些命令行来通过 OpenSSL 验证消息?

command-line openssl ecdsa

3
推荐指数
1
解决办法
5336
查看次数

python-ecdsa 签名大小是否正确?

在比特币维基上我发现比特币使用 ECDSA 算法和 Secp256k1 曲线。

相关链接:

在第一个链接上,它说私钥应该是 32 个字节,公钥应该是 64 个字节,签名通常在 71-73 个字节之间。它说签名可以很小的概率更小。

但是,当我运行以下 python3 代码时

>>> from ecdsa import SigningKey, SECP256k1
>>> private_key = SigningKey.generate(curve=SECP256k1)
>>> public_key = private_key.get_verifying_key()
>>> signature = private_key.sign(b'message')
>>> print((len(private_key.to_string()), len(public_key.to_string()), len(signature)))
Run Code Online (Sandbox Code Playgroud)

我得到 (32, 64, 64) 作为输出。我希望得到类似 (32, 64, 72) 的结果。

我认为正在发生以下情况之一:

  • 我误解了维基文章。
  • 我错误地使用了 python-ecdsa
  • 比特币维基不正确
  • python-ecdsa 没有正确实现

前两个是最有可能的。

谁能向我解释为什么我的期望与实际得到的不匹配?

python cryptography bitcoin ecdsa

3
推荐指数
1
解决办法
2154
查看次数

ECDSA secp256k1 密钥对生成和在 Swift 上签名

我正在为 Swift 上的 iOS 制作 Hyperledger Sawtooth 客户端原型。

在此之前,我在 Java 上为 Android 做同样的事情。在 Java 实现中,使用 SpongyCastle 库可以轻松实现:生成密钥的函数如下所示:

public static KeyPair getKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");
        ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp256k1");
        keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom());
        return keyPairGenerator.generateKeyPair();
    }
Run Code Online (Sandbox Code Playgroud)

我需要在 Swift 中做同样的事情:

生成一个secp256k1密钥对并用它对一个字节数组进行签名

并使用它来对字节数组进行签名:

        Signature signature = Signature.getInstance("ECDSA", "SC");
        signature.initSign(keyPair.getPrivate(), new SecureRandom());
        signature.update(bytes);
        byte[] signedBytes = signature.sign();
Run Code Online (Sandbox Code Playgroud)

我在谷歌上搜索了“secp256k1 swift”并找到了这些库:

所有这些都是比特币核心的 secp256k1 库与 Swift 的绑定。

我可以做类似的东西let …

cryptography ios ecdsa swift hyperledger-sawtooth

3
推荐指数
1
解决办法
3657
查看次数

使用 ECDSA 公钥验证 JWT 签名 - 解码签名字节时出错

我需要一些帮助来验证带有 ECDSA 公钥的 jwt 签名。我正在从带有充气城堡的 .pem 文件中读取密钥并使用 jjwt 进行验证。验证签名时出现错误。

Security.addProvider(new BouncyCastleProvider());
String jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJtc2kiOiI5NzE1NTA5ODc2NTUiLCJmZWEiOiJzaWdudXAtZGF0YSIsImlzcyI6IkNEUCIsImV4cCI6MTU1NDU2NjMzNiwiaWF0IjoxNTU0MzkzNTM2LCJzaWQiOiIwNDI0MDMwMDg5NzI4MTg3QG5haS5lcGMubW5jMTMwLm1jYzMxMC4zZ3BwbmV0d29yay5vcmcifQ.RwxoGmFd1_dQPeGN-0gnWIW79xXvGHoyJKBbCKajgO75UooceS6tskxwqViEuP1gZD66UE8Bd2L0FaeI2aS_IA";
PemReader pemReader = new PemReader(new FileReader("/publickey.pem"));
X509EncodedKeySpec spec = new X509EncodedKeySpec(pemReader.readPemObject().getContent());
KeyFactory kf = KeyFactory.getInstance("ECDSA","BC");
PublicKey publicKey = kf.generatePublic(spec);
Jws<Claims> claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(jwt);
Run Code Online (Sandbox Code Playgroud)

我收到签名异常:无法使用配置的 ECPublicKey 验证椭圆曲线签名。错误解码签名字节。

java bouncycastle jwt ecdsa

3
推荐指数
1
解决办法
1066
查看次数

python ECDSA 和 C micro-ecc 库之间的 ECDSA 签名和验证问题

当我执行以下操作时,我遇到问题:

  1. 使用 python 创建 ECDSA SECP256k1 曲线的公钥对并将其打印在终端上。
  2. 将密钥对复制粘贴到 Python 脚本和 Visual Studio 中(使用 micro-ecc 库的 C 编码)。因此,每次运行代码时都不会生成新密钥。
  3. 使用私钥在 Python 中签署消息(“Hello”),并在终端上打印签名和消息。我知道必须首先使用标准哈希算法(例如 SHA256)对消息进行哈希处理,但在本例中,我直接使用消息进行签名。
  4. 将签名和相同的消息(哈希)复制到 Visual Studio 中。
  5. 当我在 Visual Studio 中调用验证 API 时,尽管使用相同的公钥、消息、签名和曲线,验证还是失败了。

我正在使用的库:

  1. Visual Studio 中用于 C 的 micro-ecc https://github.com/kmackay/micro-ecc
  2. 用于 python 的 ECDSA https://github.com/warner/python-ecdsa

我已经测试并确保的其他事情:

  1. 对于相同的密钥对(例如(sk,vk)),在 python 中进行签名和验证都可以正常工作。
  2. 对于相同的密钥对(例如(sk,vk)),在 Visual Studio 中进行签名和验证都可以正常工作。
  3. 在 Visual Studio 中使用 microECC 进行签名并在 python 中使用 ECDSA 进行验证失败,使用 ECDSA 进行签名并在 python 中使用 microECC 进行验证也失败。
  4. 我确信从终端粘贴的密钥复制实际上是预期的密钥,因为我已经从复制的签名密钥中交叉验证了验证密钥并且它是匹配的。

首先,我通过运行此脚本生成密钥

生成密钥.py

import ecdsa
from ecdsa import SigningKey, SECP256k1


sk  = …
Run Code Online (Sandbox Code Playgroud)

c python cryptography public-key-encryption ecdsa

3
推荐指数
1
解决办法
4015
查看次数

Python:从以原始字节表示的私钥和公钥创建 ECC 密钥

我有以下 ECC 私钥和公钥对:

私钥: 0x63bd3b01c5ce749d87f5f7481232a93540acdb0f7b5c014ecd9cd32b041d6f33

公钥: 0x04017655e42a892cc71bccedcb1cd421d03530e1d7edb52cef143c5562c4c6f0129fa5a37738013e64a1ff0e6cb7068815a13000eb162cb7a0214dfcf3c8fa101c

曲线 : SECP256R1

我想在 Python 中加载这些密钥以执行签名操作。你能建议可能的步骤吗?

(如有必要,我很乐意使用“openssl ec”工具。)

python cryptography ecdsa

3
推荐指数
1
解决办法
4616
查看次数

使用 openssl 验证 ECDSA 签名类型时出现 ASN1 编码例程错误

我正在尝试验证外部方提供给我们的 SHA256 ECDSA 数字签名。他们已经在内部验证了他们的签名过程,但我们的尝试没有成功。我们asn1 encoding routines在 openssl 验证期间反复收到错误,但我无法看到签名或我们的流程有什么问题。

这是测试设置......公钥(pubkey.pem):

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOorVp0M8xien/r1/1Ln7TkSpzzcX
BL/MGRz66J1HSlEgBD5FwwpO1vo6jf/9azcrrrDdCi2NH9/cSDfv5D8gTA==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

被签名的消息是明文字符串:

HELLO
Run Code Online (Sandbox Code Playgroud)

数字签名(signature.sig):

JJhwReHev8cxOsNKCR5t/Ee3WU9c7tkf9RuGNamXdpXQu9OL8ZKnsrblCO7vEmOXGKGrk6NsgA5JZpQhXO3A1Q==
Run Code Online (Sandbox Code Playgroud)

我们采取的一般方法是:

# create message file
echo "HELLO" > hello.txt

#VERIFY
openssl dgst -sha256 -verify pubkey.pem -signature signature.sig hello.txt
Run Code Online (Sandbox Code Playgroud)

响应是

Error Verifying Data
4655195756:error:0DFFF09B:asn1 encoding routines:CRYPTO_internal:too long:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.260.1/libressl-2.6/crypto/asn1/asn1_lib.c:143:
4655195756:error:0DFFF066:asn1 encoding routines:CRYPTO_internal:bad object header:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.260.1/libressl-2.6/crypto/asn1/tasn_dec.c:1113:
4655195756:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.260.1/libressl-2.6/crypto/asn1/tasn_dec.c:306:Type=ECDSA_SIG

Run Code Online (Sandbox Code Playgroud)

或者,我们对签名进行 base64 编码,base64 -D signature.sig > signature.bin但得到相同的错误响应。我也尝试使用openssl pkeyutl,但这也会导致asn1 encoding routines错误。使用 ans1parse 解析签名产生:

openssl asn1parse -in …
Run Code Online (Sandbox Code Playgroud)

openssl cryptography ecdsa

3
推荐指数
1
解决办法
3257
查看次数

验证 SendGrid 的签名事件 Webhook?

我正在尝试从此链接实施验证。

https://sendgrid.com/docs/for-developers/tracking-events/getting-started-event-webhook-security-features/#the-signed-event-webhook

我不想要其中的 OAuth 部分,而是使用公钥和标头来验证数据。我看过很多与 SendGrid 的 Event Webhook 相关的帖子,但没有任何内容可以验证。

这就是我尝试过的,但显然有些问题。我真的不知道如何将文档中的代码转换为 C#。我不确定请求中的每条数据应该放在哪里。有人对此有任何见解吗?

public async Task<IHttpActionResult> EventsHook()
{
    IEnumerable<string> signatureFromHeader = Request.Headers.GetValues("X-Twilio-Email-Event-Webhook-Signature");
    byte[] timeStampBytes = Encoding.ASCII.GetBytes(Request.Headers.GetValues("X-Twilio-Email-Event-Webhook-Timestamp").First());
    byte[] body = await Request.Content.ReadAsByteArrayAsync();
    byte[] payloadHash = timeStampBytes.Concat(body).ToArray();
    byte[] signatureByteArray = Convert.FromBase64String(signatureFromHeader.First());
    var publicKey = "{myPublicKey}";
    byte[] publicKeyBytes = Convert.FromBase64String(publicKey);

    var ecdsaParams = new ECParameters
    {
        D = publicKeyBytes
    };

    using (var ecdsa = ECDsa.Create(ecdsaParams))
    {
        if (ecdsa.VerifyData(payloadHash, signatureByteArray, HashAlgorithmName.SHA256))
        {
            return Ok();
        }
        return StatusCode(System.Net.HttpStatusCode.Forbidden);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# sendgrid ecdsa webapi

3
推荐指数
1
解决办法
2455
查看次数

将ECC私钥PEM读入AsymmetryCipherKeyPair c# bouncy castle

我使用 Bouncy Castle 生成 PEM 格式的 ECC 密钥对:

var curve = ECNamedCurveTable.GetByName("secp256k1");
var domainParams = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());

var secureRandom = new SecureRandom();
var keyParams = new ECKeyGenerationParameters(domainParams, secureRandom);

var generator = new ECKeyPairGenerator("ECDSA");
generator.Init(keyParams);
AsymmetricCipherKeyPair keyPair = generator.GenerateKeyPair();
TextWriter textWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keyPair.Private);
pemWriter.Writer.Flush();
string pem_privatekey = textWriter.ToString();
Run Code Online (Sandbox Code Playgroud)

我当前的 ECC 私钥是:

-----BEGIN EC PRIVATE KEY-----MIIBUQIBAQQgyDHBaj30dcIsS4otdOXR8ue+rZDwHcGEjxwle3H24W6ggeMwgeACAQEwLAYHKoZIzj0BAQIhAP////////////////////////////////////7///wvMEQEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwRBBHm+Zn753LusVaBilc6HCwcCm/zbLc4o2VnygVsW+BeYSDradyajxGVdpPv8DhEIqP0XtEimhVQZnEfQj/sQ1LgCIQD////////////////////+uq7c5q9IoDu/0l6M0DZBQQIBAaFEA0IABHxw0PK0uEvnF1lwhkLmHUlVtQVUrLp/1EcKzfAm6xOL/I6LtQ9nXPxDNhaxf/rPtk3DkZ5CaO0hLr1trCRrJz8=-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

ECPrivateKeyParameters我想以充气城堡或格式私下阅读此 pem 格式AsymmetricCipherKeyPair 。我正在尝试以下代码。 pem就是上面的私钥字符串。

PemReader pr = new …
Run Code Online (Sandbox Code Playgroud)

c# cryptography bouncycastle ecdsa private-key

3
推荐指数
1
解决办法
2745
查看次数

如何使用 Hedera JS SDK 基于 BIP-39 种子短语和自定义派生路径生成一组 ECDSA 密钥对?

我目前正在使用 Hedera JS SDK 直接使用私钥作为输入来生成单个 ECDSA 密钥对,如下所示:

const privateKey = PrivateKey.fromStringECDSA(process.env.TARGET_HEX_PRIVATE_KEY);
    
Run Code Online (Sandbox Code Playgroud)

相反,我想做这样的事情,我使用 BIP-39 种子短语和派生路径作为输入:

const mnemonic = Mnemonic.fromString(process.env.TARGET_SEED_PHRASE);
const privateKey = await mnemonic.toEcdsaPrivateKey('', "m/44'/60'/0'/0/0");

Run Code Online (Sandbox Code Playgroud)

然而,根据其 JsDoc 注释,MnemonictoEcdsaPrivateKey函数似乎接受一个数字数组作为派生路径的输入@param,复制如下:

    /**
     * Recover an ECDSA private key from this mnemonic phrase, with an
     * optional passphrase.
     *
     * @param {string} [passphrase]
     * @param {number[]} [path]
     * @returns {Promise<PrivateKey>}
     */
    async toEcdsaPrivateKey(passphrase = "", path) {
        return CACHE.privateKeyConstructor(
            await this._mnemonic.toEcdsaPrivateKey(passphrase, path)
        );
    }
Run Code Online (Sandbox Code Playgroud)

在我的用例中,我想使用 MetaMask,不幸的是,它还不支持每个网络配置的自定义派生路径,而是硬编码了以太坊派生路径m/44'/60'/0'/0/0。请注意,前 …

javascript mnemonics ecdsa hedera-hashgraph hedera

3
推荐指数
1
解决办法
209
查看次数