公钥和私钥

公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。

公钥和私钥是成对出现的,我们会保留有自己的私钥,同时公开自己的公钥。一个很典型的例子是GitHub的使用。我们通常不会使用账号密码来管理自己的项目,而是通过将自己的公钥上传到GitHub的里,而自己的电脑里则保留有相对应的私钥,从而达到免密码提交代码。

当然私钥和公钥对是唯一的,而你也可以随时重新生成自己的公钥和私钥密码对,但当你从新生成密钥对并覆盖了就有的密钥时,你之前的公钥就作废了。

简单来说就是:
公钥加密,私钥解密,
私钥签名,公钥验证。

SHA256

SHA256是一种安全哈希算法。

简单介绍一下就是,对于任何一段信息,通过SHA256变换之后,都会是一个固定的 256 位由 0 和 1 组成的输出。同时,对于相同的信息,输出一样,而对于不一样的信息,输出则有很大的区别,即使只有一丁点的输入不一样,输出也会有非常大的不一样。

同时,虽然信息输入是无限的,而 SHA256 的输出是有限的(256位),但是根据我们目前的条件和计算能力水平来说,几乎找不到有两个不同的输入,可以得到相同的输出。也即我们可以认为是不可能的。

代码

接下来我们,我们使用 Js 的 ursa 库来生成公钥和私钥

generatePrivateAndPubKey.js

const ursa = require("ursa");
const fs = require("fs");
const path = require("path");const MODULUSBIT = 1024;class Key {static generateKeys(pathName) {const key = ursa.generatePrivateKey(MODULUSBIT, 65537);const privatePem = key.toPrivatePem("utf8");const privateKey = ursa.createPrivateKey(privatePem); // generate private keyconst privateFileName = path.join(pathName, "private.pem");const publicPem = key.toPublicPem("utf8");const publicKey = ursa.createPublicKey(publicPem); // generate public keyconst publicFileName = path.join(pathName, "public.pub");if (!fs.existsSync(pathName)) {fs.mkdirSync(pathName);}fs.writeFileSync(privateFileName, privatePem, "utf8");fs.writeFileSync(publicFileName, publicPem, "utf8");return {privateKey: privateKey,publicKey: publicKey};}static signMessage(privateKey, message) {}
}module.exports = exports = Key;

test.js

const Key = require("./generatePrivateAndPubKey.js");
const SHA256 = require("crypto-js/sha256");
const ursa = require("ursa");const fs = require("fs");
const encoding = "base64";
const algorigthm = "sha256";
const message = "Hello world";let buffer = new Buffer(message, encoding);// use Bob's private key to signed message
const BobKeys = Key.generateKeys("Bob");
const signedMessage = BobKeys.privateKey.sign(algorigthm,buffer,encoding,encoding
);// use Bob's public to verify the message
const isValid = BobKeys.publicKey.verify(algorigthm,buffer,signedMessage,encoding
);// use Bob's public key to encrypt message
const encrypted = BobKeys.publicKey.encrypt(message, encoding, "base64");
// use Bob's private key to dencrypt message
const decrypted = BobKeys.privateKey.decrypt(encrypted, "base64", encoding);console.log("Original Message:", message, "\n");
console.log("Singed Message:", signedMessage, "\n");
console.log("isValid", isValid, "\n");
console.log("Encrypted message:", encrypted, "\n");
console.log("Decrypted message:", decrypted, "\n");

输出

Original Message: Hello worldSinged Message: ARSvIgmY7iIznhuk70stOIj8bBzj4A58wlHKKUPerU1WRob+Mk3U7p5hEhX4+lyLi/F6m3O4dfJ4dESQ2aO+deocjQd4F4zv2s2RC7AhST0nIT0F4iJYAct73R1Azum8MQK+7tesKLUYPLTfjQcvaNDhG+yDl9KfMrGO/Jgtoms=isValid trueEncrypted message: 5ItG99B3H0h4lbpDDLwD8rza1nPWleWlvOok475lFLxYaI5AvdDetGZq+Cw5K/kcOb6qnpYcoNij1OCgiuSAad352vc596jEFExRZlhsTCqXTtqXblfEPOn4PUtrzrS/jn2FEUke3icF4fqtvVKFYeYpTl1rfrANhe3NrY9F5ik=Decrypted message: HelloworlQ==

接下来,让我们来测试一下 SHA256

let sha256Message = SHA256("1111").toString();
console.log("1111 After SHA256:", sha256Message, "\n");sha256Message = SHA256("1112").toString();
console.log("1112 After SHA256:", sha256Message, "\n");sha256Message = SHA256("111111111111111111").toString();
console.log("111111111111111111 After SHA256:", sha256Message, "\n");sha256Message = SHA256("111211111111111111").toString();
console.log("111211111111111111 After SHA256:", sha256Message, "\n");/*
Output:1111 After SHA256: 0ffe1abd1a08215353c233d6e009613e95eec4253832a761af28ff37ac5a150c1112 After SHA256: fe91a760983d401d9b679fb092b689488d1f46d92f3af5e9e93363326f3e8aa4111111111111111111 After SHA256: 26980a9bf7dba794bd14eae90dbda34109d37f66950c16cce7b87dffd4535b40111211111111111111 After SHA256: 308c3ae83c039dee107a232c4ccb4ee4a65ef3fb1e41357a6b9b240e88b09c0e
*/

Base64 和 Base58

比特币里用的编码方式是 Base58, 但是因为我们使用的测试库 ursa并不支持 Base58, 因此我们只能使用Base64。Base64 和 Base64 并没有什么太大的区别,在这里并不会影响我们对加解密,数字签名的理解。

为什么比特币要使用Base58呢?这里引用一下比特币源码里的注释。

//
// Why base-58 instead of standard base-64 encoding?
// - Don’t want 0OIl characters that look the same in some fonts and
// could be used to create visually identical looking account numbers.
// - A string with non-alphanumeric characters is not as easily accepted as an account number.
// - E-mail usually won’t line-break if there’s no punctuation to break at.
// - Doubleclicking selects the whole number as one word if it’s all alphanumeric.
//

简单来说就是去掉 O, I, L 这些不好区分的字符。

公钥私钥加密和SHA256相关推荐

  1. WebAPi接口安全之公钥私钥加密

    WebAPi使用公钥私钥加密介绍和使用 随着各种设备的兴起,WebApi作为服务也越来越流行.而在无任何保护措施的情况下接口完全暴露在外面,将导致被恶意请求.最近项目的项目中由于提供给APP的接口未对 ...

  2. 数字证书原理,公钥私钥加密原理

    文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...

  3. RSA加密算法(公钥+私钥加密)

    公开密钥加密 公开密钥加密(public-key cryptography),也成为非对称加密,是密码学的一种算法,他需要两个密钥,一个是公开密钥,另一个是私有密钥,一个用作加密的时候,另一个则用作解 ...

  4. 非对称加密 公钥私钥_选择Java加密算法第3部分–公钥/私钥非对称加密

    非对称加密 公钥私钥 抽象 这是涵盖Java加密算法的三部分博客系列的第3部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 RSA–4096 这第三篇文 ...

  5. 选择Java加密算法第3部分–公钥/私钥非对称加密

    抽象 这是涵盖Java加密算法的三部分博客系列的第3部分. 本系列介绍如何实现以下目标: 使用SHA–512散列 使用AES–256的单密钥对称加密 RSA–4096 这第三篇文章详细介绍了如何实现非 ...

  6. Https 公钥私钥交换过程

    记录一下Https 公钥私钥加密过程 对称加密:编/解码使用相同密钥的算法,一般是共享密钥 非对称加密:非对称加密算法需要两个密钥,公开密钥(publickey:简称公钥)和私有密钥(privatek ...

  7. 学习笔记:公钥私钥 签名验签 加密解密 CA 证书

    重点: 1.区分加密解密和签名验签(在非对称加密情景下) 加密解密:#A给B发消息# A用B的公钥进行运算(加密),B收到后用B自己的私钥进行逆向运算(解密) 签名验签:#A给B发消息# A用A自己的 ...

  8. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

  9. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

最新文章

  1. android自定义文件选择,关于安卓自定义本地文件选择库的实现
  2. 整理的16个有用的jQuery Form(表单)验证教程
  3. Win Server 2008中开启Areo特效
  4. pythonsys用法_Python中 sys.argv[]的用法简明解释
  5. for-forEach-stream.forEach三种遍历方法
  6. tooltip trigger怎么改气泡的背景颜色_精装房这样改更完美,不砸墙不改电,低预算就能做到!...
  7. Junit单元测试学习笔记(一)
  8. 【CVE-2018-12613】phpmyadmin 4.8.1 远程文件包含漏洞复现
  9. pv=clear后的修复
  10. 大规模针对iOS设备的恶意广告活动劫持3亿次浏览器会话
  11. 关于面向对象和面向过程等小例子(持续更新)
  12. VMware安装国产化操作系统--统信UOS
  13. Jenkins构建ant项目
  14. MarkDown表格合并
  15. 如何在python中获得当前时间前几天的日期
  16. 算法高级(42)-大数定律-澳门皇家菠菜,为什么你逢赌必输?
  17. 【计算机网络】分组交换和电路交换
  18. 《痞子衡嵌入式半月刊》 第 68 期
  19. java判断车牌号,包含新能源
  20. 首架无人机运送移植器官 有助于克服延误状况

热门文章

  1. 爱心树表白动画源码,word转pdf源码,websocket源码
  2. 蒙泰转债上市价格预测
  3. 电子邮件推广的十个原则
  4. 7月新能源车冰火两重天:吉利 上汽大众增速最高 风神新能源占比最高
  5. 扫盲 Linux&UNIX 命令行——从“电传打字机”聊到“shell 脚本编程”
  6. 打印机的系统是linux吗,Linux系统下打印机怎样配置?
  7. Android 超简单音乐播放器(十)歌词的实现
  8. 机器人视觉导航工作总结
  9. ZEGO教程:如何通过electron构建桌面跨平台音视频应用
  10. 画图别存为png 透明_教你Win10系统在Paint画图中使用透明背景