import CryptoJS from 'crypto-js'
// 定义加/解密的 key
const initKey = 'Test-AES-CBC-128'
// 设置数据做兆块长度
const keySize = 128
//设置向量和服务端保持一致
const iv = "0abcdefghij7twhjm"
export const aesEncrypt = (data, key) =>{
/**
* CipherOption, 加密的一些选项:
* mode: 加密模式, 可取值(CBC, CFB, CTR, CTRGladman, OFB, ECB), 都在 CryptoJS.mode 对象下
* padding: 填充方式, 可取脊胡茄值(Pkcs7, AnsiX923, Iso10126, Iso97971, ZeroPadding, NoPadding), 都在 CryptoJS.pad 对象下
* iv: 偏移量, mode === ECB 时, 不需要 iv
* 返回的是一个加密对象
*/
const cipher = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(iv)
})
// 将加密后的数据转换成 Base64
const base64Cipher = cipher.ciphertext.toString(CryptoJS.enc.Base64)//CryptoJS.enc.Base64
console.log('base64Cipher', base64Cipher)
// 处理 Android 某些低版的BUG
// const resultCipher = base64Cipher.replace('//+/g,\'-\'').replace(g,'_')
// 返回加密后的经过处理的 Base64
return base64Cipher
}
/**
* 解密函数
* @param {string} encrypted - 加密的数据
* @param {string} key - 加密使用的 key
*/
export const aesDecrypt = (encrypted, key) =>{
// 先将 Base64 还原一下, 因为加密的时候做了一些字符的替换
// const restoreBase64 = encrypted.replace().replace(/_/g,'/')
// 这里 mode, padding, iv 一定要跟加密的时候完樱察全一样
// 返回的是一个解密后的对象
const decipher = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(iv)
})
// 将解密对象转换成 UTF8 的字符串
const resultDecipher = CryptoJS.enc.Utf8.stringify(decipher)
// 返回解密结果
return resultDecipher
}
CBC模式是指将前一个密文分组与当前明文分组的内容混合起来进行加密,这样就可以避免ECB模式的弱点。
CBC模式的全称Cipher Block Chaining 模式(密文分组组链接模式),之所以叫这个名字是因为密文分组是像链条埋晌一样相互连接在一起。
在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。
ECB模式 和 CBC模式比较
当加密第一个明文分组是,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来替代“前一个密文分组”,这个比特序列称为 初始化向量 ,通常缩写为IV。每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
在CBC模式找那个,我们无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需此姿要凑齐明文分组1、2、3才行。
假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生编号,则解密时,最多只会影响2个分组受到数据损坏的影响。
假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失了1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密了。
假设主动攻击者Mallory的目的是通过修改密文来 *** 纵解密后的明文。如果Mallory能够对初始化向量中的任意比特进行反转,则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。
这样,Mallory 就可以对初始化向量进行攻击,但是想要对密文分组也进行同样的攻击就非常困难了。
填充提示攻击 (Padding Oracle Attack)是一种利用分组密码中的填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组填充一些数据使其凑满一个分组的长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充的数据进行少许改变。由于接收者在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击方式并不仅限于CBC模式,而是适用于所有需要进行分组填充的模式。2014年对SSL3.0造成重大影响的POODLE攻击实际上就是一种填充攻击。要防御这种攻击,需要对密文进行认证,确森液绝保这段密文的确是由合法的发送者在制定明文内容的前提下生成的。
初始化向量必须使用不可预测的随机数。然后在SSL/TSL1.0的版本协议中,初始向量并没有使用不可预测的随机数,而是使用了上一次CBC模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TSL1.1以上的版本中改为了必须显式得传送初始化向量。
确保互联网安全的通信协议之一SSL/TSL,就是使用CBC模式来确保通信的机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。
分组密码中海油一种模式叫作CTS模式(Cipher Text Stealing模式)。在分组密码中,当明文长度不能被分组长度整除时,最后一个分组就需要进行填充。CTS模式是使用最后一个分组的其哪一个密文分组数据来讲信息填充的,它通常和ECB模式以及CBC模式配合使用。根据最后一个分组的发送顺序不同,CTS模式有几种不同的变体(CBC-CS1、CBC-CS2、CBC-CS3)。
该系列的主要内容来自《图解密码技术第三版》
我只是知识的搬运工
文章中的插图来源于原著
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)