代码之家  ›  专栏  ›  技术社区  ›  FabioLovi

SHA-RSA是如何工作的?

  •  0
  • FabioLovi  · 技术社区  · 9 年前

    对不起,我的noob问题,我是这个领域的新手(但我很好奇)。 我发现了一个包含两个字段的xml文件:数据和签名。 数据是Ascii文本,签名是由256个十六进制字符(128字节)组成的SHA1-RSA1024字符串。 我不明白bi是如何从数据字段中获得签名的:数据是用RSA然后用SHA处理的,反之亦然? 我在研究RSA,我想我应该找到这样的东西:

    00 01 FF FF .. FF FF 00 DigestInfo MessageDigest 
    

    但事实并非如此:我的签名数据不包含该字符串。 你能给我解释一下获得签名的程序吗? 您是否有一个示例的链接(可能是在Python中,因为它很简单)?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Community Mohan Dere    4 年前

    这个 security.stackexchange.com answer 有相当好的细节,但这里是简短的形式(因为他们似乎不 相当地 回答你的问题。

    第一步是 EMSA-PKCS1-v1_5 哪里 M 是(未显示)消息,并且 emLen 是RSA密钥的大小(以字节为单位)(通常以位表示)。

    H = Hash(M) .我们知道 Hash SHA-1 (顺便问一下),所以输出是20字节。让我们假设它产生了 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .

    建筑 T :

    // DigestInfo = SEQUENCE(AlgorithmIdentifier, OCTET STRING)
    30 21
       // AlgorithmIdentifier = SEQUENCE(OBJECT IDENTIFIER, ANY)
       30 09
          // OBJECT IDENTIFIER(SHA1) => OBJECT IDENTIFIER(1.3.14.3.2.26)
          06 05 2B 0E 03 02 1A
          // NULL (SHA-1 has no parameters)
          05 00
       // OCTET STRING(H)
       04 14 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    

    由于此结构中的所有内容都具有固定值(SHA-1、OID)和/或长度(H=20字节),因此T仅为( 30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 康卡特 H )(适用于SHA-1)。

    假设我们有一个2048位的密钥(256字节)。由于tLen=35;tLen+11,我们可以继续了。

    现在,构建 PS 是的 emLen - tLen - 3 FF 对于具有RSA-2048的SHA-1,这意味着218的序列 FF s

    EM = 00 01 PS 00 T
    

    现在把所有东西粘在一起,我们得到(对于SHA-1和2048位密钥)

    00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    FF FF FF FF FF FF FF FF FF FF FF FF 00 30 21 30
    09 06 05 2B 0E 03 02 1A 05 00 04 14 20 20 20 20
    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    

    如您所见,散列输出在最后仍然可见。EMSA-PKCS1-v1_5填充结构似乎正是您所期望的。

    然后 EM 通过RSA私钥公式应用以生成签名:

    `signature` = MODPOW(`EM`, `d`, `n`)
    

    由于 signature 现在取决于 d (私钥)不能给出固定的示例。但这最后一步是为什么a)它是加密的声音,b)你找不到你的 MessageDigest 签名值内的值。

    对于RSA签名,签名验证为:

    `candidate` = MODPOW(`signature`, `e`, `n`)
    return ConstantTimeSequenceEquals(`candidate`, `EM`);
    

    新的RSA签名算法(PSS(概率签名方案))的工作方式截然不同。值得注意的是,DSA和ECDSA的工作方式甚至完全不同。