對(duì)加密算法 AES-128-CBC 的一些理解
簡(jiǎn)單說(shuō)明
- AES-128-CBC是一種分組對(duì)稱(chēng)加密算法,即用同一組key進(jìn)行明文和密文的轉(zhuǎn)換,以128bit為一組,128bit==16Byte,意思就是明文的16字節(jié)為一組對(duì)應(yīng)加密后的16字節(jié)的密文。
- 若最后剩余的明文不夠16字節(jié),需要進(jìn)行填充,通常采用PKCS7進(jìn)行填充。比如最后缺3個(gè)字節(jié),則填充3個(gè)字節(jié)的0x03;若最后缺10個(gè)字節(jié),則填充10個(gè)字節(jié)的0x0a;
- 若明文正好是16個(gè)字節(jié)的整數(shù)倍,最后要再加入一個(gè)16字節(jié)0x10的組再進(jìn)行加密
需要參數(shù)
- 傳入要加密的明文
- 傳入一個(gè)16字節(jié)的key
- 傳入一個(gè)16字節(jié)的初始偏移向量IV
CBC模式:
用初始向量和密鑰加密第一組數(shù)據(jù),然后把第一組數(shù)據(jù)加密后的密文重新賦值給IV,然后進(jìn)行第二組加密,循環(huán)進(jìn)行直到結(jié)束
使用openSSL命令測(cè)試
加密
// -e加密,-aes-128-cbc指定使用加密算法,-iv指定偏移向量為16進(jìn)制,-K指定16進(jìn)制密鑰,-in指定要加密的文件,-out指定密文輸出文件
// 初始IV為16個(gè)字節(jié)的0x00, 密鑰為 abcdefghijklmnop
openssl enc -e -aes-128-cbc -iv 0000000000000000 -K 6162636465666768696a6b6c6d6e6f70 -in input -out output
也可以直接用管道指向hexdump命令進(jìn)行密文打印
openssl enc -e -aes-128-cbc -iv 0000000000000000 -K 6162636465666768696a6b6c6d6e6f70 -in input | hexdump -C
解密
// -d解密
openssl enc -d -aes-128-cbc -iv 0000000000000000 -K 6162636465666768696a6b6c6d6e6f70 -in input -out output
注意:
每組加密過(guò)的密文都要重新賦給偏移向量,然后進(jìn)行下一組的加密,所以可以用上一組的密文來(lái)充當(dāng)偏移向量解密這一組的密文