linux 对称加密命令,什么是对称加密?
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
目录
1 定义
2 工作过程
3 常用算法
4 优缺点
定义
需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。
所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。
因此[1] 加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
工作过程
下面举个例子来简要说明一下对称加密的工作过程。甲和乙是一对生意搭档,他们住在不同的城市。由于生意上的需要,他们经常会相互之间邮寄重要的货物。为了保证货物的安全,他们商定制作一个保险盒,将物品放入其中。他们打造了两把相同的钥匙分别保管,以便在收到包裹时用这个钥匙打开保险盒,以及在邮寄货物前用这把钥匙锁上保险盒。
上面是一个将重要资源安全传递到目的地的传统方式,只要甲乙小心保管好钥匙,那么就算有人得到保险盒,也无法打开。这个思想被用到了现代计算机通信的信息加密中。在对称加密中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。
enc - [-in ] [-out ] [-pass arg] [-e] [-d] [-a/-] [-k ] [-S salt] [-salt] [-md] [-p/-P]
选项说明:
-:指定对称加密算法(如des3),可独立于enc直接使用,如 des3或 enc -des3。推荐在enc后使用,这样不依赖于硬件
-in :输入文件,不指定时默认是stdin
-out :输出文件,不指定时默认是
-e:对输入文件加密操作,不指定时默认就是该选项
-d:对输入文件解密操作,只有显示指定该选项才是解密
-pass:传递加、解密时的明文密码。若验证签名时实用的公钥或私钥文件是被加密过的,则需要传递密码来解密。密码的格式见" 密码格式"
-k :已被"-pass"替代,现在还保留是为了兼容老版本的
-:在加密后和解密前进行编码或解密,不指定时默认是二进制。注意,编码不是加解密的一部分,而是加解密前后对数据的格式"整理"
-a:等价于-
-salt:单向加密时使用salt复杂化单向加密的结果,此为默认选项,且使用随机salt值
-S salt:不使用随机salt值,而是自定义salt值,但只能是16进制范围内字符的组合,即"0-9a-fA-F"的任意一个或多个组合
-p:打印加解密时salt值、key值和IV初始化向量值(也是复杂化加密的一种方式),解密时还输出解密结果,见后文示例
-P:和-p选项作用相同,但是打印时直接退出工具,不进行加密或解密操作
-md:指定单向加密算法,默认md5。该算法是拿来加密key部分的,见后文分析。
支持的单向加密算法有:
-md4 to use the md4 -md5 to use the md5 - to use the -sha to use the sha -sha1 to use the sha1 - to use the - to use the - to use the - to use the - to use the
支持的对称加密算法有:
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cfb
-aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr
-aes-128-ecb -aes-128-gcm -aes-128-ofb
-aes-128-xts -aes-192-cbc -aes-192-cfb
-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr
-aes-192-ecb -aes-192-gcm -aes-192-ofb
-aes-256-cbc -aes-256-cbc-hmac-sha1 -aes-256-cfb
-aes-256-cfb1 -aes-256-cfb8 -aes-256-ctr
-aes-256-ecb -aes-256-gcm -aes-256-ofb
-aes-256-xts - -
- -bf -bf-cbc
-bf-cfb -bf-ecb -bf-ofb
- --128-cbc --128-cfb
--128-cfb1 --128-cfb8 --128-ecb
--128-ofb --192-cbc --192-cfb
--192-cfb1 --192-cfb8 --192-ecb
--192-ofb --256-cbc --256-cfb
--256-cfb1 --256-cfb8 --256-ecb
--256-ofb - -
- -cast -cast-cbc
-cast5-cbc -cast5-cfb -cast5-ecb
-cast5-ofb -des -des-cbc
-des-cfb -des-cfb1 -des-cfb8
-des-ecb -des-ede -des-ede-cbc
-des-ede-cfb -des-ede-ofb -des-ede3
-des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1
-des-ede3-cfb8 -des-ede3-ofb -des-ofb
-des3 -desx -desx-cbc
-id--GCM -id--wrap -id--wrap-pad
-id--GCM -id--wrap -id--wrap-pad
-id--GCM -id--wrap -id--wrap-pad
-id-smime-alg- -idea -idea-cbc
-idea-cfb -idea-ecb -idea-ofb
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40 -rc4-hmac-md5 -seed -seed-cbc
-seed-cfb -seed-ecb -seed-ofb
在给出 enc命令用法示例之前,先解释下对称加密和解密的原理和过程。
对称加解密时,它们使用的密码是完全相同的,例如"",但这是密码,且是明文密码,非常不安全,所以应该对此简单密码进行复杂化。最直接的方法是使用单向加密计算出明文密码的hash值,单向加密后新生成的密码已经比较安全(称之为密钥比较好),可以作为对称加密时的对称密钥。另外,由于同一单向加密算法对相同明文密码的计算结果是完全一致的,这样解密时使用相同的单向加密算法就能计算出完全相同的密钥,也就是解密时的对称密钥。如果想要更安全,还可以在对称加密后对加密文件进行重新编码,如使用""、二进制或hex编码方式进行编码,但对应的在解密前就需要先解码,解码后才能解密。
所以,将对称加、解密的机制简单概括如下:
对称加密机制:根据指定的单向加密算法,对输入的明文密码进行单向加密(默认是md5),得到固定长度的加密密钥,即对称密钥,再根据指定的对称加密算法,使用对称密钥加密文件,最后重新编码加密后的文件。即单向加密明文密码结果作为对称密钥、使用对称密钥加密文件、对文件重新编码。
对称解密机制:先解码文件,再根据单向加密算法对解密时输入的明文密码计算得到对称密钥,依此对称密钥对称解密解码后的文件。
因此,解密过程中使用的解码方式、单向加密和对称加密算法都必须一致,且输入的密码必须是正确密码。但需要注意的一点是,解密时可以不指定salt,因为加密时使用的salt会记录下来,解密时可以读取该salt。
如下图所示,分别是加密和解密过程示意图。
示例:
以加密/etc/fstab的备份文件/tmp/test.txt为例。
(1).首先测试 enc的编码功能。由于未指定密码选项"-k"或"-pass",所以仅仅只进行编码而不进行加密,因此也不会提示输入密码。
[root@xuexi tmp]# enc -a -in test.txt -out .txt
[root@xuexi tmp]# cat .txt
TWF5
IGJ5
IyBT
ZC9v
LTRk
eGZz
MDM3
cyAg
Ny04
ICAg
再以格式进行解码。
[root@xuexi tmp]# enc -a -d -in .txt
# /etc/fstab
# by on Thu May 11 04:17:44 2017#
# , by , are under '/dev/disk'# See man pages fstab(5), (8), mount(8) and/or blkid(8) for more info#
UUID=-aea4-4d8e-8be8- / xfs 0 0UUID=-033b-4037-bbcb- /boot xfs 0 0UUID=-daa6-4c17-8b03- swap swap 0 0
实际上,上述编码和解码的过程严格地说也是对称加密和解密,因为 enc默认会带上加密选项"-e",只不过因为没有指定输入密码选项,使用的加密密码为空而已,且单向加密算法使用的也是默认值。解密时也一样。
(2).测试使用des3对称加密算法加密test.txt文件。
[root@xuexi tmp]# enc -a -des3 -in test.txt -out test.1 -pass pass: -md md5
加密后,查看加密后文件test.1的结果。
[root@xuexi tmp]# cat test.+c///++obH9F+
921tJ+8K++g7
+/
88K2
/
/UCa
TyI+1179
+GLW4g//M
+/p555Q==
解密文件test.1。
[root@xuexi tmp]# enc -a -des3 -d -in test.1 -out test.2 -pass pass: -md md5 [root@xuexi tmp]# cat test.2
# /etc/fstab
# by on Thu May 11 04:17:44 2017#
# , by , are under '/dev/disk'# See man pages fstab(5), (8), mount(8) and/or blkid(8) for more info#
UUID=-aea4-4d8e-8be8- / xfs 0 0UUID=-033b-4037-bbcb- /boot xfs 0 0UUID=-daa6-4c17-8b03- swap swap 0 0
(3).加密时带上点盐salt。其实不写时默认就已经加入了,只不过是加入随机盐值。使用-S可以指定明确要使用的盐的值。但是盐的值只能是16进制范围内字符的组合,即"0-9a-fA-F"的任意一个或多个组合。
[root@xuexi tmp]# enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass: -md md5
解密。解密时不用指定salt值,即使指定了也不会影响解密结果。
[root@xuexi tmp]# enc -a -des3 -d -in test.1 -pass pass: -md md5
# /etc/fstab
# by on Thu May 11 04:17:44 2017#
# , by , are under '/dev/disk'# See man pages fstab(5), (8), mount(8) and/or blkid(8) for more info#
UUID=-aea4-4d8e-8be8- / xfs 0 0UUID=-033b-4037-bbcb- /boot xfs 0 0UUID=-daa6-4c17-8b03- swap swap 0 0
[root@xuexi tmp]# enc -a -des3 -d -S '' -in test.1 -pass pass: -md md5
# /etc/fstab
# by on Thu May 11 04:17:44 2017#
# , by , are under '/dev/disk'# See man pages fstab(5), (8), mount(8) and/or blkid(8) for more info#
UUID=-aea4-4d8e-8be8- / xfs 0 0UUID=-033b-4037-bbcb- /boot xfs 0 0UUID=-daa6-4c17-8b03- swap swap 0 0
(4).在测试下"-p"和"-P"选项的输出功能。小写字母p不仅输出密钥算法结果,还输出加解密的内容,而大写字母P则只输出密钥算法结果。
加密时的情况。
[root@xuexi tmp]# enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass: -md md5 -psalt=FABC0
key=
iv =
其中key就是单向加密明文密码后得到的对称密钥,iv是密码运算时使用的向量值。
再看解密时的情况,此处加上了salt。
[root@xuexi tmp]# enc -a -des3 -d -S 'Fabc' -in test.1 -pass pass: -md md5 -Psalt=FABC0
key=
iv =
若解密时不指定salt,或者随意指定salt,结果如下。
[root@xuexi tmp]# enc -a -des3 -d -in test.1 -pass pass: -md md5 -P salt=FABC0
key=
iv =
[root@xuexi tmp]# enc -a -des3 -S 'FabM' -d -in test.1 -pass pass: -md md5 -Psalt=FABC0
key=
iv =
可见,解密时,只要指定和加密时相同编码格式和单向加密算法,密钥的结果就是一样的,且解密时明确指定salt是无意义的,因为它可以读取到加密时使用的salt。
甚至,解密时指定不同的对称加密算法,密钥结果也是一样的。
[root@xuexi tmp]# enc -a -desx -d -in test.1 -pass pass: -md md5 -p salt=FABC0
key=
iv =
由此,能推理出对称加密时使用的对称密钥和对称算法是毫无关系的。