A. 關於AES加解密中CBC模式的IV初始化向量的安全性問題
前段時間,在研究HLS的AES加密,由於一個地方電視台的HLS流有AES加密,在查看了相關的加解密方案後發現使用的是簡單的AES的CBC模式,在CBC的模式下,會設置一個IV,初始化向量。但是我在解密的時候,使用了一個由於理解錯誤而產生的一個錯誤IV居然也能解密視頻並進行播放,於是就有了這篇張文章。
雖然有五種加密,但是常用的還是CBC,CBC的全稱Cipher Block Chaining ,有點類似於區塊鏈哈,我們先來看下加密方式
上面的圖片從左往右看,初始化IV只有在第一個塊加密的時候才會用到,而第N個塊的加密IV則是用的N-1(N>1)個加密後的二進制數組。
CBC的解密則也是從左往右看,但是加密時IV在解密時候,只會用於對第一個塊進行解密,其他塊的解密則是使用上一塊的加密二進製作為IV進行解密操作。
通過上面的分析就能知道,加密的時候,iv會影響所有數據的加密結果,而解密時,iv只會影響第一個加密塊的解密結果,其他塊的解密可以直接通過分隔加密數據獲取正確是N-1塊的IV。
這也就印證了為什麼ff能播放我用錯誤的iv解密出來的視頻流數據,因為第一塊的大小存儲大概是id3 的數據,ff直接丟掉id3的數據,直接解碼後面的視頻數據 ,ff 應該是識別h264編碼頭開始解碼視頻。
那麼從這點可以看出,在使用了key的情況下,IV對整個數據的保密性沒有太大的作用。
再來說說我是怎麼發現這個問題,因為錯誤的IV只會影響第一個塊的數據,我在第一次嘗試解密後,直接用ff進行播放,ff能夠解碼並且播放成功,但是相對於其他未加密的HLS流來說,播放我解密後的數據會有3-5s的延時,這讓我很是頭疼,後來我就通過 ffplay -v trace 列印播放解密的日誌,發現視頻數據的id3信息丟失了,那麼出問題出在第一個塊。然後再次研究m3u8加解密IV的賦值方法,後發來經過多次試驗,正確賦值IV,解密出來的數據能夠及時播放。再後來,就出現了這篇文章的來由。
由此帶來的延展,針對iv在CBC模式下的弱用,AES提供了更多的模式可供選擇,詳細的可以到wiki上了解。
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
B. 對於加密的總結(AES,RSA)
跟第三方聯調的時候會碰到各種加密演算法,所以總結一下。
AES不是將拿到的明文一次性加密,而是分組加密,就是先將明文切分成長度相等的塊,每塊大小128bit,再對每一小塊進行加密。那麼問題就來了,並不是所有的原始明文串能被等分成128bit,例如原串大小200bit,那麼第二個塊只有72bit,所以就需要對第二個塊進行填充處理,讓第二個塊的大小達到128bit。常見的填充模式有
不進行填充,要求原始加密串大小必須是128bit的整數倍;
假設塊大小8位元組,如果這個塊跟8位元組還差n個位元組,那麼就在原始塊填充n,直到滿8位元組。例:塊{1,2,3},跟8位元組差了5個位元組,那麼補全後的結果{1,2,3,5,5,5,5,5}後面是五個5,塊{1,2,3,..7}跟8位元組差了1個位元組,那麼補全後就是{1,2,3,...,7,1},就是補了一個1。
如果恰好8位元組又選擇了PKCS5Padding填充方式呢?塊{1,2,3...8}填充後變成{1,2,3...8,8...8},原串後面被補了8個8,這樣做的原因是方便解密,只需要看最後一位就能算出原塊的大小是多少。
跟PKCS5Padding的填充方式一樣,不同的是,PKCS5Padding只是對8位元組的進行填充,PKCS7Padding可以對1~256位元組大小的block進行填充。openssl里aes的默認填充方式就是PKCS7Padding
AES有多種加密模式,包括:ECB,CBC,CTR,OCF,CFB,最常見的還是ECB和CBC模式。
最簡單的一種加密模式,每個塊進行獨立加密,塊與塊之間加密互不影響,這樣就能並行,效率高。
雖然這樣加密很簡單,但是不安全,如果兩個塊的明文一模一樣,那麼加密出來的東西也一模一樣。
openssl的相關函數:
CBC模式中引入了一個新的概念,初始向量iv。iv的作用就是為了防止同樣的明文塊被加密成同樣的內容。原理是第一個明文塊跟初始向量做異或後加密,第二個塊跟第一個密文塊做異或再加密,依次類推,避免了同樣的塊被加密成同樣的內容。
openssl相關函數:
敲黑板!! 所以跟第三方對接的時候,如果對面說他們用aes加密,務必對他們發起靈魂三問:
簽名的作用是讓接受方驗證你傳過去的數據沒有被篡改;加密的作用是保證數據不被竊取。
原理:你有一個需要被驗簽的原串A。
步驟一:選擇hash演算法將A進行hash得到hash_a;
步驟二:將hash_a進行加密,得到加密值encrypt_a;
步驟三:將原串A和加密的encrypt_a發給第三方,第三方進行驗簽。第三方先解密encrypt_a,得到一個hash值hash_a1,然後對原串A使用同樣的hash演算法進行hash,得到的即為加密前的hash_a,如果hash_a = hash_a1, 那麼驗簽成功。
rsa使用私鑰對信息加密來做簽名,使用公鑰解密去驗簽。
openssl相關函數:
注意:兩個函數中的m,是原串hash後的值,type表示生成m的演算法,例如NID_sha256表示使用sha256對原串進行的hash,返回1為簽名成功或者驗簽成功,-1位為失敗。
再次敲黑板!! 所以如果第三方說使用rsa驗簽,要讓對方告知他們的hash演算法。
首先明確,私鑰加密不等於簽名。加密的時候,使用使用公鑰加密,第三方使用你的私鑰進行解密。
openssl里公鑰加密函數為RSA_public_encrypt,私鑰解密函數為RSA_private_decrypt,具體的可以自己去查看下官方文檔。
rsa也涉及到了填充方式,所以對接的時候也要問清楚
在使用公鑰進行加密時,會發現每次加密出的結果都不一樣,但使用私鑰加密時,每次的結果都一樣,網上查了一圈,說是因為填充方式的原因。
官方文檔說明:
那麼為什麼一定要使用私鑰做簽名,公鑰做加密,而不是公鑰做簽名,私鑰做加密呢?
舉個栗子:
C. aes加密iv是什麼
iv就是初始化向量,初始化向量的值依密碼演算法而不裂巧拆同。最基本的要求是「唯寬告一性」,也就是說同一把密鑰不重復使用同一個初肆棗始化向量。這個特性無論在區塊加密或流加密中都非常重要。
D. 怎麼區分PV、IV、UV
區分PV、IV、UV如下:
1、pv訪問量(PageView),即頁面訪問量,每打開一次頁面PV計數+1,刷新頁面也是。
2、UV訪問數(UniqueVisitor)指獨立訪客訪問數,一台電腦終端為一個訪客。
3、IV是初始向量(IV,InitializationVector)。
(4)加密演算法iv的作用擴展閱讀:
PV簡介:
PV(pageview)即頁面瀏覽量,通常是衡量一個網路新聞頻道或網站甚至一條網路新聞的主要指標。網頁瀏覽數是評價網站流量最常用的指標之一,簡稱為PV。監測網站PV的變化趨勢和分析其變化原因是襪野很多站長定期要做的工作。PageViews中的Page一般是指普通的html網頁,也包含php、jsp等動態產生的html內容。來自瀏覽器的一次html內容請求會被看作一個PV,逐漸累計成為PV總數。
除了PV總數外,還可以從不同角度來分析和對比PV,比如想知道哪個網頁(Page)被瀏覽的次數多就要以Page為分析對象並分別累計PV。網頁一般通過URL或標題(htmltitle)來標識,大多數工具都提供答賀了類似的定義方法]關於PV的統計要考慮2種特殊情況:
一是從伺服器返回錯誤網頁或重定向網頁時,是否計數以及如何配置;二是本地或網關伺服器的緩存生效時是否計數。這些問題在實施網站分析前需要搞清楚,必要時可以咨詢工具廠商。
UV簡介:
UV是指不同的、通過互聯網訪問、瀏覽這個網頁的自然人。
比如清好派,在一台電腦上,哥哥打開了微軟的官方主頁,注冊了一個會員。弟弟一會兒也看了看,注冊了另一個會員。由於兄弟兩個使用的是相同的計算機,那麼他們的ip是一樣的,微軟的官方計數器記錄到一個ip登陸的信息。
但是,具有統計功能的統計系統,可以根據其他條件判斷出實際使用的用戶數量,返回給網站建設者真實、可信和准確的信息。比如通過注冊的用戶,甚至可以區分出網吧、機房等共享一個ip地址的不同計算機。
IV簡介:
在有線等效保密(WEP)協議中,IV是用來和密鑰組合成密鑰種子,作為RC4演算法的輸入,來產生加密位元組流對數據進行加密的。標準的64比特WEP使用40比特的鑰匙接上24比特的初向量(InitializationVector,IV)成為RC4用的鑰匙。
pv-網路UV-網路iv-網路
E. C#對稱加密中的Key和IV分別代表什麼,請詳細講解一下.
KEY 是加密的密鑰 iv 則是加密動作中的 數據操作的偏移量
F. 加密演算法和密鑰的作用
一、加密演算法:將原有的明文信息轉化為看似無規律的密文。收信方需要對應的解密密鑰,採用對應的解密方法將密文還原為明文(能看懂有意義的信息)。
二、密鑰分為加密密鑰和解密密鑰,對於「對稱加密演算法」,這兩者是一樣的;而「非對稱加密演算法」的密鑰分為「公開密鑰」和「私有密鑰」,用公開密鑰加密,則需要私有密鑰解密;反之用私有密鑰加密,則需要公開密鑰解密,是可以互換的。
三、現代的計算機加密演算法比較復雜,要弄懂是需要離散數學、高等代數等知識,不可能在這里講明白。
四、以「凱撒移位密碼」這種最古來的簡單密碼來講解什麼是加密演算法和密鑰:
4.1)「凱撒密碼」在《愷撒傳》中有記載,凱撒密碼是將每一個字母用字母表中的該字母後的第三個字母代替。盡管歷史記載的凱撒密碼只用了3個位置的移位,但顯然從1到25個位置的移位我們都可以使用, 因此,為了使密碼有更高的安全性,單字母替換密碼就出現了。
若用每個字母的後11位替換當前字母,可以認為密鑰=11。
如此得到的密碼表為:
明碼表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z(即26個字母表)
密碼表 L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
加密的方法很簡單,就是講明碼字母換成對應的密碼表字母。
如:明文 I LOVE YOU
密文 T WZGP JZF
在當時,這樣簡單的密碼就足夠起到保密作用;但到近代都已經很容易被破解了,更不用說現代有計算機秒破了!
4.2)其他加密演算法
有興趣可以了解更復雜的加密演算法:如近代的「維吉尼亞演算法」,還屬於字母位移加密,好懂!而現代計算機文件深度加密常用的「AES加密演算法」,原理很復雜,需要高等數學等知識才能讀懂。
G. 分組密碼加密模式選擇有哪些
分組密碼工作模式的應用背景:多次使用相同的密鑰對多個分組加密,會引發許多安全問題。為了應對不同場合,因而需要開發出不同的工作模式來增強密碼演算法的安全性。ECB特別適合數據較少的情況,對於很長的信息或者具有特定結構的信息,其大量重復的信息或固定的字元開頭將給密碼分析者提供大量的已知明密文對。若明文不是完整的分組,ECB需要進行填充。CBC(Cipher Block Chaining)由於加密演算法的每次輸入和本明文組沒有固定的關系,因此就算有重復的明文組,加密後也看不出來了。為了配合演算法的需要,有一個初始向量(IV)。與ECB一樣有填充機制以保證完整的分組。CFB(Cipher Feedback)和OFB,CTR模式一樣,均可將分組密碼當做流密碼(實際是將分組大小任意縮減)使用。
H. iv的初始向量(IV,Initialization Vector)
在有線等效保密(WEP)協議中,IV是用來和密鑰組合成密鑰種子,作為RC4演算法的輸入,來產念橘賀生加密位元組流對數據進行加密的。標準的64比特WEP使用40比特的鑰匙接上24比特的初向仔派量(Initialization Vector,IV) 成為伍碧 RC4 用的鑰匙。
I. iv和is是什麼意思
iv指初始向量。is是,be的第三人稱單數現在時形式,常放在其他詞後攜緩縮寫為』s。
is是be動詞的第三人稱單數現在時形式,它的意思為是,也可以作名詞,意思為存在明隱春。iv即初始向量,在有線等效保密(WEP)協議中,IV是用來和密鑰組合成密鑰種子,作為RC4算激耐法的輸入,來產生加密位元組流對數據進行加密的。
在醫學上,iv還是靜脈推注的意思。靜脈推注是用20或50毫升的注射器,將葯品推注到靜脈血管里的方法。
J. 數據加密和數據簽名的原理作用
加密可以幫助保護數據不被查看和修改,並且可以幫助在本不安全的信道上提供安全的通信方式。例如,可以使用加密演算法對數據進行加密,在加密狀態下傳輸數據,然後由預定的接收方對數據進行解密。如果第三方截獲了加密的數據,解密數據是很困難的。
在一個使用加密的典型場合中,雙方(小紅和小明)在不安全的信道上通信。小紅和小明想要確保任何可能正在偵聽的人無法理解他們之間的通信。而且,由於小紅和小明相距遙遠,因此小紅必須確保她從小明處收到的信息沒有在傳輸期間被任何人修改。此外,她必須確定信息確實是發自小明而不是有人模仿小明發出的。
加密用於達到以下目的:
保密性:幫助保護用戶的標識或數據不被讀取。
數據完整性:幫助保護數據不更改。
身份驗證:確保數據發自特定的一方。
為了達到這些目的,您可以使用演算法和慣例的組合(稱作加密基元)來創建加密方案。下表列出了加密基元及它們的用法。
加密基元 使用
私鑰加密(對稱加密) 對數據執行轉換,使第三方無法讀取該數據。此類型的加密使用單個共享的機密密鑰來加密和解密數據。
公鑰加密(不對稱加密) 對數據執行轉換,使第三方無法讀取該數據。此類加密使用公鑰/私鑰對來加密和解密數據。
加密簽名 通過創建對特定方唯一的數字簽名來幫助驗證數據是否發自特定方。此過程還使用哈希函數。
加密哈希 將數據從任意長度映射為定長位元組序列。哈希在統計上是唯一的;不同的雙位元組序列不會哈希為同一個值。
私鑰加密
私鑰加密演算法使用單個私鑰來加密和解密數據。由於具有密鑰的任意一方都可以使用該密鑰解密數據,因此必須保護密鑰不被未經授權的代理得到。私鑰加密又稱為對稱加密,因為同一密鑰既用於加密又用於解密。私鑰加密演算法非常快(與公鑰演算法相比),特別適用於對較大的數據流執行加密轉換。
通常,私鑰演算法(稱為塊密碼)用於一次加密一個數據塊。塊密碼(如 RC2、DES、TrippleDES 和 Rijndael)通過加密將 n 位元組的輸入塊轉換為加密位元組的輸出塊。如果要加密或解密位元組序列,必須逐塊進行。由於 n 很小(對於 RC2、DES 和 TripleDES,n = 8 位元組;n = 16 [默認值];n = 24;對於 Rijndael,n = 32),因此必須對大於 n 的值一次加密一個塊。
基類庫中提供的塊密碼類使用稱作密碼塊鏈 (CBC) 的鏈模式,它使用一個密鑰和一個初始化向量 (IV) 對數據執行加密轉換。對於給定的私鑰 k,一個不使用初始化向量的簡單塊密碼將把相同的明文輸入塊加密為同樣的密文輸出塊。如果在明文流中有重復的塊,那麼在密文流中將存在重復的塊。如果未經授權的用戶知道有關明文塊的結構的任何信息,就可以使用這些信息解密已知的密文塊並有可能發現您的密鑰。若要克服這個問題,可將上一個塊中的信息混合到加密下一個塊的過程中。這樣,兩個相同的明文塊的輸出就會不同。由於該技術使用上一個塊加密下一個塊,因此使用了一個 IV 來加密數據的第一個塊。使用該系統,未經授權的用戶有可能知道的公共消息標頭將無法用於對密鑰進行反向工程。
可以危及用此類型密碼加密的數據的一個方法是,對每個可能的密鑰執行窮舉搜索。根據用於執行加密的密鑰大小,即使使用最快的計算機執行這種搜索,也極其耗時,因此難以實施。使用較大的密鑰大小將使解密更加困難。雖然從理論上說加密不會使對手無法檢索加密的數據,但這確實極大增加了這樣做的成本。如果執行徹底搜索來檢索只在幾天內有意義的數據需要花費三個月的時間,那麼窮舉搜索的方法是不實用的。
私鑰加密的缺點是它假定雙方已就密鑰和 IV 達成協議,並且互相傳達了密鑰和 IV 的值。並且,密鑰必須對未經授權的用戶保密。由於存在這些問題,私鑰加密通常與公鑰加密一起使用,來秘密地傳達密鑰和 IV 的值。
假設小紅和小明是要在不安全的信道上進行通信的雙方,他們可能按以下方式使用私鑰加密。小紅和小明都同意使用一種具有特定密鑰和 IV 的特定演算法(如 Rijndael)。小紅撰寫一條消息並創建要在其上發送該消息的網路流。接下來,她使用該密鑰和 IV 加密該文本,並通過 Internet 發送該文本。她沒有將密鑰和 IV 發送給小明。小明收到該加密文本並使用預先商定的密鑰和 IV 對它進行解密。如果傳輸的內容被人截獲,截獲者將無法恢復原始消息,因為截獲者並不知道密鑰或 IV。在這個方案中,密鑰必須保密,但 IV 不需要保密。在一個實際方案中,將由小紅或小明生成私鑰並使用公鑰(不對稱)加密將私鑰(對稱)傳遞給對方。有關更多信息,請參見本主題後面的有關公鑰加密的部分。
.NET Framework 提供以下實現私鑰加密演算法的類:
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
公鑰加密
公鑰加密使用一個必須對未經授權的用戶保密的私鑰和一個可以對任何人公開的公鑰。公鑰和私鑰都在數學上相關聯;用公鑰加密的數據只能用私鑰解密,而用私鑰簽名的數據只能用公鑰驗證。公鑰可以提供給任何人;公鑰用於對要發送到私鑰持有者的數據進行加密。兩個密鑰對於通信會話都是唯一的。公鑰加密演算法也稱為不對稱演算法,原因是需要用一個密鑰加密數據而需要用另一個密鑰來解密數據。
公鑰加密演算法使用固定的緩沖區大小,而私鑰加密演算法使用長度可變的緩沖區。公鑰演算法無法像私鑰演算法那樣將數據鏈接起來成為流,原因是它只可以加密少量數據。因此,不對稱操作不使用與對稱操作相同的流模型。
雙方(小紅和小明)可以按照下列方式使用公鑰加密。首先,小紅生成一個公鑰/私鑰對。如果小明想要給小紅發送一條加密的消息,他將向她索要她的公鑰。小紅通過不安全的網路將她的公鑰發送給小明,小明接著使用該密鑰加密消息。(如果小明在不安全的信道如公共網路上收到小紅的密鑰,則小明必須同小紅驗證他具有她的公鑰的正確副本。)小明將加密的消息發送給小紅,而小紅使用她的私鑰解密該消息。
但是,在傳輸小紅的公鑰期間,未經授權的代理可能截獲該密鑰。而且,同一代理可能截獲來自小明的加密消息。但是,該代理無法用公鑰解密該消息。該消息只能用小紅的私鑰解密,而該私鑰沒有被傳輸。小紅不使用她的私鑰加密給小明的答復消息,原因是任何具有公鑰的人都可以解密該消息。如果小紅想要將消息發送回小明,她將向小明索要他的公鑰並使用該公鑰加密她的消息。然後,小明使用與他相關聯的私鑰來解密該消息。
在一個實際方案中,小紅和小明使用公鑰(不對稱)加密來傳輸私(對稱)鑰,而對他們的會話的其餘部分使用私鑰加密。
公鑰加密具有更大的密鑰空間(或密鑰的可能值范圍),因此不大容易受到對每個可能密鑰都進行嘗試的窮舉攻擊。由於不必保護公鑰,因此它易於分發。公鑰演算法可用於創建數字簽名以驗證數據發送方的身份。但是,公鑰演算法非常慢(與私鑰演算法相比),不適合用來加密大量數據。公鑰演算法僅對傳輸很少量的數據有用。公鑰加密通常用於加密一個私鑰演算法將要使用的密鑰和 IV。傳輸密鑰和 IV 後,會話的其餘部分將使用私鑰加密。
.NET Framework 提供以下實現公鑰加密演算法的類:
DSACryptoServiceProvider
RSACryptoServiceProvider
數字簽名
公鑰演算法還可用於構成數字簽名。數字簽名驗證發送方的身份(如果您信任發送方的公鑰)並幫助保護數據的完整性。使用由小紅生成的公鑰,小紅的數據的接收者可以通過將數字簽名與小紅的數據和小紅的公鑰進行比較來驗證是否是小紅發送了該數據。
為了使用公鑰加密對消息進行數字簽名,小紅首先將哈希演算法應用於該消息以創建消息摘要。該消息摘要是數據的緊湊且唯一的表示形式。然後,小紅用她的私鑰加密該消息摘要以創建她的個人簽名。在收到消息和簽名時,小明使用小紅的公鑰解密簽名以恢復消息摘要,並使用與小紅所使用的相同的哈希演算法來散列消息。如果小明計算的消息摘要與從小紅那裡收到的消息摘要完全一致,小明就可以確定該消息來自私鑰的持有人,並且數據未被修改過。如果小明相信小紅是私鑰的持有人,則他知道該消息來自小紅。
請注意,由於發送方的公鑰為大家所周知,並且它通常包含在數字簽名格式中,因此任何人都可以驗證簽名。此方法不保守消息的機密;若要使消息保密,還必須對消息進行加密。
.NET Framework 提供以下實現數字簽名演算法的類:
DSACryptoServiceProvider
RSACryptoServiceProvider
哈希值
哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的哈希計算都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。
消息身份驗證代碼 (MAC) 哈希函數通常與數字簽名一起用於對數據進行簽名,而消息檢測代碼 (MDC) 哈希函數則用於數據完整性。
雙方(小紅和小明)可按下面的方式使用哈希函數來確保數據的完整性。如果小紅對小明編寫一條消息並創建該消息的哈希,則小明可以在稍後散列該消息並將他的哈希與原始哈希進行比較。如果兩個哈希值相同,則該消息沒有被更改;如果值不相同,則該消息在小紅編寫它之後已被更改。為了使此系統發揮作用,小紅必須對除小明外的所有人保密原始的哈希值。
.NET Framework 提供以下實現數字簽名演算法的類:
HMACSHA1
MACTripleDES
MD5CryptoServiceProvider
SHA1Managed
SHA256Managed
SHA384Managed
SHA512Managed
隨機數生成
隨機數生成是許多加密操作不可分割的組成部分。例如,加密密鑰需要盡可能地隨機,以便使生成的密鑰很難再現。加密隨機數生成器必須生成無法以計算方法推算出(低於 p < .05 的概率)的輸出;即,任何推算下一個輸出位的方法不得比隨機猜測具有更高的成功概率。.NET Framework 中的類使用隨機數生成器生成加密密鑰。
RNGCryptoServiceProvider 類是隨機數生成器演算法的實現。