我正在尝试使用带有 secp256r1 曲线 (P256) 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名。我也在使用 NET 库。下面的代码,
using System;
using System.Security.Cryptography;
namespace ProjetTest
{
    public static class TestProgram
    {
        public static void Main()
        {
            var data = new byte[100];
            new Random().NextBytes(data);
            var dataHash = new SHA256Cng().ComputeHash(data);
            var cng = new ECDsaCng(256);
            cng.HashAlgorithm = CngAlgorithm.Sha256;
            var signOnHash = cng.SignHash(dataHash);
            var signOnData = cng.SignData(data);
        }
    }
}
SignOnHash 和 SignOnData 应包含相同的字节数组,但它们没有。需要帮忙。
我已经用 Java 生成了一个 ECDSA 签名,我想从中获取 R 和 S 值。据我了解,我生成的签名是 DER 编码的。有人可以向我提供一些 Java 代码(可能使用 Bouncy Castle)来将 R 和 S 值检索为 BigIntegers 吗?
注意:如果有帮助,我通过 JCE 的 Signature 类使用内置提供程序生成了签名,我的 P_256 EC 密钥对的签名长度通常在 70 到 72 字节之间徘徊。
是否有为 JWK 创建指纹(又名指纹)的标准规范方法?
从我阅读的内容来看,标准似乎没有定义 akid应该如何指定,我觉得这很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是一个需要查找表的值,这样其他人可以通过拥有公钥轻松地重新创建密钥 ID。
我知道 SSH 指纹和 X.509 指纹是标准化的,但是对于使用 JWK 的所有环境(尤其是浏览器)来说,这些似乎不是一个合适的解决方案,因为它们对于幼稚的实现来说太复杂了,并且包括能够操作的库这样(即伪造)会浪费大量内存、带宽和虚拟机编译时间。
官方称它为“指纹”而不是“指纹”。
我正在使用crypto lib,遇到了一个问题:我需要将PublicKey类型转换为byte[],因为它可以使用私钥完成:
privkey.D.Bytes()
我怎么解决这个问题?
import android.os.Bundle;
import android.util.Base64;
import android.widget.Toast;
import org.bouncycastle.jce.provider.BouncyCastleProvider; // implementation 'org.bouncycastle:bcprov-jdk16:1.46'
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    static final String PUBLIC_KEY = "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMEV3EPREEDc0t4MPeuYgreLMHMVfD7iYJ2Cnkd0ucwf3GYVySvYTttMVMNMEKF554NYmdrOlqwo2s8J2tKt/oQ==";
    static final String DATA = "Hello";
    static final String SIGNATURE = "MEUCIQCsuI4OcBAyA163kiWji1lb7xAtC8S0znf62EpdA+U4zQIgBcLbXtcuxXHcwQ9/DmiVfoiigKnefeYgpVXZzjIuYn8=";
    static boolean verifyData() throws Exception {
        PublicKey pk = getPublicKey();
        byte[] signatureBytes = Base64.decode(SIGNATURE, Base64.NO_WRAP);
        Signature signature = Signature.getInstance("SHA256withECDSA", "BC");
        signature.initVerify(pk);
        signature.update(DATA.getBytes("UTF-8"));
        return signature.verify(signatureBytes);
    }
    static PublicKey getPublicKey() throws Exception {
        Security.addProvider(new BouncyCastleProvider()); …我能够在 Rust 中创建公共/私有 ecdsa 密钥,如何存储密钥以供进一步使用?我似乎找不到导出密钥的方法。
use p256::{ecdsa::{SigningKey, Signature, signature::Signer}};
use rand_core::OsRng; // requires 'getrandom' feature
fn main() {
    // Signing
    let signing_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()`
    let message = b"ECDSA proves knowledge of a secret number in the context of a single message";
    let signature = signing_key.sign(message);
    // Verification
    use p256::ecdsa::{VerifyingKey, signature::Verifier};
    let verifying_key = VerifyingKey::from(&signing_key); // Serialize with `::to_encoded_point()`
    assert!(verifying_key.verify(message, &signature).is_ok());
}
我在Wei Dai的Crypto ++应用程序中创建了一个ECDSA密钥对(secp128r1).签名和验证按预期工作.我没有将消息本身添加到签名中以最小化签名长度(正好是32字节).
但是,当我使用openssl创建签名时:
$ cat test.txt | openssl dgst -ecdsa-with-SHA1 -sign sample.key -keyform DER > act.bin
OpenSSL显然将消息本身放到签名上,从而产生更大的签名(例如39字节).如果我设置,我可以使用Crypto ++验证签名CryptoPP::SignatureVerificationFilter::PUT_MESSAGE.
我是否可以告诉OpenSSL签署一条消息而不将消息放入签名,以便生成的签名完全是32字节?
我想生成许多ec密钥对。稍微加快了速度,我改写了我的建议书以使用多个线程来完成这项工作。这是每个线程想要生成密钥的方式的代码片段:
(...)
EC_KEY* _ec_key = EC_KEY_new(); 
EC_GROUP* ec_group_new = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); 
const EC_GROUP* ec_group = ec_group_new; 
if (!EC_KEY_set_group(ec_key,ec_group)) 
  DieWithError("Error in initializeCrypto, EC_KEY_set_group failed!");
// Segfault at this position
if(!EC_KEY_generate_key(ec_key))
  DieWithError ("Error in generateKeys, EC_KEY_generate_key failed!");
(...)
EC_GROUP_free(ec_group_new); 
EC_KEY_free(ec_key);
乍一看,一切似乎都正常。使用我的i5 520m上的四个线程,应用程序的运行速度快两倍。但是在经过3-4次E6密钥生成后,它突然出现了段错误。如果我锁定EC_KEY_generate_key操作,则不再存在段错误,但是使用多个线程的优势就消失了。现在我的问题。是否可以在不破坏内存的情况下将密钥创建分成多个线程?我没有使用Google找到任何信息。不过,SSL Docu没有提及任何有关线程安全性的内容。非常感谢您的帮助。谢谢
我正在尝试使用带有secp256r1曲线(P256)的ECDSA和用于消息散列的SHA256算法生成签名.我也在使用Bouncy Castle图书馆.代码如下,
public class MyTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        new MyTest().getSign();
    }
    void getSign() {
        // Get the instance of the Key Generator with "EC" algorithm
        try {
            KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
            ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
            g.initialize(kpgparams);
            KeyPair pair = g.generateKeyPair();
            // Instance of signature class with SHA256withECDSA algorithm
            Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
            ecdsaSign.initSign(pair.getPrivate());
            System.out.println("Private Keys is::" + pair.getPrivate());
            System.out.println("Public Keys is::" + pair.getPublic());
            String msg = "text ecdsa with sha256";//getSHA256(msg) …我正在尝试使用ECDSA生成带有私钥的(自签名)证书.目标是获得与使用openssl时"相同"(pkcs12)的证书:
openssl ecparam -genkey -name secp256r1 -out mykey.key
openssl req -new -key mykey.key -out myreq.csr
openssl req -x509 -days 7 -key mykey.key -in myreq.csr -out mycert.crt
openssl pkcs12 -export -out mycert.pfx -inkey mykey.key -in mycert.crt
我已经使用BouncyCastle来帮助我创建基于RSA的证书,因此接下来的步骤或多或少都遵循我用来创建RSA证书的方式.
(请注意,BC前缀用于BouncyCastle的类,MS适用于.NET类)
1生成密钥对:私钥和公钥
BC.IAsymmetricCipherKeyPairGenerator bcKpGen = BC.GeneratorUtilities.GetKeyPairGenerator("ECDSA");
bcKpGen.Init(new BC.ECKeyGenerationParameters(BC.SecObjectIdentifiers.SecP256r1, new BC.SecureRandom()));
BC.AsymmetricCipherKeyPair bcSubjKeys = bcKpGen.GenerateKeyPair();
2使用私钥对公钥进行签名,并附加一些额外数据(主题,有效期等)
BC.X509V3CertificateGenerator bcXgen = new BC.X509V3CertificateGenerator();
// .. set subject, validity period etc
bcXgen.SetPublicKey(bcSubjKeys.Public);
BC.ISignatureFactory bcSigFac = new BC.Asn1SignatureFactory("SHA256WITHECDSA", bcSubjKeys.Private);
BC.X509Certificate bcCert = bcXgen.Generate(bcSigFac); …ecdsa ×10
cryptography ×3
bouncycastle ×2
java ×2
openssl ×2
android ×1
asn.1 ×1
c ×1
c# ×1
c++ ×1
certificate ×1
crypto++ ×1
der ×1
go ×1
jwk ×1
private-key ×1
public-key ×1
rust ×1
sha256 ×1