这里使用des加密。
echo -n "${data}" | openssl des-cbc -iv 31313131312D2D2D -K 31313131312D2D2D -nosalt | xxd -ps -u -c100
上面的命令行加密方式个人拆分几个关注点:
1.输入输出方式:
输入:使用echo加管道流,可以直接将echo内容作为输入进行加密操作。或者使用-in参数,指定输入文件,在输入为二进制时使用比较合适,但是要操作文件
输出:如果加上-out <file> 参数,这结果输出到文件中,如果不加,则标准输出流输出。这里如果只要二进制结果可以考虑输出到文件,如果需要base64编码结果可以加-a参数,如果要二进制的十六进制结果可以通过管道流使用xxd处理。我这里需要得到16进制形式并赋值给变量,因此使用xxd转化后直接在shell中赋值给变量,避免文件操作。
2.相关参数
做des加密时,要关注的有一下几个参数:
-P/-p :打印key、iv和salt,可以用于验证加密参数。-P是只打印加密参数信息,包括key、iv、salt,而-p打印加密参数后还会打印最终加密结果
-K :指定加密密钥key,需要十六进制形式字符串
-iv:IV值,也是十六进制形式
-pass pass:"${password}" :密码,密码可以用于生成key和iv,因此指定了pass后可以不用指定-K和-iv。另外,同时指定密码和key或iv时,指定的key或iv会覆盖密码生成的key或iv
-k ${password}:同 -pass ,密码的简易输入参数。
-S:指定盐值
-nosalt :不使用盐值
3.二进制结果转换
(1)base64编码, 使用-a参数, 直接在openssl命令中使用-a参数,openssl命令可以直接以base64编码形式输出结果
(2)16进制显示,使用转化命令。Linux原生命令包括hexdump、od、xxd。其中hexdump和od的结果和xxd相比貌似是反的,大小端的问题,我这里使用xxd。
关于xxd的使用,就最上面的示例的几个参数做下解释:
-ps ,只打印16进制的信息,默认会打印位偏移、十六进制和ascii结果,如果只要16进制的转化结果就使用这个参数
-u ,16进制大写显示
-c,换行宽度,如果生成的16进制过长默认是会换行的,如果不希望结果被分成两行显示就把换行宽度设大一点
下面附上执行结果: