我有一个公钥、一个192位散列和一个384位签名,全部为.txt十六进制文件,曲线是prime192v1。
我可以使用哪些命令行来通过 OpenSSL 验证消息?
在比特币维基上我发现比特币使用 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) 的结果。
我认为正在发生以下情况之一:
前两个是最有可能的。
谁能向我解释为什么我的期望与实际得到的不匹配?
我正在为 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 …
我需要一些帮助来验证带有 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 验证椭圆曲线签名。错误解码签名字节。
当我执行以下操作时,我遇到问题:
我正在使用的库:
我已经测试并确保的其他事情:
首先,我通过运行此脚本生成密钥
生成密钥.py
import ecdsa
from ecdsa import SigningKey, SECP256k1
sk = …Run Code Online (Sandbox Code Playgroud) 我有以下 ECC 私钥和公钥对:
私钥: 0x63bd3b01c5ce749d87f5f7481232a93540acdb0f7b5c014ecd9cd32b041d6f33
公钥: 0x04017655e42a892cc71bccedcb1cd421d03530e1d7edb52cef143c5562c4c6f0129fa5a37738013e64a1ff0e6cb7068815a13000eb162cb7a0214dfcf3c8fa101c
曲线 : SECP256R1
我想在 Python 中加载这些密钥以执行签名操作。你能建议可能的步骤吗?
(如有必要,我很乐意使用“openssl ec”工具。)
我正在尝试验证外部方提供给我们的 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) 我正在尝试从此链接实施验证。
我不想要其中的 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) 我使用 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) 我目前正在使用 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 注释,Mnemonic的toEcdsaPrivateKey函数似乎接受一个数字数组作为派生路径的输入@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。请注意,前 …
ecdsa ×10
cryptography ×6
python ×3
bouncycastle ×2
c# ×2
openssl ×2
bitcoin ×1
c ×1
command-line ×1
hedera ×1
ios ×1
java ×1
javascript ×1
jwt ×1
mnemonics ×1
private-key ×1
sendgrid ×1
swift ×1
webapi ×1