非对称加密入门:公钥加密私钥解密,私钥签名公钥验签

1,468 阅读1分钟

文/金九链

区块链里最靠谱的东西,就是加密。因为加密是数学,不论何时,何地,谁,只要用这个加密算法,输入的东西不变,输出的一定依然是那个永恒的东西。

很多人对公钥私钥很懵圈。其实只要记住2条就好了:

1、公钥加密,私钥解密 2、私钥签名,公钥验签

下面,根据RSA加密算法,给3个例子:

第一个例子,生成私钥公钥。

const NodeRSA=require('node-rsa')
const fs=require('fs')
const private_file='./private.pem'
const public_file='./public.pem'
var key=new NodeRSA({b:512})
key.setOptions({encryptionScheme:'pkcs1'})
const privateKey=key.exportKey('private')
fs.writeFile(private_file,privateKey,(err)=>{
    if(err) throw err
    console.log('私钥已保存')
})
const publicKey=key.exportKey('public')
fs.writeFile(public_file,publicKey,(err)=>{
    if(err) throw err
    console.log('公钥已保存')
})

第二个例子,公钥加密,私钥解密

const NodeRSA = require('node-rsa')
const fs = require("fs")
const str = 'hello'
const public_file="./public.pem"
const private_file="./private.pem"

fs.exists(public_file, function (exists) {
    if (exists) {
        //公钥加密
        var pem = fs.readFileSync(public_file, 'utf8')
        var key = new NodeRSA(pem)
        encrypted = key.encrypt(str, 'base64')
        console.log('encrypted:' + encrypted)

        fs.exists(private_file, function (exists) {
            if (exists) {

                //私钥解密
                var pem = fs.readFileSync(private_file, 'utf8')
                var key = new NodeRSA(pem)
                var decrypted = key.decrypt(encrypted, 'utf8')
                console.log('decrypted:' + decrypted)
            }
        })
    }
})

第三个例子,私钥签名,公钥验签

const NodeRSA = require('node-rsa')
const fs = require("fs")
const str = 'hello'
const public_file = "./public.pem"
const private_file = "./private.pem"

fs.exists(private_file, function (exists) {
    if (exists) {
        //私钥签名
        var pem = fs.readFileSync(private_file, 'utf8')
        var key = new NodeRSA(pem)

        const sign = key.sign("hello", 'base64', 'utf8');
        console.log('私钥签名:', sign);


        //公钥验签
        fs.exists(public_file, function (exists) {
            if (exists) {
                var pem = fs.readFileSync(public_file, 'utf8')
                var key = new NodeRSA(pem)
                const verify = key.verify("hello2", sign, 'utf8', 'base64');
                console.log('公钥验签:', verify);
            }
        })
    }
})

如果大家对非对称加密感兴趣,欢迎加我微信: jin-jiu-lian