ECC(Ellipse Curve Cryptography)+AES(Advanced Encryption Standard)前端通讯加密模拟(使用eccrypto-js)
前置知识
不了解对称加密与非对称加密的小伙伴可以看看下面的文章,想详细学习与区块链有关的加密算法可以戳这里
对称与非对称加密
https://blog.csdn.net/u013320868/article/details/54090295
ECC
ECC椭圆曲线详解(有具体实例) - Kalafinaian - 博客园 (cnblogs.com)
AES
维基百科:https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86
ECC+AES
Alice给Bob发消息,Alice用AES密钥Key加密消息得到密文M,用Bob的公钥加密AES的密钥得到Key',将M和Key'发给Bob,Bob拿到后用自己的私钥解密Key'得到Key,再用Key解密M得到明文。
为什么不能直接用ECC进行非对称加密,要用ECC加密AES的密钥?
如果单独使用AES,没有经过加密的密钥不方便传递,很容易在传输中被截获。
如果单独使用ECC,非对称加密的速度慢、加密效率低。
代码
ECC椭圆曲线加密算法目前的应用还不是很成熟,crypto-js中没有应用ECC的加密函数。
通过npm搜索eccrypto会找到一些由个人发布的package,大多涉及JavaScript中的Promise对象,不熟悉的小伙伴可以先了解一下Promise。
Promise - 廖雪峰的官方网站 (liaoxuefeng.com)
我选择了使用eccrypto-js(www.npmjs.com),这个package包含了实现AES和ECC的函数,且参数类型都是buffer,如果不能同时包含就要import不同的package,参数类型等可能不兼容,会带来一些麻烦。
该示例是前端加解密的示例,在实际应用中适用于端对端加密,不涉及服务器的加解密。
由于文章只能给出一个加密示例,没有具体的通讯接口,所以我就用注释Alice来表示Alice端,Bob来表示Bob端,并模拟Alice向Bob通讯的过程,Bob向Alice通讯就是反向过程,不多赘述。加解密得到的信息输出到控制台中。
PS:
1.在代码中,ECC的公私钥和AES的密钥都是随机产生的,实际生产中私钥通常和钱包或者账户关联。
2.加解密和通讯过程中都是使用buffer类型,在控制台显示时注意转换成string。
import * as eccryptoJS from 'eccrypto-js'
//加解密函数的参数都是buffer类 //Alice
//一个新的随机的32字节私钥,私钥对应的未压缩(65字节)公钥。
const keyPairA = eccryptoJS.generateKeyPair();
console.info("privateKey:", keyPairA.privateKey);
console.info("publicKey:", keyPairA.publicKey);
//send publicKey to Bob //Bob
//随机生成AES的密钥
const AESKey = eccryptoJS.randomBytes(32);
console.info("AESKey:", AESKey);
const iv = eccryptoJS.randomBytes(16); //用ECC加密AES密钥
const EncryptedAESKey = await eccryptoJS.encrypt(keyPairA.publicKey, AESKey);
console.info("EncryptedAESKey:", EncryptedAESKey); //待发送的明文str,先转成buffer格式
const str = 'test message to encrypt';
const msg = eccryptoJS.utf8ToBuffer(str); //用未加密的AES密钥加密明文
const ciphertext = await eccryptoJS.aesCbcEncrypt(iv, AESKey, msg);
console.info("ciphertext:", ciphertext);
//send 密文encrypt_str and AESKeyEncrypt to Alice,iv? //Alice
//用私钥解密加密后的AES密钥
const DecryptedAESKey = await eccryptoJS.decrypt(keyPairA.privateKey, EncryptedAESKey);
console.info("decryptedAESKey:", DecryptedAESKey);
//用AES密钥解密明文
const decrypted = await eccryptoJS.aesCbcDecrypt(iv, DecryptedAESKey, ciphertext);
console.info("decrypted:", decrypted.toString());
ECC(Ellipse Curve Cryptography)+AES(Advanced Encryption Standard)前端通讯加密模拟(使用eccrypto-js)的更多相关文章
- AES advanced encryption standard
// advanced encryption standard // author: karl malbrain, malbrain@yahoo.com typedef unsigned char u ...
- AES advanced encryption standard 3
This optimized <../aesbench/> AES implementation conforms to FIPS-. aes.h #ifndef _AES_H #defi ...
- AES advanced encryption standard 2
/* * FIPS-197 compliant AES implementation * * Copyright (C) 2006-2007 Christophe Devine * * Redistr ...
- java AES 加密解密工具(Advanced Encryption Standard)发现明文相同但每次重启服务后密文就会不同于是有了改进
1.通用方法 package com.qlkj.hzd.commom.utils; import javax.crypto.*; import java.io.UnsupportedEncodingE ...
- 高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.
- php AES cbc模式 pkcs7 128位加密解密(微信小程序)
PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...
- 多线程下System.Security.Cryptography.Aes CreateDecryptor报“Safe handle has been closed”的解决方案
因为系统需要对一些核心数据进行预加载以保证查询速度. 所以在application_start 事件中启用了后台线程对相关的数据进行加载并解密(为了保证解密的效率,将AES对像做了静态对像来保存:pr ...
- 目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;
1.加密算法的类图结构 2.源代码 2.1代码运行截图 2.2代码的目录结构 2.3具体代码 MethodFactory.java package jiami; public interface Me ...
- DES(Data Encryption Standard)数据加密标准
DES算法入口参数 DES算法的入口参数有三个:Key.Data.Mode.其中Key为7个字节共56位,是DES算法的工作密钥.Data为8个字节64位,是要被加密或解密的数据;Mode为DES的工 ...
随机推荐
- Jenkins 进阶篇 - 权限配置
Jenkins的授权策略 Jenkins 默认的授权策略是[登录用户可以做任何事],也就是人人都是管理员,可以修改所有的设置以及构建所有的任务,不用做任何设置,有账号登录到 Jenkins 系统即可, ...
- 《基于JQuery和CSS的特效整理》系列分享专栏
<基于JQuery和CSS的特效整理>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201724.html 文章 一款基于jQue ...
- android实现计时器(转)
新建布局文件activity_main.xml <?xml version="1.0" encoding="utf-8"?> <Linea ...
- ms17-010 永恒之蓝漏洞复现(CVE-2017-0143)
0x01 首先对目标机的开放端口进行探测,我们可以使用探测神器nmap 发现开放的445端口,然后进行下一步的ms17-010的漏洞验证 0x02 打开MSF美少妇神器,用search命令搜索ms17 ...
- QT. 学习之路 二
Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽. 举报纸和订阅者的例子:有一个报纸类 Newspaper,有一个订阅者类 Subscriber.Subscribe ...
- python 动态指定header获取网页源代码的函数
import random import requests def get_htmla(url): aui=0 while aui==0: try: header={'User-Agent':'Moz ...
- 检测当前手机正在运行的APP
import re #一定要引入,否则不提示错误,但找不到目标def jiance(sjh): aakk="adb -s {0} shell dumpsys activity activit ...
- React组件三大属性之 props
React组件三大属性之 props 理解1) 每个组件对象都会有props(properties的简写)属性2) 组件标签的所有属性都保存在props中 作用1) 通过标签属性从组件外向组件内传递变 ...
- Leetcode8. 字符串转换整数 (atoi)
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出整数
PAT乙级:1088 三人行 (20分) 题干 子曰:"三人行,必有我师焉.择其善者而从之,其不善者而改之." 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整 ...