ECDSA算法中256位EC密钥的签名长度是多少?我想验证相同的签名长度.如果某个机构可以帮助我使用一个EC键组合将会很棒.
我想签名并验证带有椭圆曲线的pdf.我得到了一些代码,但它不起作用.
创建私钥:
openssl ecparam -genkey -name secp384r1 -noout -out private.pem
Run Code Online (Sandbox Code Playgroud)
创建公钥:
openssl ec -in private.pem -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)
签名文件:
openssl dgst -ecdsa-with-SHA1 test.pdf > hash openssl dgst
openssl dgst -ecdsa-with-SHA1 -inkey private.pem -keyform PEM -in hash > signature
Run Code Online (Sandbox Code Playgroud)
验证文件:
openssl dgst -ecdsa-with-SHA1 -verify public.pem -signature signature.bin data
Run Code Online (Sandbox Code Playgroud)
要签名和验证的部分不起作用.
我想用OpenSSL创建一个自签名证书(root ca).签名算法需要是具有SHA-256哈希的ECDSA签名.在我的Mac OS X(优胜美地)上,我安装了OpenSSL版本0.9.8zc(从2014年10月15日起).当我openssl ciphers -v在命令行上调用时,似乎我当前的OpenSSL版本不支持SHA2(使用SHA-256等).
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
DHE-RSA-SEED-SHA SSLv3 Kx=DH Au=RSA Enc=SEED(128) Mac=SHA1
DHE-DSS-SEED-SHA SSLv3 Kx=DH Au=DSS Enc=SEED(128) Mac=SHA1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个数字证书,该证书使用 EC 密钥而不是来自 RSA 的密钥进行自签名,并遵循这些 SO link1和link2。我将link1中给出的RSA签名算法替换为EC
EC_KEY *ecc = NULL;
int eccgrp = OBJ_txt2nid("secp256k1");
ecc = EC_KEY_new_by_curve_name(eccgrp);
EC_KEY_set_asn1_flag(ecc, OPENSSL_EC_NAMED_CURVE);
if(!(EC_KEY_generate_key(ecc))) {
BIO_printf(out, "Error in generating key");
printf("Error 1\n");
}
if(!EVP_PKEY_assign_EC_KEY(pk, ecc)) {
BIO_printf(out, "Error assigning EC_KEY to EVP_PKEY");
printf("Error 2\n");
}
.
.
X509_set_pubkey(x,pk);
.
.
if (!X509_sign(x,pk,EVP_md5()))
goto err;
.
.
Run Code Online (Sandbox Code Playgroud)
其余代码与链接 1 中给出的相同。没有打印错误,但是当我尝试打印 x509 证书时出现段错误X509_print_fp(stdout,x509);。这样做的正确方法是什么?
我正在尝试使用Android中的SpongyCastle生成ECDSA密钥对。这是代码:
static {
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}
public static KeyPair generate() {
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime256v1");
KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "SC");
generator.initialize(ecSpec, new SecureRandom());
KeyPair keyPair = g.generateKeyPair();
Log.i(TAG, "EC Pub Key generated: " + utils.bytesToHex(keyPair.getPublic().getEncoded()));
Log.i(TAG, "EC Private Key generated: " + utils.bytesToHex(keyPair.getPrivate().getEncoded()));
return generator.generateKeyPair();
}
Run Code Online (Sandbox Code Playgroud)
出现错误是因为我总是得到类似公钥的示例:
3059301306072A8648CE3D020106082A8648CE3D03010703420004483ABA9F322240010ECF00E818C041A60FE71A2BD64C64CD5A60519985F110AEDE6308027D2730303F5E2478F083C7F5BB683DCAC22BFEB62F3A48BD01009F40
和私钥:
308193020100301306072A8648CE3D020106082A8648CE3D030107047930770201010420219AB4B3701630973A4B2917D53F69A4BE6DAD61F48016BFEF147B2999575CB2A00A06082A8648CE3D030107A14403420004483ABA9F322240010ECF00E818C041A60FE71A2BD64C64CD5A60519985F110AEDE6308027D2730303F5E2478F083C7F5BB683DCAC22BFEB62F3A48BD01009F40
站点ECDSA样本给了我“无效的ECDSA签名消息”,它们似乎与那个较小的私有密钥有很大不同,并且总是以在同一站点中生成的“ 04”公共密钥开头。
另外,我的后端验证给我错误“无效点编码0x30”
后端Java方法检查为:
public ECPublicKey getPublicKeyFromHex(String publicKeyHex)
throws NoSuchAlgorithmException, DecoderException, ApplicationGenericException {
byte[] rawPublicKey = Hex.decodeHex(publicKeyHex.toCharArray());
ECPublicKey ecPublicKey = null;
KeyFactory kf = null;
ECNamedCurveParameterSpec ecNamedCurveParameterSpec …Run Code Online (Sandbox Code Playgroud) Linux环境:Debian 9.1,带有Gnome桌面
我同时拥有ECDSA和ED25519身份,但是从命令行,ssh-add命令会出错:
无法添加身份
怎么解决?
我正在尝试通过openssl从给定的秘密中计算公钥。我收到此错误:
main.c:27: error: incomplete definition of type 'struct ec_key_st'
printf("d: %s\n", BN_bn2hex(eckey->priv_key));
~~~~~^
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/bn.h>
#include <openssl/obj_mac.h>
int main()
{
BN_CTX *ctx = BN_CTX_new();
EC_KEY *eckey = EC_KEY_new();
EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp256k1);
EC_KEY_set_group(eckey, group);
BIGNUM *prv = BN_new();
BN_hex2bn(&prv, "b14fac12b3fa7dd6f2562a18d554fcd6818137ebb7e0d119ab0776d6407664f9");
EC_KEY_set_private_key(eckey, prv);
EC_POINT *Q = EC_POINT_new(group);
EC_POINT_mul(group, Q, prv, NULL, NULL, ctx);
EC_KEY_set_public_key(eckey, Q);
if (EC_KEY_check_key(eckey))
printf("Key succesfully checked.\n");
printf("d: %s\n", BN_bn2hex(eckey->priv_key));
printf("X: %s\n", BN_bn2hex(&eckey->pub_key->X));
printf("Y: %s\n", BN_bn2hex(&eckey->pub_key->Y));
EC_GROUP_free (group); group = NULL; …Run Code Online (Sandbox Code Playgroud) 因此,我需要使用 ECC spec256k1 从相应的 256 位数字中获取公钥。
因此,假设我从任何密码短语中使用 sha256 获取私钥,如下所示:
>>> import hashlib
>>> private_key = hashlib.sha3_256(b"Led Zeppelin - No Quarter").hexdigest()
>>> private_key
'c0b279f18074de51d075b152c8ce78b7bddb284e8cfde19896162abec0a0acce'
Run Code Online (Sandbox Code Playgroud)
如何从该私钥获取公钥?我需要将公钥打印为字符串。
我有一个用 Java 生成的公钥和签名,我想使用 ECDsaCng 在 C# 中进行验证。公钥是MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExeg15CVOUcspdO0Pm27hPVx50thn0CGk3/3NLl08qcK+0U7cesOUUwxQetMgtUHrh0lNao5XRAAurhcBtZpo6w==
我将最后 64 个字节转换为 C# ECDsaCng 可以使用的密钥,并将 0x45、0x43、0x53、0x31... 添加到它前面。
签名是使用 SHA256 在 Java 中生成的。有趣的是,如果我使用这里的工具测试签名https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html,它说这是一个有效的签名。
我一直在网上搜索,仍然没有快乐。
代码如下
static void VerifySignature()
{
var publicKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExeg15CVOUcspdO0Pm27hPVx50thn0CGk3/3NLl08qcK+0U7cesOUUwxQetMgtUHrh0lNao5XRAAurhcBtZpo6w==";
byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
var keyType = new byte[] { 0x45, 0x43, 0x53, 0x31 };
var keyLength = new byte[] { 0x20, 0x00, 0x00, 0x00 };
var key = keyType.Concat(keyLength).Concat(publicKeyBytes.TakeLast(64)).ToArray(); // 4543533120000000c5e835e4254e51cb2974ed0f9b6ee13d5c79d2d867d021a4dffdcd2e5d3ca9c2bed14edc7ac394530c507ad320b541eb87494d6a8e5744002eae1701b59a68eb
// For testing in online tool
Debug.WriteLine(ByteArrayToString(publicKeyBytes.TakeLast(65).ToArray())); //04c5e835e4254e51cb2974ed0f9b6ee13d5c79d2d867d021a4dffdcd2e5d3ca9c2bed14edc7ac394530c507ad320b541eb87494d6a8e5744002eae1701b59a68eb
var signature = "MEQCIFNEZQRzIrvr6dtJ4j4HP8nXHSts3w3qsRt8cFXBaOGAAiAJO/EjzCZlNLQSvKBinVHfSvTEmor0dc3YX7FPMnnYCg==";
var signatureBytes = …Run Code Online (Sandbox Code Playgroud) Kotlin 中是否有关于椭圆曲线加密的任何信息?
用于生成密钥对和加密、解密消息。
关于这个主题的信息很少。
例如,我想实现 ECC P-521 椭圆曲线。
是否可以在 Kotlin 中使用 Java 版本?
我们如何实现这一点?
ecdsa ×10
openssl ×4
bouncycastle ×1
c ×1
c# ×1
cryptography ×1
dsa ×1
encryption ×1
kotlin ×1
linux ×1
macos ×1
pki ×1
python ×1
sha256 ×1
signature ×1
spongycastle ×1
ssh ×1
verify ×1