我一直是很长时间的读者,但这是我第一篇关于我无法找到解决方案的真实帖子.
我目前正在Windows 2012上托管一个网站,我希望运行最新的TLS 1.2密码套件.
我知道如何在Windows中启用TLS 1.1和TLS 1.2并已完成(通过注册表编辑).我也将密码顺序更改为我希望的顺序.
我的问题是:在这一步之后,我如何实际通过并设置密码套件的ECDHE/ECDSA部分?
当我在最新的chrome beta(在TLS 1.2中支持ECDHE和ECDSA,只要你使用支持的曲线)查看网站时,它似乎跳过了所有的ECHDE密码套件.
为了让ECDHE/ECDSA正常启用,我还需要做些什么吗?
我已经在网上阅读试图自己解决这个问题,他们提到制作根证书的副本,然后修改它们以某种方式支持ECDHE.我在吠叫错了树吗?
提前感谢您对此问题的任何和所有支持.
编辑:添加澄清/进度
经过更多的研究,我发现为了让ECDSA工作,你需要一份ECDSA证书.此时获得一个的唯一方法是自签,因为证书卡尚未提出适当的交叉许可协议和Ellipic Curve证书的费用结构.
由于自签名不是此站点的选项,因此我已从密码订单中删除了所有ECDSA套件.
不幸的是,因为所有的AES Galois Counter Mode套件都是ECDSA,所以暂时将其排除在外.
这让我有一个最强的密码套件ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,我相信最新版本的Chrome beta是否支持?我似乎无法让Chrome获得超越SHA-1的任何东西.没有SHA-2支持吗?即使在最新的测试版中?
我正在java中编写一个测试工具,用于与ikev2协议相关的程序.作为其中的一部分,我需要能够计算ECDSA签名(特别是使用NIST P-256曲线).
RFC 4754描述了在IKEv2中使用ECDSA并有助于提供一组测试向量(包括我需要的p256曲线).
我正在尝试使用以下代码通过java的ECDSA签名实现运行ECDSA-256测试向量值(RFC中的第8.1节):
//"abc" for the input
byte[] input = { 0x61, 0x62, 0x63 };
//Ugly way of getting the ECParameterSpec for the P-256 curve by name as opposed to specifying all the parameters manually.
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
kpg.initialize(kpgparams);
ECParameterSpec params = ((ECPublicKey) kpg.generateKeyPair().getPublic()).getParams();
//Create the static private key W from the Test Vector
ECPrivateKeySpec static_privates = new ECPrivateKeySpec(new BigInteger("DC51D3866A15BACDE33D96F992FCA99DA7E6EF0934E7097559C27F1614C88A7F", 16), params);
KeyFactory kf = KeyFactory.getInstance("EC");
ECPrivateKey spriv = …Run Code Online (Sandbox Code Playgroud) 热衷于downvoters和/或关闭者:如果你认为这是SO的offtopic,请指出我的其他StackExchange站点,这个问题更合适.
如何在PHP中实现ECDSA曲线secp256k1?
或者说:是否有任何解决方案 - 即.包括专业课程 - 已经完成了吗?
我可以看到有很多开源库,类和其他语言可用的东西(JavaScript,Python,...)但我整个下午都在谷歌上搜索一些/任何PHP解决方案而且...... 没有!.
这是我的比特币项目,我需要一种如何从私钥生成公钥的方法 ...... 然后我想生成最终的比特币地址.
我知道如何生成私钥(不要担心它是随机的或不是 - 这里不是问题)我有256位十六进制和WIF符号.但下一步:提出一个公钥,然后是最终的比特币地址,对我来说是一个问题,因为我确实没有加密的背景,我知道解决方案是以某种方式利用secp256k1.
这是我到目前为止:
// Random bytes
// $private_key = bin2hex(openssl_random_pseudo_bytes(32));
// But using brainwallet.org style to have easy comparison
$passphrase = "correct horse battery staple";
$private_key = hash('sha256', $passphrase);
var_dump ("PrivKey: $private_key");
// Bitcoin::privKeyToWIF from github.com/mikegogulski/bitcoin-php
$wif = Bitcoin::privKeyToWIF($private_key);
var_dump ("WIF PrivKey: $wif");
// And now I don't know where to even start …Run Code Online (Sandbox Code Playgroud) 我正在使用以下示例在Node.js中进行签名+验证:https://github.com/nodejs/node-v0.x-archive/issues/6904.验证在Node.js中成功,但在WebCrypto中失败.同样,使用WebCrypto签名的消息无法在Node.js中进行验证.
这是我用来验证使用WebCrypto从Node.js脚本生成的签名的代码 - https://jsfiddle.net/aj49e8sj/.在Chrome 54.0.2840.27和Firefox 48.0.2中进行了测试
// From https://github.com/nodejs/node-v0.x-archive/issues/6904
var keys = {
priv: '-----BEGIN EC PRIVATE KEY-----\n' +
'MHcCAQEEIF+jnWY1D5kbVYDNvxxo/Y+ku2uJPDwS0r/VuPZQrjjVoAoGCCqGSM49\n' +
'AwEHoUQDQgAEurOxfSxmqIRYzJVagdZfMMSjRNNhB8i3mXyIMq704m2m52FdfKZ2\n' +
'pQhByd5eyj3lgZ7m7jbchtdgyOF8Io/1ng==\n' +
'-----END EC PRIVATE KEY-----\n',
pub: '-----BEGIN PUBLIC KEY-----\n' +
'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEurOxfSxmqIRYzJVagdZfMMSjRNNh\n' +
'B8i3mXyIMq704m2m52FdfKZ2pQhByd5eyj3lgZ7m7jbchtdgyOF8Io/1ng==\n' +
'-----END PUBLIC KEY-----\n'
};
var message = (new TextEncoder('UTF-8')).encode('hello');
// Algorithm used in Node.js script is ecdsa-with-SHA1, key generated with prime256v1
var algorithm = {
name: 'ECDSA',
namedCurve: 'P-256',
hash: {
name: 'SHA-1'
}
};
// Signature …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 C# 签署比特币交易。我有 2 位代码正在尝试完成。我可以使用 Bouncy castle 创建一组私钥和公钥。我可以将其转换为钱包导入格式。
我还可以从 ECDSA 公钥生成比特币地址。
但是,我想签署一笔交易,而我拥有的只是我的私钥。我不想导入钱包并签名。那么,在仅给出私钥的情况下,如何生成公钥呢?
我发现了一个 javascript 方法可以做到这一点:
ecparams.getG().multiply(this.priv).getEncoded();
Run Code Online (Sandbox Code Playgroud)
我在 Bouncy Castle 中看到的唯一方法是生成随机对。
private static AsymmetricCipherKeyPair GenerateKeys(int keySize)
{
ECKeyPairGenerator gen = new ECKeyPairGenerator();
SecureRandom secureRandom = new SecureRandom();
KeyGenerationParameters keyGenParam = new KeyGenerationParameters(secureRandom, keySize);
gen.Init(keyGenParam);
return gen.GenerateKeyPair();
}
Run Code Online (Sandbox Code Playgroud) 我在尝试验证 Android KitKat 设备(Nexus 5)中的签名时遇到此异常。
使用KeyFactory作为 EC 算法和签名实例作为NONEwithECDSA。
异常日志:
java.security.SignatureException: error decoding signature bytes.
at com.android.org.bouncycastle.jcajce.provider.asymmetric.util.DSABase.engineVerify(DSABase.java:82)
at java.security.Signature$SignatureImpl.engineVerify(Signature.java:617)
at java.security.Signature.verify(Signature.java:375)
Run Code Online (Sandbox Code Playgroud)
谁能解释如何克服这个错误?
我想知道ECDSA签名和公钥的数据格式是什么规范(或标准)定义的?
我正在 java 卡上测试 ECDSA 签名。我发现签名和公钥值中有一个TLV格式。
* Public key (TV format)
[Tag=04] [public key value 1] [public key value 2]
04 038A3F59E813995DAB730588CFCBB985F5A1ED90C0D62960AE0B274D 2E6B12672318E0B113DECC0406B62887B6BCB9B1583B1A50779EAB5A
* Signature (TLV format)
[Tag=30] [Length=3C~3E] [Tag=02] [Length=1C~1D] [signature value 1] [Tag=02] [Length=1C~1D] [signature value 2]
303C 021C 7EEB0B2596F74344B3D7B046EA0BD17C4461FC277658CE93509F1674 021C 4F5DBFB30D994664DA80528847A767F0194876B068E5958161797991
303E 021D 0080F20B82D407AE663F010F4990F12073631D653EA1D65DC75EBD4293 021D 00880DB667EF51AEA8E7C9BB012496C7C9ECE3BC5829B82B692B9211C3
303D 021D 00F77447EF326A4A49597D0B839F68F524891F3655DA4561F1AA10EF70 021C 152F7FF18644C5E5C9118736E1F7528F0B10C5FF641C7B7CDF012129
303D 021D 00A2EBCC5C5981341D0726F2E846CC3879C74EFD64D8698589A8CEAB60 021C 6E04FF884A451D7C0737A182BC2DE7F7D3008EE182B46A009BFFC9E8
Run Code Online (Sandbox Code Playgroud)
我认为数据格式是在某些规范或标准中定义的。我只想知道文档名称。
我曾经OpenSSL使用SHA256. 现在我想使用这些证书来签署数据并验证现有的签名。
我尝试使用DSACryptoServiceProvider,但它只支持SHA1或MD5。
不过好像ECDsaCng是可以支持的ECDSA-with-SHA256。我唯一的问题是我不知道如何将私钥和公钥从 myX509Certificate2转换为必要的CngKey. 我读了另一个问题,有人描述了如何转换公钥。但是为了能够对数据进行签名,我也需要私钥。
那么有没有办法CngKey从X509Certificate2. 证书有不同的格式。我将它们作为 PFX 文件,并分别作为 CER 和 PEM 文件。
我更愿意坚持使用.NET Framework 4,但如果根本不可能使用它,我也会切换到Bouncy Castle.
我需要将 ECC 证书导入 C# 中的 Windows 密钥库。作为第一步,我使用 BouncyCastle 生成 EC 密钥对,使用公钥创建 X509 证书,并使用 ECDSA 和私钥对其进行签名,即:
var ecKeyPairGenerator = new ECKeyPairGenerator("ECDSA");
ECKeyGenerationParameters ecKeyGenParams =
new ECKeyGenerationParameters(SecObjectIdentifiers.SecP384r1, new SecureRandom());
ecKeyPairGenerator.Init(ecKeyGenParams);
AsymmetricCipherKeyPair pair = ecKeyPairGenerator.GenerateKeyPair();
PrivateKeyInfo privKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
SubjectPublicKeyInfo pubKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);
X509V3CertificateGenerator bcX509Gen = new X509V3CertificateGenerator();
// set cert fields
...
bcX509Gen.SetPublicKey(pair.Public);
Asn1SignatureFactory bcSigFactory =
new Asn1SignatureFactory(X9ObjectIdentifiers.ECDsaWithSha384.Id, pair.Private);
X509Certificate bcCert = bcX509Gen.Generate(bcSigFactory);
Run Code Online (Sandbox Code Playgroud)
然后,我使用上面创建的证书创建一个 X509Certificate2,即:
SystemX509.X509Certificate2 msCert2 =
new SystemX509.X509Certificate2(bcCert.GetEncoded(), (string)null);
Run Code Online (Sandbox Code Playgroud)
但是,在创建 X509Certificate2 时会引发异常:
'msCert2.PublicKey.Key' threw an exception of type 'System.NotSupportedException'
"The …Run Code Online (Sandbox Code Playgroud) 我知道 MS CNG 私人有这种格式 -
BCRYPT_ECCKEY_BLOB
BYTE X[cbKey] // Big-endian.
BYTE Y[cbKey] // Big-endian.
BYTE d[cbKey] // Big-endian.
因此试图导入以下关键字节 -
byte[] ec256PrivKB =
{
//Magic + CBLength
0x45, 0x43, 0x53, 0x31, 0x20, 0x00, 0x00, 0x00,
//X
0xA7, 0xFB, 0xCD, 0x4D, 0x7E, 0x43, 0x6F, 0x22, 0xBD, 0x74, 0xFA, 0x1F, 0xD7, 0x10, 0xDB, 0x8C, 0xF8, 0x29, 0xC1, 0xEC, 0x5E, 0x15, 0x1E, 0xE2, 0x84, 0x56, 0x3E, 0x54, 0x6E, 0x1D, 0x5C, 0xF6,
//Y
0x6B, 0x42, 0x21, 0xD1, 0x92, 0xEB, 0x69, 0x66, 0x56, 0xD6, 0xEC, …Run Code Online (Sandbox Code Playgroud)