gpt4 book ai didi

rsa - PKCS11Interop Hash with SHA256 和 Sign with RSA 分两步

转载 作者:行者123 更新时间:2023-12-03 14:24:13 28 4
gpt4 key购买 nike

我有两个应用程序,一个计算文档的 SHA-256 哈希值,另一个计算 RSA 签名。
尝试不同的事情我得出的结论是制作 CKM_SHA256然后制作 CKM_RSA_PKCS给出与仅制作 CKM_SHA256_RSA_PKCS 不同的结果文档本身。

所以我的问题是,这两种实现有什么区别?
CKM_SHA256_RSA_PKCS 中的哈希中添加了哪些信息产生完全不同签名的机制?

最佳答案

机制 CKM_SHA256_RSA_PKCS做以下事情:

  • CKM_SHA256 一样计算数据的 SHA256 哈希值是否
  • 构造 DER 编码 DigestInfo RFC 8017 中定义的结构
  • 标志DigestInfo带有私钥的结构就像 CKM_RSA_PKCS是否

  • 在构建 DER 编码的 DigestInfo 时,有几种方法是可能的。结构体:
  • Pkcs11Admin我确实使用过的应用程序 BouncyCastle图书馆:

  • public static byte[] CreateDigestInfo(byte[] hash, string hashOid)
    {
    DerObjectIdentifier derObjectIdentifier = new DerObjectIdentifier(hashOid);
    AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(derObjectIdentifier, null);
    DigestInfo digestInfo = new DigestInfo(algorithmIdentifier, hash);
    return digestInfo.GetDerEncoded();
    }
  • Pkcs11Interop.X509Store我确实使用了预计算数组的库:

  • /// <summary>
    /// Creates DER encoded PKCS#1 DigestInfo structure defined in RFC 8017
    /// </summary>
    /// <param name="hash">Hash value</param>
    /// <param name="hashAlgorithm">Hash algorithm</param>
    /// <returns>DER encoded PKCS#1 DigestInfo structure or null</returns>
    private static byte[] CreatePkcs1DigestInfo(byte[] hash, HashAlgorithmName hashAlgorithm)
    {
    if (hash == null || hash.Length == 0)
    throw new ArgumentNullException(nameof(hash));

    byte[] pkcs1DigestInfo = null;

    if (hashAlgorithm == HashAlgorithmName.MD5)
    {
    if (hash.Length != 16)
    throw new ArgumentException("Invalid lenght of hash value");

    pkcs1DigestInfo = new byte[] { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    Array.Copy(hash, 0, pkcs1DigestInfo, pkcs1DigestInfo.Length - hash.Length, hash.Length);
    }
    else if (hashAlgorithm == HashAlgorithmName.SHA1)
    {
    if (hash.Length != 20)
    throw new ArgumentException("Invalid lenght of hash value");

    pkcs1DigestInfo = new byte[] { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    Array.Copy(hash, 0, pkcs1DigestInfo, pkcs1DigestInfo.Length - hash.Length, hash.Length);
    }
    else if (hashAlgorithm == HashAlgorithmName.SHA256)
    {
    if (hash.Length != 32)
    throw new ArgumentException("Invalid lenght of hash value");

    pkcs1DigestInfo = new byte[] { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    Array.Copy(hash, 0, pkcs1DigestInfo, pkcs1DigestInfo.Length - hash.Length, hash.Length);
    }
    else if (hashAlgorithm == HashAlgorithmName.SHA384)
    {
    if (hash.Length != 48)
    throw new ArgumentException("Invalid lenght of hash value");

    pkcs1DigestInfo = new byte[] { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    Array.Copy(hash, 0, pkcs1DigestInfo, pkcs1DigestInfo.Length - hash.Length, hash.Length);
    }
    else if (hashAlgorithm == HashAlgorithmName.SHA512)
    {
    if (hash.Length != 64)
    throw new ArgumentException("Invalid lenght of hash value");

    pkcs1DigestInfo = new byte[] { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    Array.Copy(hash, 0, pkcs1DigestInfo, pkcs1DigestInfo.Length - hash.Length, hash.Length);
    }

    return pkcs1DigestInfo;
    }

    关于rsa - PKCS11Interop Hash with SHA256 和 Sign with RSA 分两步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50273289/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com