生成私钥如下:
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) 我正在尝试编写一个 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
我缺少什么?
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 …
我正在尝试使用 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) 我正在尝试使用 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)
请帮我解决这个问题。
我想使用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)
感谢您的帮助 !
我只需要获得ECDSA的私钥和公钥.斯坦福Javascript加密库以非标准方式(https://groups.google.com/forum/?fromgroups#!topic/sjcl-discuss/UaWUyMWS3Rs)进行,这对我来说毫无用处 - 就像制作一个MD5库可以为其他所有内容提供不同的结果吗?
是否有一种在javascript中使用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才能这样做.
我是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并为我的公钥发出认证请求,谢谢你的帮助.
我有以下问题,无法找到解决方案:
在使用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密钥存储或类似的东西....
我该怎么办?
ecdsa ×10
cryptography ×5
c# ×2
python ×2
android ×1
apn ×1
bouncycastle ×1
cng ×1
encryption ×1
ethereum ×1
go ×1
hsm ×1
iaik-jce ×1
java ×1
javascript ×1
kotlin ×1
metamask ×1
openssl ×1
public-key ×1
security ×1
ssh ×1