今天实现了下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);}
}

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

  1. C# Java间进行RSA加密解密交互

    C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...

  2. C# Java间进行RSA加密解密交互(二)

    接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...

  3. 基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json)

    基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json) 随着移动通信技术及相关领域服务的快速发展,短信内容常常涉及用户隐私和信息安全.用户使用短信传输一些重要的私人信息,如:手 ...

  4. Android+Java中使用RSA加密实现接口调用时的校验功能

    场景 RSA加密 RSA算法是一种非对称加密算法,那么何为非对称加密算法呢? 一般我们理解上的加密是这样子进行的:原文经过了一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙 ...

  5. python写网页前端交易rsa加密_Flask框架实现的前端RSA加密与后端Python解密功能详解!...

    本文实例讲述了Flask框架实现的前端RSA加密与后端Python解密功能.分享给大家供大家参考,具体如下: 前言 在使用 Flask 开发用户登录API的时候,我之前都是明文传输 username ...

  6. java sse_后端向前端推送数据 SSE java

    研究一种后端向前端推送数据的操作,叫SSE(Server-Sent Events),但是,我觉得这玩意就是轮询.算了,烦的要死,记录下这种方式把. 前端代码是vue写的,EventSource里面是后 ...

  7. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言

    AES加密 ECB模式 PKCS5填充 128位密码/密码块 ECB模式是将明文按照固定大小的块进行加密的,块大小不足则进行填充,ECB模式没有用到向量. 具体加密算法,请参见米扑博客总结的系列文章: ...

  8. Java 实现AES对称加密

    AES介绍 高级加密标准(AES,Advanced Encryption Standard)是日常使用频率比较高的的对称加密算法.尤其是在网络通信中使用较为广泛,具体的加密流程下图: 废话不多说,直接 ...

  9. AES对称加密和解密算法以及Java的AES工具类

    参考资料:百度百科[高级加密标准] AES简介 1.密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块 ...

  10. Android+Java中使用Aes对称加密的工具类与使用

    场景 Android+Java中使用RSA加密实现接口调用时的校验功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11146 ...

最新文章

  1. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条
  2. 解决 git extensions 每次提交需要输入用户名和密码
  3. 36氪研究院:机器人行业产业图谱
  4. 卡方 python_卡方优度检测 (Python 实现) --基于jupyter
  5. 我是学计算机的上银行考什么条件,计算机专业能报考银行哪些岗位
  6. 使用纯粹的ABAP位操作实现两个整数相加
  7. Android开发之Java的IO流读写的十种方法
  8. 多个html网页共享变量,多个jsp页面共享一个js对象的超级方法
  9. 使用dotenv管理环境变量
  10. Java - 常用函数Random函数
  11. MongoDB 的 yum 安装
  12. 两个乒乓球队进行比赛 各出3人c语言_19年国际乒乓球大赛时间出炉:比赛的密集程度令人窒息!...
  13. 光盘安装服务器找不到硬盘,安装系统找不到硬盘怎么办实测解决
  14. 活性(Liveness)
  15. PDF转word的两种办法
  16. springboot从OSS下载图片并打包为压缩包下载
  17. 小学作文批改评语大全
  18. comsol-添加线圈几何分析
  19. matlab nctool使用,感知器和BP网络设计及应用技术总结.doc
  20. 微信公众号开发之订阅号如何获取用户信息(一)

热门文章

  1. Leetcode 279. Perfect Square
  2. 存储过程实现可扩展灵活接口
  3. 今天觉得自己好像比较紧张
  4. 指定查询条件,查询对应的集合List(单表)
  5. link2001错误无法解析外部符号metaObject
  6. XML Schema ---complexType-----复合元素
  7. 极客时间算法练习题总结
  8. oracle自动备份定时任务,Oracle数据库定时自动备份批处理代码(Windows)
  9. ubuntu安装php5-mysql_Ubuntu下安装Apache2, php5 mysql
  10. spring mysql整合_springboot mybatis mysql 整合