邓于屏 發表於 2022-11-26 16:43:00

Node.js实现国密算法

<h1 id="nodejs安装">Node.js安装</h1>
<h2 id="nodejs下载">Node.js下载</h2>
<p>下载地址</p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126105328245-1757534006.png" alt="" loading="lazy"></p>
<h2 id="nodejs解压">Node.js解压</h2>
<p>使用以下指令进行解压</p>
<p><code>tar -xvf node-v18.12.1-linux-x64.tar.xz</code></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126105126368-1493821381.png" alt="" loading="lazy"></p>
<h2 id="nodejs配置">Node.js配置</h2>
<p>首先将node文件移至/usr/local/bin文件夹下</p>
<p><code>mv node-v16.18.1-linux-x64 /usr/local/bin</code></p>
<p>随后进行配置环境变量</p>
<p><code>vi /etc/profile</code></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126112100924-505859171.png" alt="" loading="lazy"></p>
<p>配置这两个环境变量,PATH若有其他变量使用<code>:</code>进行断开即可</p>
<h3 id="配置软连接未把node移至usrlocalbin的进行">配置软连接(未把node移至usr/local/bin的进行)</h3>
<p>为了使nodejs能够全局使用,我们需要配置一下软链接(类似于快捷方式,如果安装的路径在/usr/local/bin/下不需要这一步操作),当然也是软连接到用户目录下/usr/local/bin/</p>
<blockquote>
<p>软链接的命令很简单: ln -s 源文件 目标路径</p>
</blockquote>
<p>使用以下指令进行软连接</p>
<pre><code>ln -s 'nodejs路径'/bin/node /usr/local/bin/
ln -s 'nodejs路径'/bin/npm /usr/local/bin/
</code></pre>
<h2 id="nodejs验证安装">Node.js验证安装</h2>
<p>使用以下指令进行验证,若未报错则安装成功!!!</p>
<pre><code>node -v
npm -v
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126112636214-617163556.png" alt="" loading="lazy"></p>
<h1 id="gm-crypto-module下载">gm-crypto module下载</h1>
<p>使用<code>npm install gm-crypto</code>指令进行下载</p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126164510237-2147123836.png" alt="" loading="lazy"></p>
<h1 id="nodejs实现国密算法">Node.js实现国密算法</h1>
<h2 id="nodejsgm-crypto算法实现流程图">node.js+gm-crypto算法实现流程图</h2>
<p><img src="https://img2023.cnblogs.com/blog/2166999/202212/2166999-20221210165000925-1186817596.png" alt="" loading="lazy"></p>
<h2 id="sm2算法实现">SM2算法实现</h2>
<h3 id="具体代码如下">具体代码如下:</h3>
<pre><code>const { SM2 } = require('gm-crypto')

const { publicKey, privateKey } = SM2.generateKeyPair()
const originalData = '20201325xjr'

const encryptedData = SM2.encrypt(originalData, publicKey, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
console.log(encryptedData)

const decryptedData = SM2.decrypt(encryptedData, privateKey, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
console.log(decryptedData)
</code></pre>
<h3 id="使用node指令进行编译运行文件">使用node指令进行编译运行文件</h3>
<p><code>node sm2.js</code></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126161057678-1730812812.png" alt="" loading="lazy"></p>
<p>最后的结果就是这样</p>
<h2 id="sm3算法实现">SM3算法实现</h2>
<h3 id="具体代码如下-1">具体代码如下:</h3>
<pre><code>const { SM3 } = require('gm-crypto')

console.log(SM3.digest('20201325'))
console.log(SM3.digest('xjr'))
console.log(SM3.digest('112233'))

</code></pre>
<h3 id="使用node指令进行编译运行文件-1">使用node指令进行编译运行文件</h3>
<p><code>node sm3.js</code></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126164216032-68571787.png" alt="" loading="lazy"></p>
<p>经验证发现摘要值一样,算法实现准确</p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126164034297-290337528.png" alt="" loading="lazy"></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126164102018-1372054139.png" alt="" loading="lazy"></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126164126105-1912999681.png" alt="" loading="lazy"></p>
<p>最后的结果就是这样</p>
<h2 id="sm4算法实现">SM4算法实现</h2>
<h3 id="具体代码如下-2">具体代码如下:</h3>
<pre><code>const { SM4 } = require('gm-crypto')

const key = '0123456789abcdeffedcba9876543210' // Any string of 32 hexadecimal digits
const originalData = '20201325xjr'

/**
* Block cipher modes:
* - ECB: electronic codebook
* - CBC: cipher block chaining
*/

let encryptedData, decryptedData

// ECB
encryptedData = SM4.encrypt(originalData, key, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
console.log(encryptedData)

decryptedData = SM4.decrypt(encryptedData, key, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
console.log(decryptedData)


console.log('\n')


// CBC
const iv = '0123456789abcdeffedcba9876543210' // Initialization vector(any string of 32 hexadecimal digits)
encryptedData = SM4.encrypt(originalData, key, {
iv,
mode: SM4.constants.CBC,
inputEncoding: 'utf8',
outputEncoding: 'hex'
})
console.log(encryptedData)

decryptedData = SM4.decrypt(encryptedData, key, {
iv,
mode: SM4.constants.CBC,
inputEncoding: 'hex',
outputEncoding: 'utf8'
})
console.log(decryptedData)

</code></pre>
<h3 id="使用node指令进行编译运行文件-2">使用node指令进行编译运行文件</h3>
<p><code>node sm4.js</code></p>
<p><img src="https://img2022.cnblogs.com/blog/2166999/202211/2166999-20221126161820782-703620328.png" alt="" loading="lazy"></p>
<p>最后的结果就是这样</p><br><br>
来源:https://www.cnblogs.com/1314xhuan/p/16927709.html
頁: [1]
查看完整版本: Node.js实现国密算法