当前位置: 首页 > 知识库问答 >
问题:

如何在Windows上使用.NET framework中的ECC X509证书中的公钥加密数据?

罗学林
2023-03-14

我正在使用:

  • Windows 10(版本1709,OS版本17025.1000)
  • .NET framework 4.7
  • VS 2017(版本:15.3.5)

以下是我所做的:

RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key

所以我不确定如何进一步使用ECC X509证书的公钥来加密数据。

共有1个答案

蒯卓君
2023-03-14

非对称算法有三种不同的用途(据我所知)

  • 加密
    • RSA是唯一可以直接完成此操作的“标准”算法。
    • RSA
    • DSA
    • ECDSA
    • ElGamal签名
      null
      null
    using (ECDsa ecdsa = cert.GetECDsaPublicKey())
    {
        return ECDiffieHellman.Create(ecdsa.ExportParameters(false));
    }
    
    ECDiffieHellmanPublicKey recipientPublic = GetECDHFromCertificate(cert).PublicKey;
    ECCurve curve = recipientPublic.ExportParameters().Curve;
    

    所以现在我们转到http://www.secg.org/sec1-v2.pdf第5.1节(椭圆曲线综合加密方案)

    1. 选择具有SHA-2-256的ANSI-X9.63-KDF作为哈希函数。
    2. 选择HMAC-SHA-256-256。
    3. 在CBC模式下选择AES-256。
    4. 选择椭圆曲线Diffie-Hellman原语。
    5. 您已选择SECP256R1。
    6. 硬编码。完成。
    7. 点压缩很烦人,请选择不使用它。
    8. 我将省略SharedInfo。这可能会让我变成一个坏人。
    9. 不使用异或,不使用。

    >

  • 在右曲线上制作一个短暂的键。

    ECDiffieHellman ephem = ECDiffieHellman.Create(curve);
    
    ECParameters ephemPublicParams = ephem.ExportParameters(false);
    int pointLen = ephemPublicParams.Q.X.Length;
    byte[] rBar = new byte[pointLen * 2 + 1];
    rBar[0] = 0x04;
    Buffer.BlockCopy(ephemPublicParams.Q.X, 0, rBar, 1, pointLen);
    Buffer.BlockCopy(ephemPublicParams.Q.Y, 0, rBar, 1 + pointLen, pointLen);
    
    // This is why we picked AES 256, HMAC-SHA-2-256(-256) and SHA-2-256,
    // the KDF is dead simple.
    byte[] ek = ephem.DeriveKeyFromHash(
        recipientPublic,
        HashAlgorithmName.SHA256,
        null,
        new byte[] { 0, 0, 0, 1 });
    
    byte[] mk = ephem.DeriveKeyFromHash(
        recipientPublic,
        HashAlgorithmName.SHA256,
        null,
        new byte[] { 0, 0, 0, 2 });
    
    byte[] em;
    
    // ECIES uses AES with the all zero IV. Since the key is never reused,
    // there's not risk in that.
    using (Aes aes = Aes.Create())
    using (ICryptoTransform encryptor = aes.CreateEncryptor(ek, new byte[16]))
    {
        if (!encryptor.CanTransformMultipleBlocks)
        {
            throw new InvalidOperationException();
        }
    
        em = encryptor.TransformFinalBlock(message, 0, message.Length);
    }
    
    byte[] d;
    
    using (HMAC hmac = new HMACSHA256(mk))
    {
        d = hmac.ComputeHash(em);
    }
    
    // Either
    return Tuple.Create(rBar, em, d);
    // Or
    return rBar.Concat(em).Concat(d).ToArray();
    

 类似资料:
  • 问题内容: 我需要使用公钥(pem文件)对字符串进行加密,然后使用私钥(也为pem)对其进行签名。 我正在加载pem文件: 但是经过数小时的搜索,我似乎无法找到一种使用公钥加密数据的方法。在php中,我只是调用openssl_public_encrypt,但在节点或任何模块中都看不到任何相应的功能。 如果有人有任何建议,请告诉我。 问题答案: 没有图书馆必要的朋友, 输入密码 这是一个简单的小模块

  • 问题内容: keytool中是否可以打印证书的公钥?我试过了: 但是它仅提供以下信息: 在此没有公钥。 问题答案: 您可以使用做到这一点。 如果此证书是DER编码的(二进制),请使用: 用于PEM编码的使用选项(或完全不设置)。 要查看公钥的详细信息,请使用:

  • 如何为密钥对创建X509证书?(我的类已经有了密钥对,我需要创建一个证书来保存我的公钥,然后将其存储在密钥库中)。 我期望有一个X509证书构造函数能够接收我的公钥,然后通过keystore.set条目(pvtkey,cert)存储它,但我没有发现任何有用的关联新证书和我的密钥对... 任何想法? 编辑:我也试图通过证书链为空,但它不起作用,它看起来像一个错误报告http://bugs.sun.c

  • 我使用下面的openssl命令将公钥存储到。pem文件。 但是当我尝试使用此命令时,它将整个证书信息存储在mypubkey.pem文件中。 我已经看到我可以保存我的公钥使用 但这是一个错误。我不能使用“

  • 我找到了几个可以使用的解决方案。Net RSA Provider使用公钥对消息进行加密,并使用私钥对其解密。 但我想要的是用私钥加密,用公钥解密。 我希望在我的应用程序中存储公钥,并使用私钥加密许可证,例如在我的开发人员计算机上,将其发送到应用程序,并让信息使用公钥解密。 我怎样才能做到这一点?

  • null 大多数示例使用makecert或New-SelfSignedCertificate创建证书。在这种情况下,对于生产应用程序,自签名证书是否有问题?这仅供应用程序使用Azure Key Vault进行身份验证,客户机在浏览器中不会看到这一点。 如果在这种情况下,自签名证书仍然不受欢迎,那么从受信任的权威机构购买证书是否与购买SSL/TLS证书的过程相同?甚至是同一类型的证书吗?