当我创建一个新的Amazon EC2服务器时,我ssh
照常使用它连接到它.
我看到了典型的警告:
$ ssh myserver
The authenticity of host 'ec2-12-34-567-890.compute-1.amazonaws.com (12.34.567.890)' can't be established.
ECDSA key fingerprint is 31:66:15:d2:19:41:2b:09:8a:8f:9f:bd:de:c6:ff:07.
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)
登录前如何验证指纹?
理想情况下,答案基于原始创建控制台日志之外的其他内容 - 因为日志可能会在系统重新启动后刷新,或者在生成大量输出的大型系统安装脚本期间刷新,或者连接到旧系统在创建时未跟踪的密钥.
我正在使用该ecdsa.GenerateKey
方法在Go中生成私钥/公钥对.我想将私钥存储在用户计算机上的文件中,并在程序启动时加载它.有一种方法elliptic.Marshal
可以整理公钥,但私钥没有任何内容.我应该简单地推出自己的,还是有推荐的存储私钥的方法?
首先,我必须说我使用Sage数学的知识非常有限,但我真的想改进一个能够解决我遇到的这些问题.我被要求实施以下内容:
1 - 阅读FIPS 186-4(http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf)ECDSA的定义,并使用Sage数学实现:
(a) prime eliptic curves (P-xxx)
(b) binary eliptic curves (B-xxx)
Run Code Online (Sandbox Code Playgroud)
我尝试通过浏览互联网来解决(a)并最终得到以下代码:
class ECDSA_a:
def __init__(self):
#Parameters for Curve p-256 as stated on FIPS 186-4 D1.2.3
p256 = 115792089210356248762697446949407573530086143415290314195533631308867097853951
a256 = p256 - 3
b256 = ZZ("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)
## base point values
gx = ZZ("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16)
gy = ZZ("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16)
self.F = GF(p256)
self.C = EllipticCurve ([self.F(a256), self.F(b256)])
self.G = self.C(self.F(gx), self.F(gy))
self.N = FiniteField (self.C.order()) # how many points are …
Run Code Online (Sandbox Code Playgroud) 我怎样才能从基于ECC公钥/私钥X509Certificate2
的到CngKey
的与使用ECDsaCng
和ECDiffieHellmanCng
?
我目前正在使用RSA 2048位密钥对来签名/加密内容.我这样做是通过从X509Store
安全存储的地方提取证书,并使用标记为不可导出的私钥.我想将当前实现转换为使用ECDSA和ECDH,以便我可以使用较小的密钥大小来获得相同的安全性.
我已经使用openssl成功生成了ECC证书:
openssl ecparam -out private.pem -name prime256v1 -genkey
openssl req -new -key private.pem -x509 -nodes -days 365 -out public.cer
openssl pkcs12 -export -in public.cer -inkey private.pem -out export.pfx
我已成功将上面生成的证书安装到证书库中.我可以通过thumbprint检索它们,但私钥和公钥的加密提供程序抛出"Algorithm not supported"异常.相反,我理解我应该使用ECDsaCng
和ECDiffieHellmanCng
签名/加密.但是这些都是在处理CngKey
.
Bouncy Castle不是一个选项,因为它需要私钥可以导出.
CLR Security将返回一CngKey
对via,GetCngPrivateKey
但它不能与ECDsa一起使用,因为CLRSecurity返回的密钥是ECDH密钥.此外,CLR安全性并没有给我一种方法来从X509Certificate2
签名验证中获取公钥(我甚至没有或者需要签名者的私钥).
有任何想法吗?我在我无计可施......任何帮助会很大赞赏.
对密码学知之甚少我对看似简单的任务有很大的疑问.
我有.pem证书,数据字节和该数据的签名.我想通过匹配签名来检查是否有人更改了数据.
我的尝试:
private bool VerifySignature(byte[] data, byte[] signature)
{
try
{
X509Certificate certificate = new X509Certificate("cert_filename.pem");
if (certificate == null)
return false;
DSACryptoServiceProvider dsa = (DSACryptoServiceProvider)certificate.PublicKey.Key;
return dsa.VerifyData(data, signatureData);
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误
'不支持证书密钥算法'(System.NotSupportedException).
查看加载的证书,它表示签名算法是'sha1ecdsa'.
我只是想验证数据与签名.我在这里错过了什么?我想在没有任何外部解决方案的情况下这样做,因为它似乎是非常简单的任务.
更新:我正在尝试实现与以下Java代码相同的功能:
private boolean verify(byte[] data, byte[] signature)
{
boolean isLicenseCorrect = false;
Signature sig = Signature.getInstance("SHA1WithECDSA");
sig.initVerify(certificate.getPublicKey());
sig.update(data);
return sig.verify(signature);
}
Run Code Online (Sandbox Code Playgroud) 我需要使用256位的私钥来使用ECDSA签署256位的哈希值,就像比特币一样,并且由于缺少python中的ecdsa文档,我正在绝望.
我在互联网上发现了很多代码,但没有什么比简单ecdsa.sign(msg, privkey)
或类似更容易,我发现的一切都是很多我不理解的数学代码,但他们使用的是ecdsa库(我不知道)知道为什么他们不会在用于签名的库中添加签名函数,而是在使用库时需要一页代码?).
这是我到目前为止找到的最好的代码:
def ecdsa_sign(val, secret_exponent):
"""Return a signature for the provided hash, using the provided
random nonce. It is absolutely vital that random_k be an unpredictable
number in the range [1, self.public_key.point.order()-1]. If
an attacker can guess random_k, he can compute our private key from a
single signature. Also, if an attacker knows a few high-order
bits (or a few low-order bits) of random_k, he can compute our private
key from many signatures. The generation of …
Run Code Online (Sandbox Code Playgroud) 我有一项任务,需要使用NIST SP 800-56A第5.8.1节中描述的密钥导出函数来获取密钥材料.我不是密码学方面的专家,所以如果问题很幼稚,请原谅我.这是我到目前为止所做的:
现在我尝试使用C#(.NET 4)ECDiffieHellmanCng类使用ECDH 1.3.132.1.12生成共享密钥,如下所示:
// The GetCngKey method reads the private key from a certificate in my Personal certificate store
CngKey cngPrivateKey = GetCngKey();
ECDiffieHellmanCng ecDiffieHellmanCng = new ECDiffieHellmanCng(cngPrivateKey);
ecDiffieHellmanCng.HashAlgorithm = CngAlgorithm.ECDiffieHellmanP256;
ecDiffieHellmanCng.KeyDerivationFunction = ?? // What do I set here
Run Code Online (Sandbox Code Playgroud)最后这样做:
ecDiffieHellmanCng.DeriveKeyMaterial(otherPartyPublicKey:);
Run Code Online (Sandbox Code Playgroud)
在哪里/如何设置其他参数算法ID,Party U Info,Party V Info?
编辑 我愿意使用像Bouncy Castle这样的其他库(只要它们可以从.NET调用)
创建签名消息后,我不确定如何使用生成的签名来使用公钥验证消息。
我的用例是,我想使用 Solana 钱包登录 API 服务器,其模式如下:
GET message: String (from API server)
sign message with privateKey
POST signature (to API server)
verify signature with stored publicKey
我尝试使用 nodeJScrypto.verify
来解码 API 端的签名消息,但对缓冲区和椭圆曲线的挖掘有点超出了我的深度:
// Front-end code
const toHexString = (buffer: Buffer) =>
buffer.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
const data = new TextEncoder().encode('message to verify');
const signed = await wallet.sign(data, "hex");
await setLogin({ // sends API post call to backend
variables: {
publicAddress: walletPublicKey,
signature: toHexString(signed.signature),
},
}); …
Run Code Online (Sandbox Code Playgroud) 我有一个原始(r,s)格式的ECDSA NIST P-256公钥.似乎没有简单的方法将它加载到实现java.security.interfaces.ECPublicKey的对象中.
加载64字节公钥的最简洁方法是什么,以便可以用来检查签名?
我目前正在尝试从压缩的公钥中派生出比特币未压缩的ECDSA公钥.
根据比特币维基上的这个链接,有可能这样做......但是怎么样?
为了给你更多细节:截至目前,我已经在比特币网络上收集了压缩密钥(33字节长).
它们具有以下格式:<1字节长前缀> <32字节长X>.从那里,我想获得一个未压缩的密钥(65字节长),其格式为:<1字节长前缀> <32字节长X> <32字节长Y>
Y ^ 2 = X ^ 3 + 7
但是,我似乎无法到达那里.我对Y的价值远远不够.这是我的代码(公钥的值来自比特币维基示例):
import binascii
from decimal import *
expected_uncompressed_key_hex = '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6'
expected_y_hex = expected_uncompressed_key_hex[-64:]
expected_y_dec = int(expected_y_hex, 16)
x_hex = expected_uncompressed_key_hex[2:66]
if expected_y_dec % 2 == 0:
prefix = "02"
else:
prefix = "03"
artificial_compressed_key = prefix + x_hex
getcontext().prec = 500
test_dec = Decimal(int(x_hex, 16))
y_square_dec = test_dec**3 + 7
if prefix == …
Run Code Online (Sandbox Code Playgroud) ecdsa ×10
cryptography ×4
python ×3
.net ×2
c# ×2
public-key ×2
amazon-ec2 ×1
bitcoin ×1
c#-4.0 ×1
cng ×1
ed25519 ×1
fingerprint ×1
go ×1
java ×1
sage ×1
security ×1
solana ×1
ssh ×1