什么是對(duì)稱加密?

采用單鑰密碼系統(tǒng)的加密方法,同一個(gè)密鑰可以同時(shí)用作信息的加密和解密,這種加密方法稱為對(duì)稱加密,也稱為單密鑰加密。

目錄

1?定義

2?工作過(guò)程

3?常用算法

4?優(yōu)缺點(diǎn)

定義

需要對(duì)加密和解密使用相同密鑰的加密算法。由于其速度快,對(duì)稱性加密通常在消息發(fā)送方需要加密大量數(shù)據(jù)時(shí)使用。對(duì)稱性加密也稱為密鑰加密。

所謂對(duì)稱,就是采用這種加密方法的雙方使用方式用同樣的密鑰進(jìn)行加密和解密。密鑰是控制加密及解密過(guò)程的指令。算法是一組規(guī)則,規(guī)定如何進(jìn)行加密和解密。

因此[1]??加密的安全性不僅取決于加密算法本身,密鑰管理的安全性更是重要。因?yàn)榧用芎徒饷芏际褂猛粋€(gè)密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問(wèn)題。

工作過(guò)程

下面舉個(gè)例子來(lái)簡(jiǎn)要說(shuō)明一下對(duì)稱加密的工作過(guò)程。甲和乙是一對(duì)生意搭檔,他們住在不同的城市。由于生意上的需要,他們經(jīng)常會(huì)相互之間郵寄重要的貨物。為了保證貨物的安全,他們商定制作一個(gè)保險(xiǎn)盒,將物品放入其中。他們打造了兩把相同的鑰匙分別保管,以便在收到包裹時(shí)用這個(gè)鑰匙打開保險(xiǎn)盒,以及在郵寄貨物前用這把鑰匙鎖上保險(xiǎn)盒。

上面是一個(gè)將重要資源安全傳遞到目的地的傳統(tǒng)方式,只要甲乙小心保管好鑰匙,那么就算有人得到保險(xiǎn)盒,也無(wú)法打開。這個(gè)思想被用到了現(xiàn)代計(jì)算機(jī)通信的信息加密中。在對(duì)稱加密中,數(shù)據(jù)發(fā)送方將明文(原始數(shù)據(jù))和加密密鑰一起經(jīng)過(guò)特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。接收方收到密文后,若想解讀原文,則需要使用加密密鑰及相同算法的逆算法對(duì)密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。在對(duì)稱加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密。

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-k password] [-S salt] [-salt] [-md] [-p/-P]

選項(xiàng)說(shuō)明:

-ciphername:指定對(duì)稱加密算法(如des3),可獨(dú)立于enc直接使用,如openssl des3或openssl enc -des3。推薦在enc后使用,這樣不依賴于硬件

-in filename :輸入文件,不指定時(shí)默認(rèn)是stdin

-out filename:輸出文件,不指定時(shí)默認(rèn)是stdout

-e:對(duì)輸入文件加密操作,不指定時(shí)默認(rèn)就是該選項(xiàng)

-d:對(duì)輸入文件解密操作,只有顯示指定該選項(xiàng)才是解密

-pass:傳遞加、解密時(shí)的明文密碼。若驗(yàn)證簽名時(shí)實(shí)用的公鑰或私鑰文件是被加密過(guò)的,則需要傳遞密碼來(lái)解密。密碼的格式見(jiàn)”openssl 密碼格式

-k ? ? :已被”-pass”替代,現(xiàn)在還保留是為了兼容老版本的openssl

-base64:在加密后和解密前進(jìn)行base64編碼或解密,不指定時(shí)默認(rèn)是二進(jìn)制。注意,編碼不是加解密的一部分,而是加解密前后對(duì)數(shù)據(jù)的格式”整理”

-a:等價(jià)于-base64

-salt:?jiǎn)蜗蚣用軙r(shí)使用salt復(fù)雜化單向加密的結(jié)果,此為默認(rèn)選項(xiàng),且使用隨機(jī)salt值

-S salt:不使用隨機(jī)salt值,而是自定義salt值,但只能是16進(jìn)制范圍內(nèi)字符的組合,即”0-9a-fA-F”的任意一個(gè)或多個(gè)組合

-p:打印加解密時(shí)salt值、key值和IV初始化向量值(也是復(fù)雜化加密的一種方式),解密時(shí)還輸出解密結(jié)果,見(jiàn)后文示例

-P:和-p選項(xiàng)作用相同,但是打印時(shí)直接退出工具,不進(jìn)行加密或解密操作

-md:指定單向加密算法,默認(rèn)md5。該算法是拿來(lái)加密key部分的,見(jiàn)后文分析。

支持的單向加密算法有:

-md4            to use the md4 message digest algorithm-md5            to use the md5 message digest algorithm-ripemd160      to use the ripemd160 message digest algorithm-sha            to use the sha message digest algorithm-sha1           to use the sha1 message digest algorithm-sha224         to use the sha224 message digest algorithm-sha256         to use the sha256 message digest algorithm-sha384         to use the sha384 message digest algorithm-sha512         to use the sha512 message digest algorithm-whirlpool      to use the whirlpool message digest algorithm

支持的對(duì)稱加密算法有:

-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               -aes128                    -aes192                    -aes256                    -bf                        -bf-cbc                    -bf-cfb                    -bf-ecb                    -bf-ofb                    -blowfish                  -camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1         -camellia-128-cfb8         -camellia-128-ecb          -camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb          -camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc          -camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8         -camellia-256-ecb          -camellia-256-ofb          -camellia128               -camellia192               -camellia256               -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-aes128-GCM             -id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-GCM             -id-aes192-wrap            -id-aes192-wrap-pad        -id-aes256-GCM             -id-aes256-wrap            -id-aes256-wrap-pad        -id-smime-alg-CMS3DESwrap  -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

在給出openssl enc命令用法示例之前,先解釋下對(duì)稱加密和解密的原理和過(guò)程。

對(duì)稱加解密時(shí),它們使用的密碼是完全相同的,例如”123456″,但這是密碼,且是明文密碼,非常不安全,所以應(yīng)該對(duì)此簡(jiǎn)單密碼進(jìn)行復(fù)雜化。最直接的方法是使用單向加密計(jì)算出明文密碼的hash值,單向加密后新生成的密碼已經(jīng)比較安全(稱之為密鑰比較好),可以作為對(duì)稱加密時(shí)的對(duì)稱密鑰。另外,由于同一單向加密算法對(duì)相同明文密碼的計(jì)算結(jié)果是完全一致的,這樣解密時(shí)使用相同的單向加密算法就能計(jì)算出完全相同的密鑰,也就是解密時(shí)的對(duì)稱密鑰。如果想要更安全,還可以在對(duì)稱加密后對(duì)加密文件進(jìn)行重新編碼,如使用”base64″、二進(jìn)制或hex編碼方式進(jìn)行編碼,但對(duì)應(yīng)的在解密前就需要先解碼,解碼后才能解密。

所以,將對(duì)稱加、解密的機(jī)制簡(jiǎn)單概括如下:

對(duì)稱加密機(jī)制:根據(jù)指定的單向加密算法,對(duì)輸入的明文密碼進(jìn)行單向加密(默認(rèn)是md5),得到固定長(zhǎng)度的加密密鑰,即對(duì)稱密鑰,再根據(jù)指定的對(duì)稱加密算法,使用對(duì)稱密鑰加密文件,最后重新編碼加密后的文件。即單向加密明文密碼結(jié)果作為對(duì)稱密鑰、使用對(duì)稱密鑰加密文件、對(duì)文件重新編碼。

對(duì)稱解密機(jī)制:先解碼文件,再根據(jù)單向加密算法對(duì)解密時(shí)輸入的明文密碼計(jì)算得到對(duì)稱密鑰,依此對(duì)稱密鑰對(duì)稱解密解碼后的文件。

因此,解密過(guò)程中使用的解碼方式、單向加密和對(duì)稱加密算法都必須一致,且輸入的密碼必須是正確密碼。但需要注意的一點(diǎn)是,解密時(shí)可以不指定salt,因?yàn)榧用軙r(shí)使用的salt會(huì)記錄下來(lái),解密時(shí)可以讀取該salt。

如下圖所示,分別是加密和解密過(guò)程示意圖。

什么是對(duì)稱加密?什么是對(duì)稱加密?

示例:

以加密/etc/fstab的備份文件/tmp/test.txt為例。

(1).首先測(cè)試openssl enc的編碼功能。由于未指定密碼選項(xiàng)”-k”或”-pass”,所以僅僅只進(jìn)行編碼而不進(jìn)行加密,因此也不會(huì)提示輸入密碼。

[root@xuexi tmp]# openssl enc -a -in test.txt -out test_base64.txt    [root@xuexi tmp]# cat test_base64.txt  CiMKIyAvZXRjL2ZzdGFiCiMgQ3JlYXRlZCBieSBhbmFjb25kYSBvbiBUaHUgTWF5  IDExIDA0OjE3OjQ0IDIwMTcKIwojIEFjY2Vzc2libGUgZmlsZXN5c3RlbXMsIGJ5  IHJlZmVyZW5jZSwgYXJlIG1haW50YWluZWQgdW5kZXIgJy9kZXYvZGlzaycKIyBT  ZWUgbWFuIHBhZ2VzIGZzdGFiKDUpLCBmaW5kZnMoOCksIG1vdW50KDgpIGFuZC9v  ciBibGtpZCg4KSBmb3IgbW9yZSBpbmZvCiMKVVVJRD1iMmE3MGZhZi1hZWE0LTRk  OGUtOGJlOC1jNzEwOWFjOWM4YjggLyAgICAgICAgICAgICAgICAgICAgICAgeGZz  ICAgICBkZWZhdWx0cyAgICAgICAgMCAwClVVSUQ9MzY3ZDZhNzctMDMzYi00MDM3  LWJiY2ItNDE2NzA1ZWFkMDk1IC9ib290ICAgICAgICAgICAgICAgICAgIHhmcyAg  ICAgZGVmYXVsdHMgICAgICAgIDAgMApVVUlEPWQ1MDUxMTNjLWRhYTYtNGMxNy04  YjAzLWIzNTUxY2VkMjMwNSBzd2FwICAgICAgICAgICAgICAgICAgICBzd2FwICAg  IGRlZmF1bHRzICAgICAgICAwIDAK

再以base64格式進(jìn)行解碼。

[root@xuexi tmp]# openssl enc -a -d -in test_base64.txt                 #  # /etc/fstab  # Created by anaconda on Thu May 11 04:17:44 2017#  # Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#  UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

實(shí)際上,上述編碼和解碼的過(guò)程嚴(yán)格地說(shuō)也是對(duì)稱加密和解密,因?yàn)閛penssl enc默認(rèn)會(huì)帶上加密選項(xiàng)”-e”,只不過(guò)因?yàn)闆](méi)有指定輸入密碼選項(xiàng),使用的加密密碼為空而已,且單向加密算法使用的也是默認(rèn)值。解密時(shí)也一樣。

(2).測(cè)試使用des3對(duì)稱加密算法加密test.txt文件。

[root@xuexi tmp]# openssl enc -a -des3 -in test.txt -out test.1 -pass pass:123456 -md md5

加密后,查看加密后文件test.1的結(jié)果。

[root@xuexi tmp]# cat test.1U2FsdGVkX1+c/d4NsXnY6Pd7rcZjGSsMRJWQOP0s5sxH6aLE5iCYjKEAbGac//iRwkUUh6a57OpUA3+OOCKB4z+IxBcKo67BUDGR9vYeCfkobH9F+mSfVzZbXBrJmxwf  921tJ+8K+yKB6DjJfufpW+DWXmH8MFyvK60wnYHsfUQOp81EvaUtEfqEKIS8hgg7  4NTOyww+/VMDdc2wmkf08XNQUPlVtLaSx3vuBisxRdu8raiKWGGOB7qCwELCxDqu  NaRCIh0VjjffGohAOMMsAQ2kFCDUKx0Z4Df5fvifhPXoHfsj2lI216BPG5Cy88K2  KV78DoBm4pnMAymo/HRRF95LjvWYZIN88hIVN67u2j9zqSGeuyJakMyDVhYYmrHl  sMr2YTbTwus2DiO6qAzt/0a9nocTVKfGR81Xsh0a0ZudjtrMl5H36YJawpldvUCa  DzXPsbpQrp0VGi2HvJ4EVKKEx2uh8XYWmJ4ytj1s1wtCR6wQhmERtInGwULWTyI+agXStSB5XzsvAJRJvexsaNycj5lAoQ8O6YXEj7B0inB7nBQTFbwkXyvJqXpr1179  i67leYc59OvlhRMA+GLW4g/Mg5dN5SBmgt1ChOJs4887zAUyLYrLvR4zDK6IQN/M  P6F15c9V+m9pw2t32sUQQmYrYqOV/AQf0t0EwvA0Myjmfqtvmp555Q==

解密文件test.1。

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -out test.2 -pass pass:123456 -md md5 [root@xuexi tmp]# cat test.2   #  # /etc/fstab  # Created by anaconda on Thu May 11 04:17:44 2017#  # Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#  UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

(3).加密時(shí)帶上點(diǎn)鹽salt。其實(shí)不寫時(shí)默認(rèn)就已經(jīng)加入了,只不過(guò)是加入隨機(jī)鹽值。使用-S可以指定明確要使用的鹽的值。但是鹽的值只能是16進(jìn)制范圍內(nèi)字符的組合,即”0-9a-fA-F”的任意一個(gè)或多個(gè)組合。

[root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5

解密。解密時(shí)不用指定salt值,即使指定了也不會(huì)影響解密結(jié)果。??????

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5                  #  # /etc/fstab  # Created by anaconda on Thu May 11 04:17:44 2017#  # Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#  UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0
[root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabcxdasd' -in test.1 -pass pass:123456 -md md5   #  # /etc/fstab  # Created by anaconda on Thu May 11 04:17:44 2017#  # Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#  UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

(4).在測(cè)試下”-p”和”-P”選項(xiàng)的輸出功能。小寫字母p不僅輸出密鑰算法結(jié)果,還輸出加解密的內(nèi)容,而大寫字母P則只輸出密鑰算法結(jié)果。

加密時(shí)的情況。

[root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5 -psalt=FABC000000000000  key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D  iv =5128FDED01EE1499

其中key就是單向加密明文密碼后得到的對(duì)稱密鑰,iv是密碼運(yùn)算時(shí)使用的向量值。

再看解密時(shí)的情況,此處加上了salt。

[root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabc' -in test.1 -pass pass:123456 -md md5 -Psalt=FABC000000000000  key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D  iv =5128FDED01EE1499

若解密時(shí)不指定salt,或者隨意指定salt,結(jié)果如下。

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5 -P         salt=FABC000000000000  key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D  iv =5128FDED01EE1499
[root@xuexi tmp]# openssl enc -a -des3 -S 'FabM' -d -in test.1 -pass pass:123456 -md md5 -Psalt=FABC000000000000  key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D  iv =5128FDED01EE1499

可見(jiàn),解密時(shí),只要指定和加密時(shí)相同編碼格式和單向加密算法,密鑰的結(jié)果就是一樣的,且解密時(shí)明確指定salt是無(wú)意義的,因?yàn)樗梢宰x取到加密時(shí)使用的salt。

甚至,解密時(shí)指定不同的對(duì)稱加密算法,密鑰結(jié)果也是一樣的。

[root@xuexi tmp]# openssl enc -a -desx -d -in test.1 -pass pass:123456 -md md5 -p salt=FABC000000000000  key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D  iv =5128FDED01EE1499

由此,能推理出對(duì)稱加密時(shí)使用的對(duì)稱密鑰和對(duì)稱算法是毫無(wú)關(guān)系的。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員