前端aes解密实战小结(代码片段)

zifayin zifayin     2022-12-20     630

关键词:

很多人对于AES加密并不是很了解,导致互相之间进行加密解密困难。 
本文用简单的方式来介绍AES在使用上需要的知识,而不涉及内部算法。最后给出例子来帮助理解AES加密解密的使用方法。

AES的麻烦

相比于其他加密,AES加密似乎模式很多,包括ECB、CBC等等等等,每个模式又包括IV参数和Padding参数,并且,不同语言对AES加密的库设计有区别。这些导致AES加密在不同人之间联调会很麻烦。

AES属于块加密

不难理解,对越长的字符串进行加密,代价越大,所以通常对明文进行分段,然后对每段明文进行加密,最后再拼成一个字符串。块加密的一个要面临的问题就是如何填满最后一块?所以这就是PADDING的作用,使用各种方式填满最后一块字符串,所以对于解密端,也需要用同样的PADDING来找到最后一块中的真实数据的长度。

加密模式

AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别。具体可参考WIKI的说明。 
另外,AES分为AES128,AES256等,表示期待秘钥的长度,比如AES256秘钥的长度应该是256/8的32字节,一些语言的库会进行自动截取,让人以为任何长度的秘钥都可以。而这其实是有区别的。

IV的作用

IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。 
IV的长度为16字节。超过或者不足,可能实现的库都会进行补齐或截断。但是由于块的长度是16字节,所以一般可以认为需要的IV是16字节。

PADDING

AES块加密说过,PADDING是用来填充最后一块使得变成一整块,所以对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。

加密解密端

所以,在设计AES加密的时候 
- 对于加密端,应该包括:加密秘钥长度,秘钥,IV值,加密模式,PADDING方式。 
- 对于解密端,应该包括:解密秘钥长度,秘钥,IV值,解密模式,PADDING方式。

 

这里我以 Vue 作为例子,其他的也就大同小异了~

  • 要用 AES 算法加密,首先我们要引入 crypto-jscrypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 MD5SHA1SHA2SHA3RIPEMD-160 哈希散列,进行 AESDESRabbitRC4Triple DES 加解密,我们可以采用 npm install crypto-js --save 进行下载安装,也可以直接去 GitHub下载源码~

  • 其次我们需要定义两个方法 ,分别是用于加密和解密,这里我将它放在了 utils 文件夹下,命名为 secret.js ,其具体代码如下:

const CryptoJS = require(‘crypto-js‘);  //引用AES源码js
    
    const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");  //十六位十六进制数作为密钥
    const iv = CryptoJS.enc.Utf8.parse(‘ABCDEF1234123412‘);   //十六位十六进制数作为密钥偏移量
    
    //解密方法
    function Decrypt(word) 
        let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
        let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
        let decrypt = CryptoJS.AES.decrypt(srcs, key,  iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 );
        let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
        return decryptedStr.toString();
    
    
    //加密方法
    function Encrypt(word) 
        let srcs = CryptoJS.enc.Utf8.parse(word);
        let encrypted = CryptoJS.AES.encrypt(srcs, key,  iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 );
        return encrypted.ciphertext.toString().toUpperCase();
    
    
    export default 
        Decrypt ,
        Encrypt
    

  

上面的代码中的 key 是密钥 ,iv 是密钥偏移量,这个一般是接口返回的,为了方便,我们这里就直接在这里定义了。

值得注意的是密钥的长度,由于对称解密使用的算法是 AES-128-CBC算法,数据采用 PKCS#7 填充 , 因此这里的 key 需要为16位!

接着我们定义了 解密方法Decrypt加密方法 Encrypt ,最后通过 export default 将其暴露出去,方便在需要的时候进行引入~






aes加密—详解(代码片段)

...是什么?偏移量字符集实际工作中的加密流程AES加密/解密注意的问题实战AES加解密AES默认实现类AES随机加密AES简介DES全称为 查看详情

aes地址栏传参加密(代码片段)

...数据在前后端的传输过程中需要进行加密,那就需要保证前端和后端的加解密需要统一。这里给大家简单演示AES在JavaScript前端和Java后端是如何实现加密和解密的。直接上代码:java端:packagecom.lin.utils;importjava.math.BigInteger;importjav... 查看详情

js前端接口加密/解密(代码片段)

CryptoJS(crypto.js)为JavaScript提供加密和解密算法。目前已支持的算法包括 crypto,Hash,MD5,SHA1,SHA-1,SHA256,SHA-256,RC4,Rabbit,AES,DES,PBKDF2,HMAC,OFB,CFB,CTR,CBC,Base64CryptoJS是一个纯javascript写的加密类库,页面引用<scriptsrc= 查看详情

javascript前端和java后端的aes加密和解密

...数据在前后端的传输过程中需要进行加密,那就需要保证前端和后端的加解密需要统一。这里给大家简单演示AES在JavaScript前端和Java后端是如何实现加密和解密的。直接上代码:java端:packagecom.lin.utils;importjava.math.BigInteger;importjav... 查看详情

aes加密解密(代码片段)

AES是一种对称加密,简单理解为秘钥只有一个,加密解密都用它,安全性不是很好packagecom.aisino.qysds.common.util;importjava.io.UnsupportedEncodingException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmExceptio 查看详情

golang:aes加密解密(代码片段)

golang:AES加密解密代码示例:packagemainimport( "bytes" "crypto/aes" "crypto/cipher" "fmt")funcpadding(src[]byte,blocksizeint)[]byte padnum:=blocksize-len(src)% 查看详情

pythonpycrypto使用aes/rsa加解密(代码片段)

查看详情

ios之aes加密解密(代码片段)

//AES加密解密#import<CommonCrypto/CommonCrypto.h>#import<CommonCrypto/CommonDigest.h>//AES128位加密base64编码注:kCCKeySizeAES128点进去可以更换256位加密-(NSString*)AES128Encrypt:(NSString*)plainTextkey:(NSStri 查看详情

aes加解密(代码片段)

AES加密类<?php//phpaes加密类classAESMcryptpublic$iv=null;public$key=null;public$bit=128;private$cipher;publicfunction__construct($bit,$key,$iv,$mode)if(empty($bit)||empty($key)||empty($iv)||empty($mode 查看详情

golang里的aes加密解密(代码片段)

AES加密和解密的三种模式实现(CBC/ECB/CFB)packagemainimport("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""encoding/hex""io"&# 查看详情

java使用aes工具类加解密解决数据保密性问题(代码片段)

...;避免请求数据被拦截解析。密文返回十六进制,解决前端可能通过url请求时,将token设置为url参数会导致url格式不正确(包含’/’'+'等特殊符号 查看详情

aes-128-ecb16进制加密解密算法(代码片段)

importjavax.crypto.Cipher;importjavax.crypto.spec.SecretKeySpec;/***AES加密解密算法*默认采用AES-128-ECB加密模式*/publicclassAESUtilsprivatestaticfinalStringSKEY="uHNTivV09dQxLor9";/***加密*@paramsSrc*@return*@throws 查看详情

前端aes解密

使用插件Crypto.JS安装npminstall--save_devcrypto-js//导入crypto-js包 importCryptoJSfrom‘crypto-js/crypto-js‘/***AES解密:字符串keyiv返回base64**/exportfunctionDecrypt(word)varkey=CryptoJS.enc.Utf8.parse("hangzhou 查看详情

aes对称加解密(代码片段)

1.生成AESKey/***AES根据密码生成Key*@parampassword*@return*/publicstaticKeycreateKey(Stringpassword)//构造密码生成器,指定为AES算法tryKeyGeneratorkeyGenerator=KeyGenerator.getInstance("AES");//生成128位的随机源keyGenerator.init(128,newSecureRandom(password.getBytes()));//... 查看详情

crypto++aes加密解密流程(代码片段)

//aesdemo.cpp:定义控制台应用程序的入口点。//#include<stdio.h>#include<tchar.h>#include<iostream>#include"aes.h"usingnamespacestd;usingnamespaceCryptoPP;intmain()cout<<"aesdemo"<<AES:: 查看详情

phpcnl2解密[aes][base16][php](代码片段)

查看详情

aes-128-ecb解密错误(代码片段)

这是代码-usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Security.Cryptography;usingSystem.IO;namespaceAESFileDecryptclassProgramstaticvoidMain(string[]args)RijndaelManagedaes=newRijndaelManaged();aes.Key=Encoding.ASCII.GetBytes("12345678");aes.IV=newbyt... 查看详情

用python实现aes加密解密(代码片段)

...09;中的sampledata为例子,看看怎么用python实现AES加密和解密。测试数据我们看看怎么由SK和B0得到X1,然后从X1得到B0代码fromCrypto.CipherimportAES#installpycryptodomeimportbinasciiSK=bina 查看详情