科技知識動態:什么是對稱加密?

導讀跟大家講解下有關什么是對稱加密?,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說什么是對稱加密?,小編也收集到了有關什

跟大家講解下有關什么是對稱加密?,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說什么是對稱加密?,小編也收集到了有關什么是對稱加密?的相關資料,希望大家看到了會喜歡。

采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

目錄

1 定義

2 工作過程

3 常用算法

4 優缺點

定義

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

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

因此[1] 加密的安全性不僅取決于加密算法本身,密鑰管理的安全性更是重要。因為加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題。

工作過程

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

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

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

選項說明:

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

-in filename :輸入文件,不指定時默認是stdin

-out filename:輸出文件,不指定時默認是stdout

-e:對輸入文件加密操作,不指定時默認就是該選項

-d:對輸入文件解密操作,只有顯示指定該選項才是解密

-pass:傳遞加、解密時的明文密碼。若驗證簽名時實用的公鑰或私鑰文件是被加密過的,則需要傳遞密碼來解密。密碼的格式見"openssl 密碼格式"

-k :已被"-pass"替代,現在還保留是為了兼容老版本的openssl

-base64:在加密后和解密前進行base64編碼或解密,不指定時默認是二進制。注意,編碼不是加解密的一部分,而是加解密前后對數據的格式"整理"

-a:等價于-base64

-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 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

支持的對稱加密算法有:

-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命令用法示例之前,先解釋下對稱加密和解密的原理和過程。

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

所以,將對稱加、解密的機制簡單概括如下:

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

對稱解密機制:先解碼文件,再根據單向加密算法對解密時輸入的明文密碼計算得到對稱密鑰,依此對稱密鑰對稱解密解碼后的文件。

因此,解密過程中使用的解碼方式、單向加密和對稱加密算法都必須一致,且輸入的密碼必須是正確密碼。但需要注意的一點是,解密時可以不指定salt,因為加密時使用的salt會記錄下來,解密時可以讀取該salt。

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

示例:

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

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

[root@xuexi tmp]# openssl enc -a -in test.txt -out test_base64.txt[root@xuexi tmp]# cat test_base64.txtCiMKIyAvZXRjL2ZzdGFiCiMgQ3JlYXRlZCBieSBhbmFjb25kYSBvbiBUaHUgTWF5IDExIDA0OjE3OjQ0IDIwMTcKIwojIEFjY2Vzc2libGUgZmlsZXN5c3RlbXMsIGJ5IHJlZmVyZW5jZSwgYXJlIG1haW50YWluZWQgdW5kZXIgJy9kZXYvZGlzaycKIyBTZWUgbWFuIHBhZ2VzIGZzdGFiKDUpLCBmaW5kZnMoOCksIG1vdW50KDgpIGFuZC9vciBibGtpZCg4KSBmb3IgbW9yZSBpbmZvCiMKVVVJRD1iMmE3MGZhZi1hZWE0LTRkOGUtOGJlOC1jNzEwOWFjOWM4YjggLyAgICAgICAgICAgICAgICAgICAgICAgeGZzICAgICBkZWZhdWx0cyAgICAgICAgMCAwClVVSUQ9MzY3ZDZhNzctMDMzYi00MDM3LWJiY2ItNDE2NzA1ZWFkMDk1IC9ib290ICAgICAgICAgICAgICAgICAgIHhmcyAgICAgZGVmYXVsdHMgICAgICAgIDAgMApVVUlEPWQ1MDUxMTNjLWRhYTYtNGMxNy04YjAzLWIzNTUxY2VkMjMwNSBzd2FwICAgICAgICAgICAgICAgICAgICBzd2FwICAgIGRlZmF1bHRzICAgICAgICAwIDAK

再以base64格式進行解碼。

[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

實際上,上述編碼和解碼的過程嚴格地說也是對稱加密和解密,因為openssl enc默認會帶上加密選項"-e",只不過因為沒有指定輸入密碼選項,使用的加密密碼為空而已,且單向加密算法使用的也是默認值。解密時也一樣。

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

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

加密后,查看加密后文件test.1的結果。

[root@xuexi tmp]# cat test.1U2FsdGVkX1+c/d4NsXnY6Pd7rcZjGSsMRJWQOP0s5sxH6aLE5iCYjKEAbGac//iRwkUUh6a57OpUA3+OOCKB4z+IxBcKo67BUDGR9vYeCfkobH9F+mSfVzZbXBrJmxwf921tJ+8K+yKB6DjJfufpW+DWXmH8MFyvK60wnYHsfUQOp81EvaUtEfqEKIS8hgg74NTOyww+/VMDdc2wmkf08XNQUPlVtLaSx3vuBisxRdu8raiKWGGOB7qCwELCxDquNaRCIh0VjjffGohAOMMsAQ2kFCDUKx0Z4Df5fvifhPXoHfsj2lI216BPG5Cy88K2KV78DoBm4pnMAymo/HRRF95LjvWYZIN88hIVN67u2j9zqSGeuyJakMyDVhYYmrHlsMr2YTbTwus2DiO6qAzt/0a9nocTVKfGR81Xsh0a0ZudjtrMl5H36YJawpldvUCaDzXPsbpQrp0VGi2HvJ4EVKKEx2uh8XYWmJ4ytj1s1wtCR6wQhmERtInGwULWTyI+agXStSB5XzsvAJRJvexsaNycj5lAoQ8O6YXEj7B0inB7nBQTFbwkXyvJqXpr1179i67leYc59OvlhRMA+GLW4g/Mg5dN5SBmgt1ChOJs4887zAUyLYrLvR4zDK6IQN/MP6F15c9V+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).加密時帶上點鹽salt。其實不寫時默認就已經加入了,只不過是加入隨機鹽值。使用-S可以指定明確要使用的鹽的值。但是鹽的值只能是16進制范圍內字符的組合,即"0-9a-fA-F"的任意一個或多個組合。

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

解密。解密時不用指定salt值,即使指定了也不會影響解密結果。

[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).在測試下"-p"和"-P"選項的輸出功能。小寫字母p不僅輸出密鑰算法結果,還輸出加解密的內容,而大寫字母P則只輸出密鑰算法結果。

加密時的情況。

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

其中key就是單向加密明文密碼后得到的對稱密鑰,iv是密碼運算時使用的向量值。

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

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

若解密時不指定salt,或者隨意指定salt,結果如下。

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

可見,解密時,只要指定和加密時相同編碼格式和單向加密算法,密鑰的結果就是一樣的,且解密時明確指定salt是無意義的,因為它可以讀取到加密時使用的salt。

甚至,解密時指定不同的對稱加密算法,密鑰結果也是一樣的。

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

由此,能推理出對稱加密時使用的對稱密鑰和對稱算法是毫無關系的。

以上就是什么是對稱加密?的詳細內容,更多請關注php中文網其它相關文章!

來源:php中文網

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!