angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
生活随笔
收集整理的這篇文章主要介紹了
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);} }總結
以上是生活随笔為你收集整理的angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《线性代数的几何意义》笔记(1)
- 下一篇: 新手前端练手网站_编程到底难不难学?新手