密碼學專題 對稱加密算法

  • 一般來說,使用OpenSSL對稱加密算法有兩種方式,一種是使用API函數的方式,一種是使用OpenSSL提供的對稱加密算法指令方式。本書將介紹對稱加密算法的指令方式
  • OpenSSL的對稱加密算法指令主要用來對數據進行加密和解密處理輸入輸出的方式主要是文件,當然,也可以是默認的標準輸入輸出設備
  • OpenSSL基本上為所有其支持的對稱加密算法都提供了指令方式的應用,這些應用指令的名字基本上都是以對稱加密算法本身的名字加上位數、加密模式或其他屬性組合而成。比如DES算法的CBC模式,其對應的指令就是des-cbc。
  • 要查找最新版本的OpenSSL支持哪些對稱加密算法指令,只要在OpenSSL應用程序提示符下輸入“-help”,就可以看到在輸出信息最后部分(Ciphercommands)有很多我們熟悉的算法名稱,這些就是OpenSSL支持的對稱加密算法指令。OpenSSL還將所有的對稱加密算法指令集成在一個指令程序中,那就是enc指令
  • enc指令是OpenSSL中對稱加密算法指令的集大成者,用戶可以在它的一個參數中指定使用哪種加密算法和模式,從而統一了對稱加密算法指令的入口。enc指令的格式跟單獨一個對稱加密算法指令的格式是基本一樣的,但是增加了一個算法類型的選擇參數選項。
  • 比如,下面兩種形式的指令是等價的:

  • OpenSSL的對稱加密算法指令還可以增加BASE64編解碼的功能,也就是說,可以在數據加密后將數據進行BASE64編碼后輸出保存,然后在解密的時候先將數據進行BASE64解碼后再進行解密。這樣,對于加密后數據的保存和處理就更加方便,因為BASE64編碼將加密后的很多不可見字符都編碼成可見的字符了。當然,如果你愿意,也可以單獨使用BASE64編碼的功能,OpenSSL為此也提供了專門的指令,其使用形式跟其他對稱加密算法指令是一致的。
  • OpenSSL的對稱加密算法指令還可以作為使用第三方加密庫(通常是硬件加密設備)的應用接口,也就是說,它可以使用第三方的加密庫作為完成加密操作的真正設備。這是通過OpenSSL的Engine機制實現的。當然,使用第三方加密庫的前提是你已經安裝了第三方的加密設備并成功通過Engine機制加載到了OpenSSL中。?
  • 不過,對OpenSSL的所有指令,包括對稱加密算法指令,你不能期望過高,這些指令雖然功能強大,但是并沒有支持所有可能的加密算法和模式,只是提供了固定的部分功能。比如對稱加密算法指令就不支持76位的RC2加解密或者84位的RC4加解密等功能。如果你想使用這些靈活的加密模式和算法,那么就需要對OpenSSL進行進一步的深入研究,即使用OpenSSL的API。

?

  • 對于大部分塊加密對稱加密算法,OpenSSL都提供了CBC、CFB、ECB和OFB四種加密模式。需要注意的是,對于使用兩個密鑰和三個密鑰EDE方式的三重DES算法,其ECB模式的指令名稱并沒有明確標出,很容易跟CBC模式混同,因為塊加密算法使用最多的是CBC方式。?
  • 如果要單獨使用BASE64編碼而不進行數據的加密和解密,那么只要簡單地忽略算法類型參數并加上“a”或者“base64”選項就可以了,當然,你如果不愿意忽略算法類型,也可以輸入“-none”選項。下面三種形式是等價的,僅使用BASE64編碼的指令:

  • 從表還可以看出,對于絕大部分對稱加密算法來說,都有enc參數式的指令和單獨的指令兩種方式,它們都是等價的,至于選擇哪一種,主要取決于用戶本身的偏好。不過,enc指令可能會更快地支持新的對稱加密算法,而單獨的對稱加密算法指令就不一定能得到及時的更新。這跟enc實現的機制是有關系的,因為enc使用的是OpenSSL內部定義的對稱加密算法簡稱作為類型輸入參數,只要是OpenSSL定義的對稱加密算法模式,enc程序都能通過接口API自動支持,不需要因為增加了新的對稱加密算法而進行enc應用程序的修改。?
  • 相對于其他指令來說,對稱加密算法的指令參數比較少,使用起來也相對容易。對稱 加密算法指令的參數形式如下:

  • iphername是在表7-1中第二列和第三列中出現的參數值之一。如果你選擇第一種指令形式,那么就需要選擇表7-1第二列的參數形式;如果你選擇的是后一種獨立對稱加密算法指令方式,那就應該使用表7-1第三列的參數形式。對于第一種對稱加密算法指令使用方式來說,如果你不需要進行任何加密或解密處理,那么可以輸入none選項替代ciphername,當然,你也可以簡單忽略ciphername選項,其效果是一樣的。

(2)in和out選項

  • 這兩個選項分別用于指令輸入和輸出文件,對于加密操作來說,輸入的應該是明文文件,也就是要加密的文件,輸出的是密文文件,即經過加密的文件;對于解密操作來說,輸入的是經過加密的文件,而輸出的是恢復的明文文件。輸入和輸出文件名本身是沒有任何限制的,只要符合習慣的文件名形式即可。需要注意的是,一般不要試圖編輯和改變加密后的文件,那樣做可能引起文件的部分甚至全部內容不能進行正確的解密!默認的輸入和輸出文件是標準輸入和輸出設備,對于Windows來說,就是指令行界面。需要注意的是,如果提供的輸出文件名是已經存在的文件,那么程序會首先將該文件內容清空!

(3)口令輸入選項pass,k和kfile

  • 如果你不愿意輸入繁雜的用來加密數據的密鑰和初始向量,那么可以使用從口令中提取密鑰和初始向量的方法。OpenSSL對稱加密算法指令中輸入口令的目的正在于此,事實上,OpenSSL中幾乎所有輸入的口令都是用作提取密鑰的材料,而不是直接用作加密的密鑰。pass選項提供了最靈活的口令輸入方式,輸入的源可以是標準輸入設備、指令行直接輸入、提示輸入、文件、環境變量和文件描述符,具體的格式介紹讀者可以參考7-4節的應用實例。k選項和kfile選項都是為了兼容以前的版本而保留的,它們的功能目前都可以使用pass選項來實現。k選項后面輸入的參數是口令字符。kfile選項后面輸入的參數是作為口令的文件名,當然,必要的時候應該也提供路徑。OpenSSL的口令文件以第一行作為輸入口令。

(4)e和d選項

  • e和d選項分別表示執行加密操作(encryption)和解密操作(decryption),兩個參數是互斥的,不能同時出現,但是可以同時不出現,這時候就執行默認的操作,即執行加密操作。這兩個選項都不帶參數。

(5)base64,a和A選項

  • 選項a和base64的作用是相同的,就是將文件進行BASE64的編解碼操作。對于加密操作來說,就在數據加密之后進行BASE64編碼;對于解密操作來說,就在解密操作之前執行BASE64解碼。A選項跟a或者base64選項一起使用才能生效,如果出示了A選項,則程序將努力將所有加密數據作為一行進行BASE64編碼,而不是按照文件原有的換行格式進行BASE64編碼。需要注意的是,在文件比較大的時候,A選項經常會導致指令執行失敗。上述三個選項都不帶參數。

(6)K和IV選項

  • 如果你使用這兩個選項,意味著你不相信OpenSSL從口令提取加密密鑰和初始向量的方法,而使用自己直接提供的加密密鑰和初始向量,那么這時候你就不再需要使用口令選項。K選項后面的參數是加密密鑰,是以十六進制的方式表示,長度不能超過64個字符。IV選項只有在分組加密算法的某些模式才需要,其參數也是以十六進制的方式表示,長度不能超過32個字符。如果輸入的參數不是十六進制的字符,那么程序就會報錯。上述選項參數輸入的長度如果不夠,就在后面補零替代。

(7)salt,nosalt和S選項

  • salt選項指明在從口令提取密鑰的過程中使用鹽值,這可以增強被加密數據的安全性,事實上,即便不出示此選項,默認指令也會使該選項生效。nosalt選項跟salt選項相反,告訴指令在密鑰提取的過程中不使用鹽值,一般來說,如果不是特別地為了跟OpenSSL一些老版本兼容,不要做這樣降低安全性的事情。S選項后面的輸入參數是十六進制編碼的真正使用的鹽值,其長度不能超過16個字符。所有這些選項只有跟口令輸入選項一起使用才會生效,如果你使用K和IV選項方式輸入加入密鑰,那么這些選項將不會產生任何作用。

(8)engine選項

  • 該選項的參數是OpenSSL支持的Engine的名稱,一般是以字符串表示,比如“cswift”,“nuron”和“pkcs11”等。如果你不知道目前你的OpenSSL支持的Engine特征字符串,可以輸入下列指令,其中有效的Engine都會提示出來:
  • OpenSSL>engine -t
  • 如果你使用了有效的Engine,那么你所執行的加密操作實際上都是在第三方加密設備中執行,而不再是使用OpenSSL密碼庫的軟件算法。

(9)p和P選項

  • p選項打印出對稱加密算法真正使用的加密密鑰和初始向量,輸出的格式是十六進制的形式。如果出示了P選項,則程序在打印出加密密鑰和初始向量后就立刻退出,而不執行真正的加密或解密操作。

(10)nopad,bufsize和debug選項

  • 這幾個選項之間其實并沒有聯系,這里之所以放在一起,只是為了節省篇幅。nopad選項指定不使用默認的PKCS#5標準的補丁方式,如果這樣做,那么就要確保在塊加密算法中輸入的數據是加密塊長度的整數倍,比如使用DES算法,就要保證輸入的數據是8字節的整數倍。
  • bufsize選項的參數指定了讀寫文件的I/O緩存,指定的數字以字節為單位,也可以在數字后面加“k”表示是以1024字節為單位。比如,下面的格式都是可以被接受的:
  • -bufsize 256 或者 -bufsize 8k
  • 如果你指定的緩存小于80字節,指令程序會自動將它增加為80字節,這是進行BASE64一行編碼所需要的最小長度。
  • 使用debug選項后,OpenSSL的對稱加密算法指令會將整個執行過程中I/O操作相關的BIO列出來。這主要是為了調試目的而使用,對于一般用戶來說,該選項很少使用。

例子

  • 本節將給出對稱加密算法指令的一些具體實例,在下面的例子中,“pln.txt”表示明文文件,“enc.txt”表示經過加密的密文文件,而“rcv.txt”表示恢復的明文文件。
  • 下面指令將文件pln.txt的內容復制到文件enc.txt中:

  • 使用的時候 需要指定文件的絕對路徑?

  • ?OpenSSL對稱加密算法加密數據的時候需要使用密鑰,對于塊加密算法的某些模式,還需要初始向量,既可以直接輸入加密密鑰和初始向量,也可以通過口令來提取加密密鑰和初始向量
  • 就口令輸入來說,也有多種不同的方式,本節將給出多種輸入口令和密鑰的例子。
  • 下面是DES算法CBC模式指令直接使用加密密鑰和初始向量的例子:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡防火墻單向和雙向_單向晶閘管與雙向晶閘管之間的不同之處

晶閘管是回一個可以控導點開關,能以弱電去控制強電的各種電路。晶閘管常用于整流,調壓,交直流變化,開關,調光等控制電路中。具有提交小,重量輕,耐壓高,容量大,效率高&…

java 遍歷100以內的偶數,偶數的和,偶數的個數

題目 遍歷100以內的偶數,偶數的和,偶數的個數 代碼 package l2_for; /*遍歷100以內的偶數,偶數的和,偶數的個數*/ public class ForDemo1 {public static void main(String[] args) {//方法1:int sum1 0,count10;f…

python版本切換_怎么切換python版本

展開全部 (1)分別安2113裝 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官網下載的) 順序無所謂(為5261了看著4102方便,我把安裝路徑修改統一了1653) (2)配置…

java 打印

題目 編寫程序從1循環到150,并在每行打印一個值,另外在每個3的倍數行 上打印出“foo”,在每個5的倍數行上打印“biz”,在每個7的倍數行上打印 輸出“baz”。 代碼 package l2_for;/** 編寫程序從1循環到150,并在每行打印一個值&#xff0c…

react.lazy 路由懶加載_Vue面試題: 如何實現路由懶加載?

非懶加載import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源碼剖析 deque雙端隊列 概述

vector是單向開口的連續線性空間,deque是一種雙向開口的連續線性空間。deque可以在頭尾兩端分別進行元素的插入和刪除操作vector和deque的差異 1,deque允許常數時間內對于頭端元素進行插入和刪除操作2,deque沒有所謂容量(capacity)的概念&…

java 最大公約數和最小公倍數

題目 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 比如:12和20的最大公約數是4,最小公倍數是60。 說明:break關鍵字的使用 代碼一 package l2_for; //題目:輸入兩個正整數m和n,求…

python的自帶數據集_Python的Sklearn庫中的數據集

一、Sklearn介紹 scikit-learn是Python語言開發的機器學習庫,一般簡稱為sklearn,目前算是通用機器學習算法庫中實現得比較完善的庫了。其完善之處不僅在于實現的算法多,還包括大量詳盡的文檔和示例。其文檔寫得通俗易懂,完全可以當…

STL源碼剖析 stack 棧 概述->(使用deque雙端隊列 / list鏈表)作為stack的底層容器

Stack是一種先進后出的數據結構,他只有一個出口stack允許 新增元素、移除元素、取得最頂端的元素,但是無法獲得stack的內部數據,因此satck沒有遍歷行為Stack定義的完整列表 (雙端隊列作為Stack的底層容器) 將deque作為Stack的底部結構&#…

java 三位數的水仙花數

代碼 package l2_for;public class ForDemo6 {public static void main(String[] args) {for (int i 100; i <999 ; i) {int i1i/1%10;int i2i/10%10;int i3i/100%10;if (i(int)(Math.pow(i1,3)Math.pow(i2,3)Math.pow(i3,3))){System.out.print(i"\t");}}} }

python怎么實現圖像去噪_基于深度卷積神經網絡和跳躍連接的圖像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者&#xff1a;Xiao-Jiao Mao、Chunhua Shen等本文提出了一個深度的全卷積編碼-解碼框架來解決去噪和超分辨之類的圖像修復問題。網絡由多層的卷積和反卷積組成&a…

STL源碼剖析 queue隊列概述

queue是一種先進先出的數據結構&#xff0c;他有兩個出口允許新增元素&#xff08;從最底端 加入元素&#xff09;、移除元素&#xff08;從最頂端刪除元素&#xff09;&#xff0c;除了對于頂端和底端元素進行操作之外&#xff0c;沒有辦法可以獲取queue的其他元素即queue沒有…

java輸入正數和負數并計算個數

題目 從鍵盤讀入個數不確定的整數&#xff0c;并判斷讀入的正數和負數的個數&#xff0c;輸入 為0時結束程序。 知識點 最簡單“無限” 循環格式&#xff1a;while(true) , for(;;),無限循環存在的原因是并不 知道循環多少次&#xff0c;需要根據循環體內部某些條件&#xf…

python為什么運行不了_python為什么會環境變量設置不成功

學習python編程&#xff0c;首先要配置好環境變量。本文主要講解python的環境變量配置&#xff0c;在不同版本下如何安裝 Windows 打開Python官方下載網站 x86:表示是32位電腦 x86-64:表示是64位電腦 目前Python版本分為2.x版本和3.x版本。推薦大家使用3.x版本。 設置環境變量&…

STL 源碼剖析 heap堆

heap不屬于STL容器的組件&#xff0c;屬于幕后角色&#xff0c;是priority_queue的助手priority_queue 允許用戶以任何次序將任何元素推入容器內&#xff0c;但是取出的時候需要從優先級最高(也就是數值最高)的元素開始取&#xff0c;這種思想是基于heap的函數實現如果使用list…

java 打印星號

代碼1 package lesson.l2_for; //6列4行 //****** //****** //****** //****** public class ForDemo8 {public static void main(String[] args) {for (int i1;i<4;i){for (int j 1; j <6 ; j) {System.out.print("*");}System.out.println();}} }代碼2 pa…

python從小白到大牛百度云盤_Java從小白到大牛 (關東升著) 中文pdf+mobi版[36MB]

《Java從小白到大牛》是一本Java語言學習立體教程&#xff0c;讀者群是零基礎小白&#xff0c;通過本書的學習能夠成為Java大牛。主要內容包括&#xff1a;Java語法基礎、Java編碼規范、數據類型、運算符、控制語句、數組、字符串、面向對象基礎、繼承與多態、抽象類與接口、枚…

java打印九九乘法表

代碼1 package lesson.l5_loop; //九九乘法表 //1*11 //2*12 2*24 //3*13 3*26 3*39 //4*14 4*28 4*312 4*416 //5*15 5*210 5*315 5*420 5*525 //6*16 6*212 6*318 6*424 6*530 6*636 //7*17 7*214 7*321 7*428 7*535 7*642 7*749 //8*18 8*216 8*324 8*432 8*540 8*648 8*75…

STL源碼剖析 priority_queue

priority_queue是一個擁有權重概念的queue&#xff0c;允許底部加入新的元素&#xff0c;頭部刪除舊的元素&#xff0c;以及審視元素數值的操作priority_queue帶有權重的概念&#xff0c;即元素按照權重進行排列&#xff0c;而不是按照插入隊列的順序進行排序。要求權值高者在前…

python數字1 3怎么表示_Python入門篇之數字

數字類型 數字提供了標量貯存和直接訪問。它是不可更改類型&#xff0c;也就是說變更數字的值會生成新的對象。當然&#xff0c;這個過程無論對程序員還是對用戶都是透明的&#xff0c;并不會影響軟件的開發方式。 Python 支持多種數字類型&#xff1a;整型、長整型、布爾型、雙…