luther@gliethttp:~$ sudo apt-get install libmhash-dev
luther@gliethttp:~$ luther@gliethttp:~$ sudo apt-get install libmcrypt-dev
luther@gliethttp:~$ sudo apt-get install mcrypt
源码中:
# define DEFAULT_ALGORITHM "rijndael-128" /* The AES winner */
#define DEFAULT_MODE "cbc"
其中rijndael就是在高级加密标准(AES)中使用的基本密码算法,
参数-s 16表示16*8=128bits,如果为-s 32那么就表示32*8=256bits模式,还有一个-s 24表示24*8=192bits模式
参数-m cbc表示使用密码分组链接的块加密模式
模式1-加密文件中打入加密算法,加密模式等信息
luther@gliethttp:~$ mcrypt -k 123456 -a rijndael-128 -s 16 -m cbc gliethttp.c
luther@gliethttp:~$ mcrypt -k 123456 -d gliethttp.c.nc
模式2-去掉所有冗余信息,使用-b参数加密,但是解密时也同样需要加入该参数
luther@gliethttp:~$ mcrypt -b -k 123456 -a rijndael-128 -s 16 -m cbc gliethttp.c
luther@gliethttp:~$ mcrypt -b -k 123456 -d gliethttp.c.nc
如果key是2进制数据,可以使用-f从文件读取key,比如luther.key文件中有0x2210密钥数据
[但是因为mcrypt源码实现时,使用了strlen(key)来获取读入的key长度,所以key即便存在了file中,也不要以0x00作为key内容,如果必须,那么请修改mcrypt工具源码]那么可以
luther@gliethttp:~$ mcrypt -b -f luther.key -a rijndael-128 -s 16 -m cbc gliethttp.c
luther@gliethttp:~$ mcrypt -b -f luther.key -d gliethttp.c.nc
使用--no-openpgp参数产生随机IV
mcrypt -b --no-openpgp -f luther.key -a rijndael-128 -s 16 -m cbc gliethttp.c
mcrypt -b --no-openpgp -f luther.key -a rijndael-128 -s 16 -m cbc -d gliethttp.c.nc
在encrypt_general加密时会使用mcrypt_randomize()随机产生iv值,
在decrypt_general中调用read_iv(FROMF, mcrypt_enc_get_iv_size(td));从加密文件的头部读取固定字节的iv数据,如果是cbc-128就从数据头部读取16字节,cbc-192就是从数据头部读取24字节,cbc-256就是从数据头部读取32字节数据,
IV
56.28.2b.54.45.73.ae.31.4d.71.b9.f5.fd.2f.89.48.
最后使用-b --no-openpgp参数生成的文件,
看看加密后.nc文件数据存储结构图
IV_16bytes + 加密块数据,以16bytes的整倍数 + 16bytes的pads填充
最后的16bytes的pads填充在encrypt_general()函数中mcrypt_generic(td, ciphertext_pad, pad_size);中完成[luther.gliethttp]
//===================================================
后来发现openssl直接支持hex十六进制iv和key的输入
对于加密,如果没有使用-S指定hsalt,那么openssl会
调用RAND_pseudo_bytes(salt, sizeof salt)随机产生一个salt值,
当然salt和magic是用来综合产生key和iv的,如果使用-K和-iv强行指定了key和iv的话,
那么-S就没有任何意义了,因为虽然-S也执行,但是函数根据salt产生的key和iv
EVP_BytesToKey(cipher,dgst,sptr, (unsigned char *)str, strlen(str),1,key,iv);
将在下面
if ((hiv != NULL) && !set_hex(hiv,iv,sizeof iv))
if ((hkey != NULL) && !set_hex(hkey,key,sizeof key))
直接覆盖,所以最终会使用用户自定义的十六进制格式key和iv来加密数据,因为没有定义password,所以也就不会生成magic和salt这16个字节数据域到out输出文件中.
hex2bin工具源码luther@gliethttp:~$ openssl aes-128-cbc -v -p -iv 00000000000000000000000000000000 -K 00000000000000000000000000000000 -in zeror -out zeror.cbc
salt=84A82400DC3E0B08
key=00000000000000000000000000000000
iv =00000000000000000000000000000000
bytes read : 16
bytes written: 32
luther@gliethttp:~$ openssl aes-128-cbc -v -p -iv 00000000000000000000000000000000 -K 00000000000000000000000000000000 -d -in zeror.cbc -out 333
salt=84581B00DC3E0B08
key=00000000000000000000000000000000
iv =00000000000000000000000000000000
bytes read : 32
bytes written: 16
luther@gliethttp:~$ openssl aes-128-cbc -v -p -iv 00000000000000000000000000000000 -K 00000000000000000000000000000000 -in cip -out cip.cbc
salt=84685C00DC3E0B08
key=00000000000000000000000000000000
iv =00000000000000000000000000000000
bytes read : 16
bytes written: 32
luther@gliethttp:~$ openssl aes-128-cbc -v -p -d -pass pass:123 < ciper.bin
salt=7437F0D0E86287C3
key=FEB051184865FD8800E06B40775B2184
iv =3B3F1B9E39C577169237C56F2B630BA2
123
bytes read : 32
bytes written: 4
luther@gliethttp:~$ openssl aes-128-cbc -v -p -iv 3B3F1B9E39C577169237C56F2B630BA2 -d -pass pass:123 < ciper.bin
salt=7437F0D0E86287C3
key=FEB051184865FD8800E06B40775B2184
iv =3B3F1B9E39C577169237C56F2B630BA2
123
bytes read : 32
bytes written: 4
luther@gliethttp:~$ openssl aes-128-cbc -v -p -K FEB051184865FD8800E06B40775B2184 -iv 3B3F1B9E39C577169237C56F2B630BA2 -d -pass pass:123 < ciper.bin
salt=7437F0D0E86287C3
key=FEB051184865FD8800E06B40775B2184
iv =3B3F1B9E39C577169237C56F2B630BA2
123
bytes read : 32
bytes written: 4