angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制只需要一个key就可以,所以我们使用AES来进行数据的加解密,那么Key传递是不是会暴露,所以使用RSA对Key进行加密,前端生成RSA的公钥私钥,后端生成AES的key,前端把公钥直接发给后端,后端使用公钥将key进行加密,前端解出来key,然后使用AES对数据加密,文件也可以!

注意:这里angular使用的是Buffer来输入输出的,也就是字节数组!

1:angular加密解密环境安装

下载crypto-js、jsencrypt

# crypto-js
npm install crypto-js
npm install --save @types/crypto-js
npm i @types/node
#更新npm,下载完crypto-js提示让更新
npm install -g npm
npm i --save-dev @types/node#jsencrypt
npm install --save jsencrypt#Base64编码的jar
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.13</version>
</dependency>

2、Angular前端:crypto实现 AES加密

AESUtils

import {AES, enc, lib, mode, pad} from 'crypto-js';
import {Buffer} from 'buffer';export class AESUtils {/*** @param buf 字节数组* @param key key** 传入字节数组和key,返回加密后的字节数组*/public static encrypt(buf: Buffer,key:string): Buffer {let key16 = enc.Utf8.parse(key);          //将key转成16进制,如果不转解密也不能转并且加密后的数组动态的(如果有,解密必须有)var options = {mode: mode.ECB,     //模式padding: pad.Pkcs7  //补码方式};var encryptedData = AES.encrypt(lib.WordArray.create(buf), key16, options);  //加密return new Buffer(encryptedData.toString(), 'base64');  //解密后是base64的字符串,转为buff(字节数组)返回}public static decrypt(buf: Buffer,key:string): Buffer {let data = buf.toString('base64');  //将字节转为base64字符let key16 = enc.Utf8.parse(key);var options = {mode: mode.ECB,     //模式padding: pad.Pkcs7  //补码方式};var decryptedData = AES.decrypt(data, key16, options);  //解密return new Buffer(enc.Base64.stringify(decryptedData), 'base64');    //返回字节数组}
}

JAVA

    private static String enCode(String key, byte[] content) throws Exception{SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");Cipher cipher = Cipher.getInstance(ALGORITHM);  //根据指定算法ALGORITHM自成密码器cipher.init(Cipher.ENCRYPT_MODE, skey); //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥byte [] encode_content = cipher.doFinal(content); //密码器加密数据return Base64.encodeBase64String(encode_content);}private static byte[] dnCode(String key,String content){    //content是base64编码字符串if (key == null || "".equals(key)) {return null;}if (key.length() != 16) {return null;}try {byte [] encode_content = Base64.decodeBase64(content); //把密文字符串转回密文字节数组byte[] raw = key.getBytes();  //获得密码的字节数组SecretKeySpec skey = new SecretKeySpec(raw, "AES"); //根据密码生成AES密钥Cipher cipher = Cipher.getInstance(ALGORITHM);  //根据指定算法ALGORITH生成密码器cipher.init(Cipher.DECRYPT_MODE, skey); //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥return cipher.doFinal(encode_content); //将解密后的数据转换为字符串返回} catch (Exception e) {e.printStackTrace();return null;}}

测试

html:

<!DOCTYPE HTML>
<html>
<head><title>OutPutStream</title></head>
<body><label>输入要加密的文本:<input id="fs" name="ss" type="text" [(ngModel)]="data" (ngModelChange)="enTest()"><button style="background-color: yellow;" (click)="enTest()">加密</button><button style="background-color: yellow;" (click)="deTest()">解密</button><br>加密后的文本:<input type="text" [(ngModel)]="enData" disabled><br>解密后的文本:<input type="text" [(ngModel)]="unData" disabled><br><br>选择要加密的文件:<form style=" background-color: olivedrab" [formGroup]="myForm"><input  formControlName="EDI" type="file" class="form-control" (change)="handleFileSelect($event)"></form><button style="background-color: yellow;" (click)="enFile()">加密文件</button><button style="background-color: yellow;" (click)="deFile()">解密文件</button><br>加密后的文件: <input type="text" [(ngModel)]="enFileDataBase64" disabled><br><label>解密后的文件: </label><button style="background-color: yellow;" (click)="downLoadFile()">下载</button>
</label>
<!--<input type="file" id="fileUpload" value="选择文件" mce_style="display:none" οnchange="angular.element(this).scope().fileChoose(this)" >-->
<!--<button (click)="chaunshu()" class="btn btn-default">转移</button>-->
</body>
</html>

ts:

import {Component, OnInit} from '@angular/core';
import FileSaver from 'file-saver';
import {Buffer} from 'buffer';
import {AESUtils} from '../base/AESUtils';
import {AES, enc, lib, mode, pad} from 'crypto-js';@Component({selector: 'testAES',templateUrl: './testAES.html',styleUrls: ['./testAES.css']
})export class TestAES implements OnInit {myForm: any;scope: any;constructor() {}enData: any;data: string = '';unData: any;enFileData: any;enFileDataBase64: any;unFileData: any;key: string = "abcdefgabcdefg12";JsonObj: any;fileName: string;ngOnInit(): void {}handleFileSelect(evt) {const files = evt.target.files;const f = files[0];const reader = new FileReader();reader.readAsArrayBuffer(f);reader.onload = (f => {this.fileName = f.name;     //这是获取文件名,目的是获取文件的后缀return e => {this.JsonObj = e.target.result;     //文件的数据流};})(f);}public encrypt1(buf?: Buffer,key?:string): Buffer {let buffer = new Buffer([98, 99,-22,-44]);console.log(buffer.toString('base64'));let key16 = enc.Utf8.parse(this.key);          //将key转成16进制,如果不转解密也不能转并且加密后的数组动态的(如果有,解密必须有)var options = {mode: mode.ECB,     //模式padding: pad.Pkcs7  //补码方式};var encryptedData = AES.encrypt(lib.WordArray.create(buffer), key16, options);  //加密let buffer1 = new Buffer(encryptedData.toString(), 'base64');console.log(buffer1);console.log(encryptedData.toString());return   //解密后是base64的字符串,转为buff(字节数组)返回}public decrypt1(buf?: Buffer,key?:string): Buffer {let aaa = "TsA8sxb3ftE9s850oyueSQ==";let buffer1 = new Buffer([-22]);let s = buffer1.toString('base64');let key16 = enc.Utf8.parse(this.key);var options = {mode: mode.ECB,     //模式padding: pad.Pkcs7  //补码方式};let cipherParams = lib.CipherParams.create(buffer1);var decryptedData = AES.decrypt(s, key16, options);  //解密let buffer = new Buffer(enc.Base64.stringify(decryptedData),'base64');console.log(decryptedData.words);console.log(buffer);console.log(buffer.toString('base64'));//返回字节数组}enTest() {let a = AESUtils.encrypt(new Buffer([2,7,234,97]),this.key);console.log(a.toString("base64"));}deTest() {let a = AESUtils.decrypt(new Buffer("KJncoeWOUvKEQlfcE6KQLQ==",'base64'),this.key);console.log(a);}enFile() {this.enFileData = AESUtils.encrypt(this.JsonObj, this.key);     //加密this.enFileDataBase64 = this.enFileData.toString('base64'); //获取到加密后的base64字符}deFile() {this.unFileData = AESUtils.decrypt(this.enFileData,this.key); // 解密,解密出来的是buffer}downLoadFile() {const blob = new Blob([this.unFileData], {type: 'F:\\my-app\\src\\app\\;charset=utf-8'});FileSaver.saveAs(blob, this.fileName);}
}

3、jsencrypt实现rsa

RSAUtils

import {Buffer} from 'buffer';
import {JSEncrypt} from 'jsencrypt/lib';declare var RSAUtil: any;export class RSAUtils {private static jsEncrypt: JSEncrypt = new JSEncrypt({});/*** @param buf 字节数组* @param key key** 传入字节数组和key,返回加密后的字节数组*/public static getRSAKeys() {let publicKey = this.jsEncrypt.getKey().getPublicBaseKeyB64();let privateKey = this.jsEncrypt.getKey().getPrivateBaseKeyB64();return {publicKey, privateKey};}//传入Buffer,返回Bufferpublic static encodeRSA(buf: Buffer, publicKey: string): Buffer {let str = buf.toString('base64');     //将传入的buf转为base64(加一层base64,因为这个方法只能传String)this.jsEncrypt.setPublicKey(publicKey);let encrypt = this.jsEncrypt.encrypt(str);return new Buffer(encrypt, 'base64');}//传入Buffer,返回Bufferpublic static decodeRSA(buf: Buffer, privateKey: string): Buffer {let str = buf.toString('base64');   //将需要解密的Buffer转为base64字符串再解密this.jsEncrypt.setPrivateKey(privateKey);let decrypt = this.jsEncrypt.decrypt(str);return new Buffer(decrypt, 'base64'); //解密后转为Buffer(这里解的是最开始套的base64,因为底层加密只能用字符串)}}

JAVA:

    public static String encrypt(String str, String publicKey) throws Exception{//key是16位str//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));}public static String decrypt(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}

测试

输入要加密的文本:
<input id="fs1" name="ss" type="text" [(ngModel)]="data" (ngModelChange)="encrypt()">
<button style="background-color: yellow;" (click)="encrypt()">加密</button>
<button style="background-color: yellow;" (click)="decrypt()">解密</button><br>
加密的后的文本:<input id="fs2" name="ss" type="text" [(ngModel)]="enData"><br>
解密的后的文本:<input id="fs3" name="ss" type="text" [(ngModel)]="unData">
import {Component, OnInit} from '@angular/core';
import {Buffer} from 'buffer';
import {RSAUtils} from '../base/RSAUtils';
import FileSaver from 'file-saver';@Component({selector: 'app-rsa',templateUrl: './rsa.html',styleUrls: ['./rsa.css']
})
export class Rsa implements OnInit{enData: any;data: string = '';unData: any;PRIVATE_KEY_CODE = "";PUBLIC_KEY_CODE = "";enFileDataBase64: any;enFileData: any;fileName: string;JsonObj: any;unFileData: any;constructor() { }ngOnInit(): void {this.getKeys();}getKeys(){let rsaKeys = RSAUtils.getRSAKeys();this.PUBLIC_KEY_CODE = rsaKeys.publicKey;this.PRIVATE_KEY_CODE = rsaKeys.privateKey;}encrypt(){let buffer = new Buffer(this.data);let buf = RSAUtils.encodeRSA(buffer,this.PUBLIC_KEY_CODE);let s = buf.toString('base64');// console.log(strB64);this.enData = s;}decrypt(){this.unData = RSAUtils.decodeRSA(this.enData,this.PRIVATE_KEY_CODE);console.log(this.unData);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?

1. 当用一个软件(比如Windows记事本或Notepad)打开一个文本文件时&#xff0c;它要做的第一件事是确定这个文本文件究竟是使用哪种编码方式保存的&#xff0c;以便于该软件对其正确解码&#xff0c;否则将显示为乱码。 一般软件确定文本文件编码方式的方法有如下三种&#xf…

win10切换输入法快捷键_输入法失灵怎么办?该怎么恢复?

我们都尝试过在使用win10的时候&#xff0c;输入法无法切换&#xff0c;只能打英文不能输入汉字&#xff0c;对于要打字、打游戏来说都是非常麻烦的。所以&#xff0c;当输入法有问题的时候&#xff0c;应该要怎么样修复&#xff1f;主编&#xff1a;渣渣辉&#xff0c;是兄弟就…

SpringBoot远程访问redis配置,config文件,防火墙,阿里云安全组等

我这里是连接的阿里云服务器上的redis 1.阿里云服务器的安全组打开6379端口 2. 修改redis.config配置 注释掉 # bind 127.0.0.1 将 protected-mode yes 改为&#xff1a;protected-mode no3. 防火墙配置开启6379端口访问 在linux中执行&#xff1a; /sbin/iptables -I INPU…

【转】刨根究底字符编码【2.0版】(1):开篇

首先跟大家分享一个有趣的亲身经历。有一次&#xff0c;在网上我看到有程序员发了一个帖子&#xff0c;帖子题目乍一看让人感到惊愕&#xff0c;但细一想又让我会心一笑。 这个帖子的题目大致上是这样的&#xff1a;字符编码是不是让程序员最感到恶心的问题&#xff1f; 更有…

数位dp模板 最高位最低位_无纸化办公入门指南(数位板篇)

居家办公的这段时间&#xff0c;你们有没有遇到无纸化办公的问题&#xff1f;作为一名编辑&#xff0c;在我社规定不能寄纸稿的情况下&#xff0c;看电子稿成了常态。如果是word版尚且可以批注&#xff0c;不影响工作效率。但如果是PDF呢&#xff1f;怎样保证改稿的效率&#x…

AQS

1 AQS抽象的队列同步器&#xff0c;AQS定义了一套多线程访问共享资源的同步器框架&#xff0c;许多同步类实现都依赖于它&#xff0c;如常用的ReentrantLock/Semaphore/CountDownLatch 首先AQS维护了一个volatile 修饰的state和一个FIFO的同步队列&#xff08;多线程争用资源被…

屏幕录像专家6.0_迅捷屏幕录像工具和屏幕录像专家哪个更好用?

随着社会的发展&#xff0c;屏幕录像常常都需要使用&#xff0c;然而有些新手朋友就想知道&#xff0c;到底是电脑中自带的屏幕录像专家好用&#xff0c;还是迅捷屏幕录像工具好用&#xff0c;这两者都是当前使用率比较高的软件&#xff0c;今天小编就为大家分析分析&#xff0…

【转】刨根究底字符编码【2.0版】(2):关键术语解释

上一篇中讲道&#xff0c;字符编码所涉及的面非常广&#xff0c;向下的话&#xff0c;涉及到计算机的底层技术&#xff0c;甚至是硬件实现。 因此&#xff0c;这里就让我们从字符编码涉及到的最基本的术语讲起。大部分术语你可能都已经有了解了&#xff0c;但我们现在从字符编…

Cause: java.sql.SQLSyntaxErrorException: Table ‘Chun.user‘ doesn‘t exist Springboot+MybatisPlus报错

排错&#xff1a;yml配置没问题&#xff0c;可以连接到数据库&#xff0c;导包没问题&#xff0c;数据库里面也有这个库和表&#xff0c; 最终发现是因为表名大小写的问题&#xff0c;因为我直接连接的阿里云服务器上的mysql&#xff0c;而mysql在linux下表名是区分大小写的导…

浏览器字体大小设置_CSS之 浏览器解析样式的过程

阅读本文约需要10分钟大家好&#xff0c;我是你们的导师&#xff0c;经常看我朋友圈的同学应该知道&#xff0c;我每天会在微信上给大家免费提供以下服务&#xff01;1、长期为你提供最优质的学习资源&#xff01;2、给你解决技术问题&#xff01;3、每天在朋友圈里分享优质的技…

angular实现国密算法sm2、sm3和sm4的ts版,基于sm-crypto库实现,前后端实现

ts版&#xff0c;js的话直接根据npm文档调用就可以了&#xff01; ts提供的方法有问题&#xff0c;所以还换了个思路来实现&#xff01;而且因为不是nodeJs环境所以const sm4 require(sm-crypto).sm4这个在ts里是报错的导致无法实现&#xff0c;如果是使用的是electron那么使…

【转】.net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

很久没有写博客了&#xff0c;今年做的产品公司这两天刚刚开了发布会&#xff0c;稍微清闲下来&#xff0c;想想我们做的产品还有没有性能优化空间&#xff0c;于是想到了.Net的异步可以优化性能&#xff0c;但到底能够提升多大的比例呢&#xff1f;恰好有一个朋友正在做各种语…

win7关机快捷键_电脑快捷键大全(上)

Windows快捷键1单独按Windows&#xff1a;显示或隐藏“开始”功能表WindowsBREAK&#xff1a;显示“系统属性“对话框WindowsD显示桌面或回复桌面Windows M最小化所有窗口WindowsShiftM&#xff1a;还原最小化的窗口CrtlShiftN:新建文件夹WindowsE&#xff1a;打开“我的电脑”…

Nginx报错:nginx: [emerg] CreateFile() nginx.conf“ failed (3: The system cannot find the path specified

windows下启动nginx报错: nginx: [emerg] CreateFile() “D:\桌面\nginx-1.12.0/conf/nginx.conf” failed (3: The system cannot find the path specified) 路径中带中文了&#xff0c;换个目录就好了

【转】ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET

以下为教程: 在现有webapi项目中,nuget安装以下两个插件 swagger.net.ui swashbuckle 安装完毕后可以卸载Swagger.NET,此处不需要! 安装完毕后屏蔽以下代码 直接运行调试 在浏览器的目录后面加上/swagger即可跳转到swagger调试页 此时如果没有注释. 项目属性里添加xml注释…

idea提示“ cannot access xxxxxxxx.class“的解决方法,idea的bug

同一个包下的public类使用报错&#xff0c;应该是idea的bug&#xff1a; file -> Invalidate Caches / Restart

电脑屏保在哪里设置_手机屏保调成绿色能护眼?真的吗?

说到护眼&#xff0c;你首先想到的是什么颜色&#xff1f;估计90%的人都会不自觉的想到绿色&#xff01;因为从小家长和老师都会跟我们说&#xff1a;眼睛累了就多看窗户外的绿色植物。久而久之&#xff0c;一说到护眼&#xff0c;大家脑海里第一个想到的就是绿色。你会看到不少…

【转】c#中@的3种作用

以前只知道在C#中为了写文件路径的\不要加转义符而在前面加上标识符&#xff0c;没想到还有其他的作用 1.忽略转义字符 例如 1 string fileName "D:\\文本文件\\text.txt"; 使用后 1 string fileName "D:\文本文件\text.txt"; 2.让字符串跨行 例如 1…

电脑休眠和睡眠的区别_关机、睡眠、休眠的区别

都知道电脑有关机、睡眠、休眠三种休息模式&#xff0c;但是后两个选项使用的人非常少&#xff0c;大多数人每次用完电脑都会选择立即「关机」。有人是为了让电脑「休息」&#xff0c;有人是为了低碳精神&#xff0c;还有人是因为下班不关电脑要罚款&#xff0c;不管是什么原因…

SpringCloud:学习Docker安装zookeeper,注册服务

1.没镜像就拉取镜像 dockerhub中查看版本 官网 docker pull zookeeper:3.4.14 不加版本号也行&#xff0c;默认拉取最新版 创建并启动容器 docker run -p 2181:2181 --privilegedtrue --name zookeeper01 -d zookeeper –privilegedtrue 容器内用户开启root权限 docker ps…