Files
pages/2024/09/02/gmssl.html
2025-12-31 16:00:29 +00:00

378 lines
25 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Python国密算法使用探索 | Mayx的博客</title>
<meta name="generator" content="Jekyll v3.9.5" />
<meta property="og:title" content="Python国密算法使用探索" />
<meta name="author" content="mayx" />
<meta property="og:locale" content="zh_CN" />
<meta name="description" content="使用罕见的算法是什么感受😁" />
<meta property="og:description" content="使用罕见的算法是什么感受😁" />
<meta property="og:site_name" content="Mayx的博客" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2024-09-02T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Python国密算法使用探索" />
<meta name="google-site-verification" content="huTYdEesm8NaFymixMNqflyCp6Jfvd615j5Wq1i2PHc" />
<meta name="msvalidate.01" content="0ADFCE64B3557DC4DC5F2DC224C5FDDD" />
<meta name="yandex-verification" content="fc0e535abed800be" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"mayx"},"dateModified":"2024-09-02T00:00:00+08:00","datePublished":"2024-09-02T00:00:00+08:00","description":"使用罕见的算法是什么感受😁","headline":"Python国密算法使用探索","mainEntityOfPage":{"@type":"WebPage","@id":"/2024/09/02/gmssl.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2024/09/02/gmssl.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2024/09/02/gmssl.html" />
<link type="application/atom+xml" rel="alternate" href="/atom.xml" title="Mayx的博客" />
<link rel="alternate" type="application/rss+xml" title="Mayx的博客(RSS)" href="/rss.xml" />
<link rel="alternate" type="application/json" title="Mayx的博客(JSON Feed)" href="/feed.json" />
<link rel="stylesheet" href="/assets/css/style.css?v=1767196818" />
<!--[if !IE]> -->
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
<!-- <![endif]-->
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Mayx的博客" />
<link rel="webmention" href="https://webmention.io/mabbs.github.io/webmention" />
<link rel="pingback" href="https://webmention.io/mabbs.github.io/xmlrpc" />
<link rel="preconnect" href="https://summary.mayx.eu.org" crossorigin="anonymous" />
<link rel="prefetch" href="https://www.blogsclub.org/badge/mabbs.github.io" as="image" />
<link rel="blogroll" type="text/xml" href="/blogroll.opml" />
<link rel="me" href="https://github.com/Mabbs" />
<script src="/assets/js/jquery.min.js"></script>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<script>
var lastUpdated = new Date("Thu, 01 Jan 2026 00:00:18 +0800");
var BlogAPI = "https://summary.mayx.eu.org";
</script>
<script src="/assets/js/main.js"></script>
<!--[if !IE]> -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="async" src="https://www.googletagmanager.com/gtag/js?id=UA-137710294-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-137710294-1');
</script>
<script src="/assets/js/instant.page.js" type="module"></script>
<!-- <![endif]-->
</head>
<body>
<!--[if !IE]> --><noscript><marquee style="top: -15px; position: relative;"><small>发现当前浏览器没有启用JavaScript这不影响你的浏览但可能会有一些功能无法使用……</small></marquee></noscript><!-- <![endif]-->
<!--[if IE]><marquee style="top: -15px; position: relative;"><small>发现当前浏览器为Internet Explorer这不影响你的浏览但可能会有一些功能无法使用……</small></marquee><![endif]-->
<div class="wrapper">
<header class="h-card">
<h1><a class="u-url u-uid p-name" rel="me" href="/">Mayx的博客</a></h1>
<img src="https://avatars0.githubusercontent.com/u/17966333" fetchpriority="high" class="u-photo" alt="Logo" style="width: 90%; max-width: 300px; max-height: 300px;" />
<p class="p-note">Mayx's Home Page</p>
<form action="/search.html">
<input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.." />&#160;<input type="submit" value="搜索" />
</form>
<br />
<p class="view"><a class="u-url" href="/Mabbs/">About me</a></p>
<ul class="downloads">
<li style="width: 270px; border-right: none;"><a href="/MayxBlog.tgz">Download <strong>TGZ File</strong></a></li>
</ul>
</header>
<section class="h-entry">
<small><time class="date dt-published" datetime="2024-09-02T00:00:00+08:00">2 September 2024</time> - 字数统计2149 - 阅读大约需要7分钟 - Hits: <span id="/2024/09/02/gmssl.html" class="visitors">Loading...</span></small>
<h1 class="p-name">Python国密算法使用探索</h1>
<p class="view">by <a class="p-author h-card" href="//github.com/Mabbs">mayx</a></p>
<div id="outdate" style="display:none;">
<hr /><p>
这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。
</p>
</div>
<script>
daysold = Math.floor((new Date().getTime() - new Date("Mon, 02 Sep 2024 00:00:00 +0800").getTime()) / (24 * 60 * 60 * 1000));
if (daysold > 90) {
document.getElementById("outdate").style.display = "block";
document.getElementById("outime").innerHTML = daysold;
}
</script>
<hr />
<b>AI摘要</b>
<p id="ai-output">这篇文章讲述了作者在使用Python进行国密算法操作特别是SM3和SM2算法时的经历。作者发现虽然Python标准库的新版OpenSSL支持国密但旧版和一些第三方库如GmSSL-Python和gmssl存在兼容性问题。作者最终选择纯Python实现的gmssl库解决了SM2验签时公钥转换和HMAC-SM3在旧版Python上的自定义适配问题。作者认为虽然国内国密算法进入了标准但普及性不高且安全性的疑虑仍存在。</p>
<hr />
<ul><li><a href="#起因">起因</a></li><li><a href="#关于python使用国密算法的方式">关于Python使用国密算法的方式</a></li><li><a href="#使用sm2withsm3进行验签">使用SM2withSM3进行验签</a></li><li><a href="#使用hmac-sm3对数据进行消息验证">使用HMAC-SM3对数据进行消息验证</a></li><li><a href="#感想">感想</a></li></ul>
<hr />
<main class="post-content e-content" role="main"><p>使用罕见的算法是什么感受😁<!--more--></p>
<h1 id="起因">
<a href="#起因"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 起因
</h1>
<p>前段时间因为某些原因需要对某些东西进行密评改造需要使用国密算法。虽然国密算法也算进入标准了但是网上能搜到的资料还是太少了尤其是Python的大多资料都是Java的所以我打算自己研究研究。</p>
<h1 id="关于python使用国密算法的方式">
<a href="#关于python使用国密算法的方式"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 关于Python使用国密算法的方式
</h1>
<p>其实在新版OpenSSL中已经支持了国密算法比如SM3还有SM4不过<a href="https://github.com/pyca/pyopenssl">pyOpenSSL</a>似乎只有对非对称加密算法的支持……我倒是不在乎,因为在我实际应用里加解密都是服务器密码机处理的,我自己连密钥也看不到,所以不需要管怎么实现。但是签名验签还有摘要算法之类的理论上应该是可以自己实现的,毕竟算法是公开的。 </p><p>
关于摘要算法SM3我搜了一下似乎因为它已经进入标准了至少在新版的Python中可以用<code class="language-plaintext highlighter-rouge">hashlib.new("sm3")</code>这样的方式进行计算但是旧版的Python用不了……所以如果要在旧版Python上处理还得自己想办法。 </p><p>
既然标准库不太能满足那第三方库选哪个比较好呢我看用的比较多的一个是封装C库<a href="https://github.com/guanzhi/GmSSL">GmSSL</a><a href="https://github.com/GmSSL/GmSSL-Python">GmSSL-Python</a>想要安装得先安装那个C库还有一个是纯Python实现的<a href="https://github.com/duanhongyi/gmssl">gmssl</a>。对我来说的话我更喜欢后面那个纯python实现的虽然效率低了点但是看起来比较简单虽然看起来不是很专业🤣那个C库包装的感觉有点复杂……而且这两个库有冲突所以最终我选择了那个纯Python实现的版本。</p>
<h1 id="使用sm2withsm3进行验签">
<a href="#使用sm2withsm3进行验签"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 使用SM2withSM3进行验签
</h1>
<p>在一些挑战应答方式的登录方式中就需要用到这种东西服务器发送一个随机数让客户端用私钥签名然后服务器用公钥进行验签。我看了一下那个库的“gmssl.sm2.CryptSM2”中有个verify_with_sm3方法挺符合需求的但有个问题是它这个CryptSM2传入的公钥是串数字但客户端传来的是证书……看来还得解析证书我看pyOpenSSL库里有加载证书还有导出公钥的方法但是那个导出的公钥也不是一串数字……后来看了半天发现导出的公钥的倒数130位才是公钥😅……最终把所有的值带进去试了一下终于没问题了最终的代码如下</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">OpenSSL.crypto</span>
<span class="kn">from</span> <span class="nn">gmssl</span> <span class="kn">import</span> <span class="n">sm2</span>
<span class="kn">import</span> <span class="nn">base64</span>
<span class="n">certSign</span> <span class="o">=</span> <span class="s">""</span> <span class="c1"># 证书
</span><span class="n">signBytes</span> <span class="o">=</span> <span class="sa">b</span><span class="s">""</span> <span class="c1"># 签名
</span><span class="n">inData</span> <span class="o">=</span> <span class="sa">b</span><span class="s">""</span> <span class="c1"># 被签名的值
</span>
<span class="n">sm2</span><span class="p">.</span><span class="n">CryptSM2</span><span class="p">(</span>
<span class="n">private_key</span><span class="o">=</span><span class="s">""</span><span class="p">,</span>
<span class="n">public_key</span><span class="o">=</span><span class="n">OpenSSL</span><span class="p">.</span><span class="n">crypto</span><span class="p">.</span><span class="n">dump_publickey</span><span class="p">(</span>
<span class="n">OpenSSL</span><span class="p">.</span><span class="n">crypto</span><span class="p">.</span><span class="n">FILETYPE_ASN1</span><span class="p">,</span>
<span class="n">OpenSSL</span><span class="p">.</span><span class="n">crypto</span><span class="p">.</span><span class="n">load_certificate</span><span class="p">(</span>
<span class="n">OpenSSL</span><span class="p">.</span><span class="n">crypto</span><span class="p">.</span><span class="n">FILETYPE_PEM</span><span class="p">,</span>
<span class="sa">f</span><span class="s">"""-----BEGIN CERTIFICATE-----
</span><span class="si">{</span><span class="n">certSign</span><span class="si">}</span><span class="s">
-----END CERTIFICATE-----"""</span><span class="p">.</span><span class="n">encode</span><span class="p">(),</span>
<span class="p">).</span><span class="n">get_pubkey</span><span class="p">(),</span>
<span class="p">).</span><span class="nb">hex</span><span class="p">()[</span><span class="o">-</span><span class="mi">128</span><span class="p">:],</span>
<span class="n">asn1</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="p">).</span><span class="n">verify_with_sm3</span><span class="p">(</span><span class="n">signBytes</span><span class="p">.</span><span class="nb">hex</span><span class="p">(),</span> <span class="n">inData</span><span class="p">)</span>
</code></pre></div></div>
<h1 id="使用hmac-sm3对数据进行消息验证">
<a href="#使用hmac-sm3对数据进行消息验证"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 使用HMAC-SM3对数据进行消息验证
</h1>
<p>这个其实新版的Python可以直接用因为新版Python的hashlib里有SM3所以一句</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">hmac</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">digestmod</span><span class="o">=</span><span class="s">"sm3"</span><span class="p">).</span><span class="n">hexdigest</span><span class="p">()</span>
</code></pre></div></div>
<p>就可以了但是我用的是旧版的PythonmacOS自带的3.9.6🤣不支持……那怎么办呢我看了一下这个函数的注释写的“digestmod”这个参数除了传hashlib支持的方法之外还可以传符合<a href="https://peps.python.org/pep-0247/">PEP 247</a>的模块。显然无论是GmSSL-Python还是gmssl都没有符合这个规范。不过我可以自己写个适配器来适配这个规范。所以最终只好自己写一下了</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">hmac</span>
<span class="kn">from</span> <span class="nn">gmssl</span> <span class="kn">import</span> <span class="n">sm3</span>
<span class="k">class</span> <span class="nc">sm3_adapter</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">msg</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="p">.</span><span class="n">digest_size</span> <span class="o">=</span> <span class="mi">32</span>
<span class="bp">self</span><span class="p">.</span><span class="n">block_size</span> <span class="o">=</span> <span class="mi">64</span>
<span class="k">def</span> <span class="nf">new</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">msg</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">msg</span> <span class="o">+=</span> <span class="nb">list</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">copy</span><span class="p">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">digest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">.</span><span class="n">fromhex</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">hexdigest</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">hexdigest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">sm3</span><span class="p">.</span><span class="n">sm3_hash</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">msg</span><span class="p">)</span>
<span class="n">key</span> <span class="o">=</span> <span class="sa">b</span><span class="s">""</span> <span class="c1"># 密钥
</span><span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="s">""</span> <span class="c1"># 数据
</span><span class="n">hmac</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">digestmod</span><span class="o">=</span><span class="n">sm3_adapter</span><span class="p">).</span><span class="n">hexdigest</span><span class="p">()</span>
</code></pre></div></div>
<h1 id="感想">
<a href="#感想"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 感想
</h1>
<p>这么看来使用国密算法加密倒是也没很复杂但是和国际标准相比也没什么优势。虽然有些地方强制使用那确实没啥办法但是想要普及肯定是不用想了另外我自己的东西肯定是不敢用国密虽然进了标准而且也开放了算法但是很难说会不会像Dual_EC_DRBG算法那样偷偷插了后门 <del>(虽然我觉得他们应该没这个实力🤣)</del> ,但国际算法有后门我不怕,国内算法有后门那就吓人了🤣。</p></main>
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=Python"><em>Python</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=GmSSL"><em>GmSSL</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=%E5%9B%BD%E5%AF%86"><em>国密</em></a> <span style="float: right;"><a href="https://gitlab.com/mayx/mayx.gitlab.io/tree/master/_posts/2024-09-02-gmssl.md">查看原始文件</a></span></small>
<h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4>
<p id="suggest-container">Loading...</p>
<script>
var suggest = $("#suggest-container");
$.get(BlogAPI + "/suggest?id=/2024/09/02/gmssl.html&update=" + lastUpdated.valueOf(), function (data) {
if (data.length) {
getSearchJSON(function (search) {
suggest.empty();
var searchMap = {};
for (var i = 0; i < search.length; i++) {
searchMap[search[i].url] = search[i];
}
var tooltip = $('<div class="content-tooltip"></div>').appendTo('body').hide();
for (var j = 0; j < data.length; j++) {
var item = searchMap[data[j].id];
if (item) {
var link = $('<a href="' + item.url + '">' + item.title + '</a>');
var contentPreview = item.content.substring(0, 100);
if (item.content.length > 100) {
contentPreview += "……";
}
link.hover(
function(e) {
tooltip.text($(this).data('content'))
.css({
top: e.pageY + 10,
left: e.pageX + 10
})
.show();
},
function() {
tooltip.hide();
}
).mousemove(function(e) {
tooltip.css({
top: e.pageY + 10,
left: e.pageX + 10
});
}).data('content', contentPreview);
suggest.append(link);
suggest.append(' - ' + item.date + '<br />');
}
}
});
} else {
suggest.html("暂无推荐文章……");
}
});
</script>
<br />
<div class="pagination">
<span class="prev">
<a href="/2024/08/17/mac-mini.html">
上一篇Mac mini 2018使用体验
</a>
</span>
<br />
<span class="next">
<a href="/2024/09/27/rag.html">
下一篇用CF Vectorize把博客作为聊天AI的知识库
</a>
</span>
</div>
<!--[if !IE]> -->
<link rel="stylesheet" href="/assets/css/gitalk.css">
<script src="/assets/js/gitalk.min.js"></script>
<div id="gitalk-container"></div>
<script>
var gitalk = new Gitalk({
clientID: '36557aec4c3cb04f7ac6',
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
repo: 'mabbs.github.io',
owner: 'Mabbs',
admin: ['Mabbs'],
id: '/2024/09/02/gmssl', // Ensure uniqueness and length less than 50
distractionFreeMode: false, // Facebook-like distraction free mode
proxy: "https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token"
})
gitalk.render('gitalk-container')
</script>
<!-- <![endif]-->
</section>
<!--[if !IE]> -->
<div id="landlord" style="left:5px;bottom:0px;">
<div class="message" style="opacity:0"></div>
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
<div class="live_talk_input_body">
<form id="live_talk_input_form">
<div class="live_talk_input_name_body" >
<input type="checkbox" id="load_this" />
<input type="hidden" id="post_id" value="/2024/09/02/gmssl.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</span>
</label>
</div>
<div class="live_talk_input_text_body">
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?" />
<button type="submit" class="live_talk_send_btn" id="talk_send">发送</button>
</div>
</form>
</div>
<input name="live_talk" id="live_talk" value="1" type="hidden" />
<div class="live_ico_box" style="display:none;">
<div class="live_ico_item type_info" id="showInfoBtn"></div>
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
<div class="live_ico_item type_music" id="musicButton"></div>
<div class="live_ico_item type_youdu" id="youduButton"></div>
<div class="live_ico_item type_quit" id="hideButton"></div>
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
<input id="duType" value="douqilai" type="hidden" />
</div>
</div>
<div id="open_live2d">召唤伊斯特瓦尔</div>
<!-- <![endif]-->
<footer>
<p>
<small>Made with ❤ by Mayx<br />Last updated at 2026-01-01 00:00:18<br /> 总字数614622 - 文章数178 - <a href="/atom.xml" >Atom</a> - <a href="/README.html" >About</a></small>
</p>
</footer>
</div>
<script src="/assets/js/scale.fix.js"></script>
<!--[if !IE]> -->
<script src="/assets/js/main_new.js"></script>
<script src="/Live2dHistoire/live2d/js/live2d.js"></script>
<script src="/Live2dHistoire/live2d/js/message.js"></script>
<!-- <![endif]-->
</body>
</html>