前端JS后端nodeJs 实现加解密; 个人理解

//说明:
//  1.如果加密解密涉及到前端和后端,则这里的key要保持和后端的key一致
//  2.AES的算法模式有好几种(ECB,CBC,CFB,OFB),所以也要和后端保持一致
//  3.AES的补码方式有两种(PKS5,PKS7),所以也要和后端保持一致
//  4.AES的密钥长度有三种(128,192,256,默认是128),所以也要和后端保持一致
//  5.AES的加密结果编码方式有两种(base64和十六进制),具体怎么选择由自己定,但是加密和解密的编码方式要统////一

// 后端node js代码:

const express = require(‘express‘);  //调用模块

const app = express();

const server = app.listen(3002,function(){console.log(‘服务启动成功!‘);});

const crypto = require(‘crypto‘);

app.all(‘*‘, function(req, res, next) {

res.header("Access-Control-Allow-Origin", "*");

res.header("Access-Control-Allow-Headers", "X-Requested-With");

res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");

res.header("X-Powered-By",‘ 3.2.1‘)

res.header("Content-Type", "text/plain");

next();

});

app.get(‘/‘, function (req, res) {

console.log(111)

res.send(‘1111‘)

});

/**

* AES加密的配置

* 1.密钥

* 2.偏移向量

* 3.算法模式CBC

* 4.补全值

*/

var AES_conf = {

key: getSecretKey(), //密钥

iv: ‘1012132405963708‘, //偏移向量

padding: ‘PKCS7Padding‘ //补全值 需和前端padding保持一致

}

/**

* 读取密钥key

* 更具当前客户端的版本vid、平台platform获取对应的key

*/

function getSecretKey(){

return "46cc793c53dc451b";

}

/**

* AES_128_CBC 加密

* 128位

* return base64

*/

function encryption(data) {

let key = AES_conf.key;

let iv = AES_conf.iv;

// let padding = AES_conf.padding;

var cipherChunks = [];

var cipher = crypto.createCipheriv(‘aes-128-ECB‘, key, ‘‘);

cipher.setAutoPadding(true);

cipherChunks.push(cipher.update(data, ‘utf8‘, ‘base64‘));

cipherChunks.push(cipher.final(‘base64‘));

return cipherChunks.join(‘‘);

}

/**

* 解密

* return utf8

*/

function decryption(data){

let key = AES_conf.key;

let iv = AES_conf.iv;

var cipherChunks = [];

var decipher = crypto.createDecipheriv(‘aes-128-ECB‘, key, ‘‘);

decipher.setAutoPadding(true);

cipherChunks.push(decipher.update(data, ‘base64‘, ‘utf8‘));

cipherChunks.push(decipher.final(‘utf8‘));

return cipherChunks.join(‘‘);

};

let decrypt=(data)=>{

let key = ‘46cc793c53dc451b‘;

let decipher = crypto.createDecipheriv(‘aes-128-ecb‘, key,"");

const buf1 = new Buffer(data,"base64").toString(‘hex‘);

let decrypted = decipher.update(buf1, ‘hex‘, ‘utf8‘);

decrypted += decipher.final(‘utf8‘);

return decrypted;

};

let encrypt = (data)=>{

let key = ‘46cc793c53dc451b‘;

let crypted=‘‘;

let cipher = crypto.createCipheriv(‘aes-128-ecb‘, key, "");

crypted = cipher.update(data, ‘utf8‘, ‘binary‘);

crypted += cipher.final(‘binary‘);

crypted = new Buffer(crypted, ‘binary‘).toString(‘base64‘);

return crypted;

}

console.log(encrypt(‘哈哈‘) );

console.log( encryption(‘哈哈‘) );

console.log( decrypt("1SYQyczGb5L4qmVybCV82g==") );

console.log(  decryption("1SYQyczGb5L4qmVybCV82g=="));

前端代码:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<script src="https://cdn.bootcss.com/crypto-js/3.3.0/crypto-js.min.js"></script>

<!-- <script src="https://cdn.bootcss.com/crypto-js/3.3.0/aes.js"></script> -->

</head>

<body>

<script>

function encrypt(word){

var key = CryptoJS.enc.Utf8.parse("46cc793c53dc451b");

var srcs = CryptoJS.enc.Utf8.parse(word);

var encrypted = CryptoJS.AES.encrypt(srcs, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7 //和后端pkcs7 一致

});

return encrypted.toString();

}

function decrypt(word){

var key = CryptoJS.enc.Utf8.parse("46cc793c53dc451b");

var decrypt = CryptoJS.AES.decrypt(word, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

return CryptoJS.enc.Utf8.stringify(decrypt).toString();

}

console.log( encrypt(‘哈哈‘) )

console.log( decrypt(‘1SYQyczGb5L4qmVybCV82g==‘) )

</script>

</body>

</html>

原文地址:https://www.cnblogs.com/lkkk/p/12672382.html

时间: 2024-10-17 05:27:52

前端JS后端nodeJs 实现加解密; 个人理解的相关文章

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

关于公钥私钥是否可以互相加解密的理解(附苹果开发者证书配置时非对称加密算法的应用)

查资料的时候发现很多人有疑惑,公钥和私钥到底哪个是用来加密,哪个是用来解密的,是否可以公钥加密私钥解密,同时也可以私钥加密公钥解密呢?针对这一问题,说下自己的理解. 首先要明确两个问题:(1)既可以公钥加密私钥解密,也可以私钥加密公钥解密:(2)加密解密和签名验证是两个不同的概念. (一)先来说加密解密:需要同时使用公钥和私钥的加密算法是非对称加密,最常见的便是RSA.举例说明非对称加密:如果A想要给B秘密的发一条信息,只需要B创建一套公钥(盒子)和私钥(钥匙),盒子可以随意分发,但是钥匙只能B

实现与JS相同的Des加解密算法【转】

Java代码 import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c) 2015 * @author liuyazhuang * @see DESCore */ public class Des { public Des() { } public static void main(String[] args) { Des desObj = new Des(); St

网Js RSA加密,后端(Asp.Net)解码(非对称加解密)

前言 RSA加解密知识自行百度了解决一下 1.取得公钥与私钥方法 JSEncrypt Download 下载后将其发布成网站进入:http://127.0.0.1:3000/demo/index.html (各自服务器站口不一样自行) 这样就得到一公钥和私钥 另一种生成公钥与私钥的方法如下:引用 https://blog.csdn.net/qq_39081974/article/details/81059022 ======================================Begi

RSA加密前端JS加密,后端asp.net解密,报异常

参考引用:http://www.ohdave.com/rsa/的JS加密库 前端JS加密代码: function GetChangeStr() { debugger; var pwdStr = document.getElementById("txtPassWordStr").value; var uidStr= $("#<%=txtUserStr.ClientID%>").val(); if (!pwdStr || pwdStr.length == 0

NodeJS让前端与后端更友好的分手

学问 最近“上层建筑”在兴起国学热,所以公司几个月前决定开发一款名叫“学问”的有关于国学的app. APP的详情页面还是由web来显现具体内容,有些类似于新闻页,图文混排什么的web是最适合干这个的了,所以团队决定用WEB来实现详情页. 团队对WEB页的要求是: 页面在访问后离线依然可以查看. 首屏展现速度要快,不允许长时间白屏或loading. 项目现状 后端提供的都是以JSON为数据格式的API接口供Native端使用,同样提供给WEB的也是JSON格式的API接口 那么意味着WEB工作流程

aes加解密前后端-后台

一.web.xml: <filter> <filter-name>fastLoginFilter</filter-name> <filter-class>com.shencai.xf.common.util.FastLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>fastLoginFilter</filter-name&

openssl+前端jsrsa签名+后端nodejs验签

内容如标题所示,总体分为三个部分: 一.win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥 (1)win10下安装openssl需要的工具有:VS2013,Perl,nasm,openssl源码 其中,VS2013的安装.注册和激活请自行百度,ActivePerl.nasm和openssl源码也请自行下载安装,ActivePerl好说(执行perl example.pl,若提示:Hello from ActivePerl! 则说明Perl安装成功),nasm我选的是

HTML5 file API加canvas实现图片前端JS压缩并上传 (转载)

一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 最最重要的体验改进点:省略了图片的再加工成本.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的.然后现在的数码设备拍摄功能都非常出众,一张原始图片超过2M几乎是标配,此时如果用户想把手机或相机中的某个得意图片