RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1606819
Accepted
Slave
Slave
Asked:2025-02-13 09:39:59 +0000 UTC2025-02-13 09:39:59 +0000 UTC 2025-02-13 09:39:59 +0000 UTC

根据 GOST 计算哈希值

  • 772

需要使用 GOST 34.11 算法来计算哈希值。文档中有一个计算示例:

<ds:Reference URI="#id-9a89bcea-eb0d-41f2-a8e8-405ad5ea0d62">
              <ds:Transforms>
                 <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
              </ds:Transforms>
              <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
              <ds:DigestValue>STvOHkqaWjQbVCkB7mnG++RLLdGmjryqTqS+BcZx4Cg=</ds:DigestValue>
           </ds:Reference>

所引用文件的范围:

<a:To wsu:Id="id-9a89bcea-eb0d-41f2-a8e8-405ad5ea0d62" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">https://ips.test.egisz.rosminzdrav.ru/57234d87b0838</a:To>

我还没有弄清楚要使用什么算法来获取哈希值(2012 年 11 月 34 日或 1994 年 11 月 34 日)。以下是 2012 年 11 月 34 日的代码(pygost 库:https://github.com/ilyaTT/pygost_0_15/tree/master):

from lxml import etree
from pygost.gost3411_12 import GOST341112
import base64

data = '''<a:To wsu:Id="id-9a89bcea-eb0d-41f2-a8e8-405ad5ea0d62" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:a="http://www.w3.org/2005/08/addressing">https://ips.test.egisz.rosminzdrav.ru/57234d87b0838</a:To>'''

parser = etree.XMLParser(remove_blank_text=True)
xml_tree = etree.fromstring(data.encode("utf-8"), parser)

canonical_xml = etree.tostring(xml_tree, method="c14n", exclusive=True).decode("utf-8")

canonical_base64 = base64.b64encode(canonical_xml.encode("utf-8")).decode("utf-8")
data_bytes = canonical_base64.encode("utf-8")[::-1]

# Хэшируем
gost_hash = GOST341112(digest_size=256)
gost_hash.update(data_bytes)
signature_hash = gost_hash.digest()[::-1]

# Хэш в шестнадцатеричной строке
hex_string = signature_hash.hex()
print("HEX:", hex_string)

new_value = base64.b64encode(signature_hash).decode()
print("BASE64:", new_value)

程序中获得的哈希值与样本中的哈希值不匹配。

GOST 34.11-1994 的实施:

from lxml import etree
from pygost.gost3411_94 import GOST341194
import base64

# Исходный XML-документ
xml_data = '''<a:To wsu:Id="id-9a89bcea-eb0d-41f2-a8e8-405ad5ea0d62" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">https://ips.test.egisz.rosminzdrav.ru/57234d87b0838</a:To>'''

root = etree.fromstring(xml_data)

# Канонизируем (c14n)
data_to_hash = etree.tostring(root, method="c14n", exclusive=True, with_comments=False)

print(type(data_to_hash))

print(data_to_hash)

# Вычисляем хэш (ГОСТ Р 34.11-94)
gost_hash = GOST341194(data_to_hash)
digest_value = gost_hash.digest()

digest_base64 = base64.b64encode(digest_value).decode()
print("DigestValue:", digest_base64)

得到了哈希:“ost9NriBuOVw2DKHUiKThCpIVkk2HITA0v6cMWv16mU=”但它应该是:“STvOHkqaWjQbVCkB7mnG++RLLdGmjryqTqS+BcZx4Cg=”

python
  • 1 1 个回答
  • 100 Views

1 个回答

  • Voted
  1. Best Answer
    Serge3leo
    2025-02-13T12:25:49Z2025-02-13T12:25:49Z

    我仍然不明白使用什么算法来获取哈希值(2012 年 11 月 34 日或 1994 年 11 月 34 日)

    http://www.w3.org/2001/04/xmldsig-more#gostr3411标识 GOST R 34.11-94,例如:https ://datatracker.ietf.org/doc/html/draft-chudov-cryptopro-cpxmldsig-00 (请注意,这是一个过时的标识符,但算法没那么过时。但是,如果某个地方的某个人仍在使用它,那么如果可能的话,它值得使用urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411)

    GOST R 34.11-2012 具有标识符urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256和urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512,例如:https://datatracker.ietf.org/doc/html/draft-smirnov-xmldsig-05

    附言

    ...(pygost库:https://github.com/ilyaTT/pygost_0_15/tree/master):

    DEFAULT_SBOX = "GostR3411_94_TestParamSet"
    ...
    class GOST341194(object):
       ...
       def __init__(self, data=b'', sbox=DEFAULT_SBOX):
           ... 
    

    这很奇怪,我甚至会说这是错的,因为测试参数仅用于测试(从 GOST R 34.11-94 开始到处都有写),如果没有明确要求,不应使用。

    虽然,如果这个库中没有其他严重的错误,它可能并不致命,但是在您的代码中:

    # Вычисляем хэш (ГОСТ Р 34.11-94)
    gost_hash = GOST341194(data_to_hash)
    

    规范指出:

    ds:DigestMethod 元素可能包含一个名为 cpxmlsec:NamedParameters 的后代元素来指定哈希算法参数。

    如果存在,哈希算法参数必须包含在 cpxmlsec:NamedParameters 元素的“URI”属性中。参数由 OID 指示,并且必须按照[RFC3061]进行格式化。可以使用[RFC4357]第 8.2 节中定义的 OID。

    如果未包含 cpxmlsec:NamedParameters 元素,则必须假定为 id-GostR3411-94-CryptoProParamSet(参见 [RFC4357])

    附言。

    pygost 值哈希被反转,您可以将其与 OpenSSL 测试用例进行比较:github.com/gost-engine/engine/blob/v3.0.3/test/01-digest.t

    据我了解,已确认问题中的代码在处理时<Reference URI=...>不会输出整个标签,而只会输出其内容。

    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5