導航:首頁 > 源碼編譯 > 對稱密鑰加密演算法

對稱密鑰加密演算法

發布時間:2023-03-15 10:50:20

❶ 常見加密演算法原理及概念

在安全領域,利用密鑰加密演算法來對通信的過程進行加密是一種常見的安全手段。利用該手段能夠保障數據安全通信的三個目標:

而常見的密鑰加密演算法類型大體可以分為三類:對稱加密、非對稱加密、單向加密。下面我們來了解下相關的演算法原理及其常見的演算法。

對稱加密演算法採用單密鑰加密,在通信過程中,數據發送方將原始數據分割成固定大小的塊,經過密鑰和加密演算法逐個加密後,發送給接收方;接收方收到加密後的報文後,結合密鑰和解密演算法解密組合後得出原始數據。由於加解密演算法是公開的,因此在這過程中,密鑰的安全傳遞就成為了至關重要的事了。而密鑰通常來說是通過雙方協商,以物理的方式傳遞給對方,或者利用第三方平台傳遞給對方,一旦這過程出現了密鑰泄露,不懷好意的人就能結合相應的演算法攔截解密出其加密傳輸的內容。

對稱加密演算法擁有著演算法公開、計算量小、加密速度和效率高得特定,但是也有著密鑰單一、密鑰管理困難等缺點。

常見的對稱加密演算法有:
DES:分組式加密演算法,以64位為分組對數據加密,加解密使用同一個演算法。
3DES:三重數據加密演算法,對每個數據塊應用三次DES加密演算法。
AES:高級加密標准演算法,是美國聯邦政府採用的一種區塊加密標准,用於替代原先的DES,目前已被廣泛應用。
Blowfish:Blowfish演算法是一個64位分組及可變密鑰長度的對稱密鑰分組密碼演算法,可用來加密64比特長度的字元串。

非對稱加密演算法採用公鑰和私鑰兩種不同的密碼來進行加解密。公鑰和私鑰是成對存在,公鑰是從私鑰中提取產生公開給所有人的,如果使用公鑰對數據進行加密,那麼只有對應的私鑰才能解密,反之亦然。
下圖為簡單非對稱加密演算法的常見流程:

發送方Bob從接收方Alice獲取其對應的公鑰,並結合相應的非對稱演算法將明文加密後發送給Alice;Alice接收到加密的密文後,結合自己的私鑰和非對稱演算法解密得到明文。這種簡單的非對稱加密演算法的應用其安全性比對稱加密演算法來說要高,但是其不足之處在於無法確認公鑰的來源合法性以及數據的完整性。
非對稱加密演算法具有安全性高、演算法強度負復雜的優點,其缺點為加解密耗時長、速度慢,只適合對少量數據進行加密,其常見演算法包括:
RSA :RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,可用於加密,也能用於簽名。
DSA :數字簽名演算法,僅能用於簽名,不能用於加解密。
DSS :數字簽名標准,技能用於簽名,也可以用於加解密。
ELGamal :利用離散對數的原理對數據進行加解密或數據簽名,其速度是最慢的。

單向加密演算法常用於提取數據指紋,驗證數據的完整性。發送者將明文通過單向加密演算法加密生成定長的密文串,然後傳遞給接收方。接收方在收到加密的報文後進行解密,將解密獲取到的明文使用相同的單向加密演算法進行加密,得出加密後的密文串。隨後將之與發送者發送過來的密文串進行對比,若發送前和發送後的密文串相一致,則說明傳輸過程中數據沒有損壞;若不一致,說明傳輸過程中數據丟失了。單向加密演算法只能用於對數據的加密,無法被解密,其特點為定長輸出、雪崩效應。常見的演算法包括:MD5、sha1、sha224等等,其常見用途包括:數字摘要、數字簽名等等。

密鑰交換IKE(Internet Key Exchange)通常是指雙方通過交換密鑰來實現數據加密和解密,常見的密鑰交換方式有下面兩種:
1、公鑰加密,將公鑰加密後通過網路傳輸到對方進行解密,這種方式缺點在於具有很大的可能性被攔截破解,因此不常用;
2、Diffie-Hellman,DH演算法是一種密鑰交換演算法,其既不用於加密,也不產生數字簽名。DH演算法的巧妙在於需要安全通信的雙方可以用這個方法確定對稱密鑰。然後可以用這個密鑰進行加密和解密。但是注意,這個密鑰交換協議/演算法只能用於密鑰的交換,而不能進行消息的加密和解密。雙方確定要用的密鑰後,要使用其他對稱密鑰操作加密演算法實際加密和解密消息。DH演算法通過雙方共有的參數、私有參數和演算法信息來進行加密,然後雙方將計算後的結果進行交換,交換完成後再和屬於自己私有的參數進行特殊演算法,經過雙方計算後的結果是相同的,此結果即為密鑰。
如:

在整個過程中,第三方人員只能獲取p、g兩個值,AB雙方交換的是計算後的結果,因此這種方式是很安全的。

公鑰基礎設施是一個包括硬體、軟體、人員、策略和規程的集合,用於實現基於公鑰密碼機制的密鑰和證書的生成、管理、存儲、分發和撤銷的功能,其組成包括:簽證機構CA、注冊機構RA、證書吊銷列表CRL和證書存取庫CB。
PKI採用證書管理公鑰,通過第三方可信任CA中心,把用戶的公鑰和其他用戶信息組生成證書,用於驗證用戶的身份。
公鑰證書是以數字簽名的方式聲明,它將公鑰的值綁定到持有對應私鑰的個人、設備或服務身份。公鑰證書的生成遵循X.509協議的規定,其內容包括:證書名稱、證書版本、序列號、演算法標識、頒發者、有效期、有效起始日期、有效終止日期、公鑰 、證書簽名等等的內容。

CA證書認證的流程如下圖,Bob為了向Alice證明自己是Bob和某個公鑰是自己的,她便向一個Bob和Alice都信任的CA機構申請證書,Bob先自己生成了一對密鑰對(私鑰和公鑰),把自己的私鑰保存在自己電腦上,然後把公鑰給CA申請證書,CA接受申請於是給Bob頒發了一個數字證書,證書中包含了Bob的那個公鑰以及其它身份信息,當然,CA會計算這些信息的消息摘要並用自己的私鑰加密消息摘要(數字簽名)一並附在Bob的證書上,以此來證明這個證書就是CA自己頒發的。Alice得到Bob的證書後用CA的證書(自簽署的)中的公鑰來解密消息摘要,隨後將摘要和Bob的公鑰發送到CA伺服器上進行核對。CA在接收到Alice的核對請求後,會根據Alice提供的信息核對Bob的證書是否合法,如果確認合法則回復Alice證書合法。Alice收到CA的確認回復後,再去使用從證書中獲取的Bob的公鑰加密郵件然後發送給Bob,Bob接收後再以自己的私鑰進行解密。

❷ 對稱密鑰演算法與非對稱密鑰演算法有何區別

對稱密鑰演算法與非對稱密鑰演算法的區別
密碼學中兩種常見的密碼演算法為對稱密碼演算法(單鑰密碼演算法)和非對稱密碼演算法(公鑰密碼演算法)。

對稱密碼演算法有時又叫傳統密碼演算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱演算法中,加密解密密鑰是相同的。這些演算法也叫秘密密鑰演算法或單密鑰演算法,它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都能對消息進行加密解密。只要通信需要保密,密鑰就必須保密。對稱演算法的加密和解密表示為:

Ek(M)=C

Dk(C)=M

對稱演算法可分為兩類。一次只對明文中的單個位(有時對位元組)運算的演算法稱為序列演算法或序列密碼。另一類演算法是對明文的一組位進行運算,這些位組稱為分組,相應的演算法稱為分組演算法或分組密碼。現代計算機密碼演算法的典型分組長度為64位――這個長度大到足以防止分析破譯,但又小到足以方便作用。

這種演算法具有如下的特性:

Dk(Ek(M))=M

常用的採用對稱密碼術的加密方案有5個組成部分(如圖所示)

l)明文:原始信息。

2)加密演算法:以密鑰為參數,對明文進行多種置換和轉換的規則和步驟,變換結果為密文。

3)密鑰:加密與解密演算法的參數,直接影響對明文進行變換的結果。

4)密文:對明文進行變換的結果。

5)解密演算法:加密演算法的逆變換,以密文為輸入、密鑰為參數,變換結果為明文。

對稱密碼術的優點在於效率高(加/解密速度能達到數十兆/秒或更多),演算法簡單,系統開銷小,適合加密大量悔敬數據。

盡管對稱密碼術有一些很好的特性,但它也存在著明顯的缺陷,包括:

l)進行安全通信前需要以安全方式進行密鑰交換。這一步驟,在某種情況下是可行的,但在某些情況下會非常困難,甚至無法實現。

2)規模復雜。舉例來說,A與B兩人之間的密鑰必須不同於A和C兩人之間的密鑰,否則給B的消息的安全性就會受到威脅。在有1000個用戶的團體中,A需要保持至少999個密鑰(更確切的說是1000個,如果她需要留一個密鑰給他自己加密數據)。對於該團體中的其它用戶,此種倩況同樣存在。這樣,這個團體一共需要將近50萬個不同的密鑰!推而廣之,n個用戶的團體需要N2/2個不同的密鑰。

通過應用基於對稱密碼的中心服務結構,上述問題有所緩解。在這個體系中,團體中的任何一個用戶與中心伺服器(通常稱作密鑰分配中心)共享一個密鑰。因而,需要存儲的密鑰數量基本上和團體的人數差不多,而且中心伺服器也可以為以前互相不認識的用戶充當「介紹人」。但是,這個與安全密切相關的中心伺服器必須隨時都是在線的,因為只要伺服器一掉線,用戶間的通信將不可能進行。這就意味著中心伺服器是整個通信成敗的關鍵和受攻擊的焦點,也意味著它還是一個龐大組織通信服務的「瓶頸」斗前數

非對稱密鑰演算法是指一個加密演算法的加密密鑰和解密密鑰是不一樣的,或者說不能由其中一個密鑰推導出另一個密鑰。1、加解密時採用的密鑰空首的差異:從上述對對稱密鑰演算法和非對稱密鑰演算法的描述中可看出,對稱密鑰加解密使用的同一個密鑰,或者能從加密密鑰很容易推出解密密鑰;②對稱密鑰演算法具有加密處理簡單,加解密速度快,密鑰較短,發展歷史悠久等特點,非對稱密鑰演算法具有加解密速度慢的特點,密鑰尺寸大,發展歷史較短等特點。

❸ 1、對稱加密演算法

指加密和解密使用相同密鑰的加密演算法。對稱加密演算法用來對敏感數據等信息進頃弊指行加密,常用的演算法包括RC4、DES、3DES、AES、DESX、Blowfish、ChaCha20、RC5、RC6。前3種演算法被認為是不安全的,通常禁止使用。

國內:SM1、SM4、ZUC

國際:DES、3DES、AES

說明:SM1的128位保密強度和性能與AES相當,SM4的128位已升級為國際標准

塊密碼演算法:DES、3DES、AES

流密碼演算法:RC4

SM1:對稱加密演算法,加密強度為128位,採用硬體實現; 演算法不公開 ,只能通過相關安全產品進行使用。

SM4:對稱演算法,隨WAPI標准一起公布,可使用軟體實現,加密強度為128位。

SM4分組密碼演算法是我國自主設計的分組對稱密碼演算法,用於實現數據的加密/解密運算,以保證數據和信息的機密性。要保證一個對稱密碼演算法的安全性的基本條件是其具備足夠的密鑰長度,SM4演算法與AES演算法具有相同的密鑰長度分組長度128比特,因此在安全性上高於3DES演算法。

DES(Data Encryption Standard) :數據加密標准,速度較快,適用於加密 大量數據 的場合。

3DES(Triple DES) :是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。

AES(Advanced Encryption Standard) :高級加密標准,是下一代的加密演算法標准,速度快,安全級別高;

ECB(Electronic Codebook)、特點:運算快速,支持並行處理,需要填充、說明:不推薦使用

CBC (Cipher Block Chaining)、特點:支持並行處理,需要填充、說明:推薦使用

CFB(Cipher Feedback)、特點:支持並行處理,不需要填充、說明:不推薦使用

OFB(Output Feedback)、特點:迭代運算使用流密碼模式,不需要填充、說明:不推薦使用

CTR (Counter)、特點:迭代運算使用流密碼模式,支持並行處理,不需要填充、說明:推薦使用

XTS(XEX-based tweaked-codebook)、特點:不需要填充、說明:用於本地硬碟存儲解決方案中

填充標准:明文長度必須是分組長度的倍數,如雀配卜嘩不是倍數,則必須有填充機制

PKCS#7填充:可處理的分組長度是1到255個位元組

AES演算法使用標准,比如:AES-128-CBC-PKCS#7,其中秘鑰長度128,分組模式CBC,填充標准PKCS#7,AES演算法默認分組128bit

❹ 對稱加密演算法和非對稱加密演算法

常見的對稱加密演算法包括瑞士的國際數據加密演算法(International Data Encryption
Algorithm,IDEA)和美國的數據加密標准(Date Encryption Standard,DES)。
DES是一種迭代的分組密碼,明文和密文都是64位,使用一個56位的密鑰以及附加的8位奇偶校驗位。攻擊DES的主要技術是窮舉法,由於DES的密鑰長度較短,為了提高安全性,就出現了使用112位密鑰對數據進行三次加密的演算法(3DES),即用兩個56位的密鑰K1和K2,發送方用K1加密,K2解密,再使用K1加密;接收方則使用K1解密,K2加密,再使用K1解密,其效果相當於將密鑰長度加倍。
IDEA是在DES的基礎上發展起來的,類似於3DES。IDEA的明文和密文都是64位,密鑰長度為128位。

非對稱加密演算法也稱為公鑰加密演算法,是指加密密鑰和解密密鑰完全不同,其中一個為公鑰,另一個為私鑰,並且不可能從任何一個推導出另一個。它的優點在於可以適應開放性的使用環境,可以實現數字簽名與驗證。
最常見的非對稱加密演算法是RSA,該演算法的名字以發明者的名字命名:Ron Rivest,AdiShamir 和Leonard Adleman。RSA演算法的密鑰長度為512位。RSA演算法的保密性取決於數學上將一個大數分解為兩個素數的問題的難度,根據已有的數學方法,其計算量極大,破解很難。但是加密/解密時要進行大指數模運算,因此加密/解密速度很慢,主要用在數字簽名中。
用公鑰進行加密,用私鑰進行解密

❺ 對稱加密演算法的基本原理是什麼

對稱加密演算法是應用較早的加密演算法,技術成熟。

在對稱加密演算法中,其原理就是:數據發信方將明文(原始數據)和加密密鑰(mi yao)一起經過特殊加密演算法處理後,使其變成復雜的加密密文發送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的密鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。

在對稱加密演算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。

❻ 對稱加密演算法以及使用方法

加密的原因:保證數據安全

加密必備要素:1、明文/密文    2、秘鑰    3、演算法

秘鑰:在密碼學中是一個定長的字元串、需要根據加密演算法確定其長度

加密演算法解密演算法一般互逆、也可能相同

常用的兩種加密方式:

對稱加密:秘鑰:加密解密使用同一個密鑰、數據的機密性雙向保證、加密效率高、適合加密於大數據大文件、加密強度不高(相對於非對稱加密)

非對稱加密:秘鑰:加密解密使用的不同秘鑰、有兩個密鑰、需要使用密鑰生成演算法生成兩個秘鑰、數據的機密性只能單向加密、如果想解決這個問題、雙向都需要各自有一對秘鑰、加密效率低、加密強度高

                    公鑰:可以公開出來的密鑰、公鑰加密私鑰解密

                    私鑰:需要自己妥善保管、不能公開、私鑰加密公鑰解密

安全程度高:多次加密

按位異或運算

凱撒密碼:加密方式    通過將銘文所使用的字母表按照一定的字數平移來進行加密

mod:取余

加密三要素:明文/密文(字母)、秘鑰(3)、演算法(向右平移3/-3)

安全常識:不要使用自己研發的演算法、不要鑽牛角尖、沒必要研究底層實現、了解怎麼應用;低強度的密碼比不進行任何加密更危險;任何密碼都會被破解;密碼只是信息安全的一部分

保證數據的機密性、完整性、認證、不可否認性

計算機操作對象不是文字、而是由0或1排列而成的比特序列、程序存儲在磁碟是二進制的字元串、為比特序列、將現實的東西映射為比特序列的操作稱為編碼、加密又稱之為編碼、解密稱之為解碼、根據ASCII對照表找到對應的數字、轉換成二進制

三種對稱加密演算法:DES\3DES\ AES  

DES:已經被破解、除了用它來解密以前的明文、不再使用

密鑰長度為56bit/8、為7byte、每隔7個bit會設置一個用於錯誤檢查的比特、因此實際上是64bit

分組密碼(以組為單位進行處理):加密時是按照一個單位進行加密(8個位元組/64bit為一組)、每一組結合秘鑰通過加密演算法得到密文、加密後的長度不變

3DES:三重DES為了增加DES的強度、將DES重復三次所得到的一種加密演算法   密鑰長度24byte、分成三份  加密--解密--加密 目的:為了兼容DES、秘鑰1秘鑰2相同==三個秘鑰相同  ---加密一次        密鑰1秘鑰3相同--加密三次    三個密鑰不相同最好、此時解密相當於加密、中間的一次解密是為了有三個密鑰相同的情況

此時的解密操作與加密操作互逆,安全、效率低

數據先解密後加密可以么?可以、解密相當於加密、加密解密說的是演算法

AES:(首選推薦)底層演算法為Rijndael   分組長度為128bit、密鑰長度為128bit到256bit范圍內就可以   但是在AES中、密鑰長度只有128bit\192bit\256bit     在go提供的介面中、只能是16位元組(128bit)、其他語言中秘鑰可以選擇

目前為止最安全的、效率高

底層演算法

分組密碼的模式:

按位異或、對數據進行位運算、先將數據轉換成二進制、按位異或操作符^、相同為真、不同為假、非0為假    按位異或一次為加密操作、按位異或兩次為解密操作:a和b按位異或一次、結果再和b按位異或

ECB : 如果明文有規律、加密後的密文有規律不安全、go里不提供該介面、明文分組分成固定大小的塊、如果最後一個分組不滿足分組長度、則需要補位

CBC:密碼鏈

問題:如何對字元串進行按位異或?解決了ECB的規律可查缺點、但是他不能並行處理、最後一個明文分組也需要填充 、初始化向量長度與分組長度相同

CFB:密文反饋模式

不需要填充最後一個分組、對密文進行加密

OFB:

不需要對最後一組進行填充

CTR計數器:

不需要對最後一組進行填充、不需要初始化向量     

Go中的實現

官方文檔中:

在創建aes或者是des介面時都是調用如下的方法、返回的block為一個介面

func NewCipher(key [] byte ) ( cipher . Block , error )

type Block interface {

    // 返回加密位元組塊的大小

    BlockSize() int

    // 加密src的第一塊數據並寫入dst,src和dst可指向同一內存地址

    Encrypt(dst, src []byte)

    // 解密src的第一塊數據並寫入dst,src和dst可指向同一內存地址

    Decrypt(dst, src []byte)

}

Block介面代表一個使用特定密鑰的底層塊加/解密器。它提供了加密和解密獨立數據塊的能力。

Block的Encrypt/Decrypt也能進行加密、但是只能加密第一組、因為aes的密鑰長度為16、所以進行操作的第一組數據長度也是16

如果分組模式選擇的是cbc

func NewCBCEncrypter(b Block, iv []byte) BlockMode    加密

func NewCBCDecrypter(b Block, iv []byte) BlockMode    解密

加密解密都調用同一個方法CryptBlocks()

並且cbc分組模式都會遇到明文最後一個分組的補充、所以會用到加密位元組的大小

返回一個密碼分組鏈接模式的、底層用b加密的BlockMode介面,初始向量iv的長度必須等於b的塊尺寸。iv自己定義

返回的BlockMode同樣也是一個介面類型

type BlockMode interface {

    // 返回加密位元組塊的大小

    BlockSize() int

    // 加密或解密連續的數據塊,src的尺寸必須是塊大小的整數倍,src和dst可指向同一內存地址

    CryptBlocks(dst, src []byte)

}

BlockMode介面代表一個工作在塊模式(如CBC、ECB等)的加/解密器

返回的BlockMode其實是一個cbc的指針類型中的b和iv

# 加密流程: 

1. 創建一個底層使用des/3des/aes的密碼介面 "crypto/des" func NewCipher(key []byte) (cipher.Block, error) # -- des func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des "crypto/aes" func NewCipher(key []byte) (cipher.Block, error) # == aes 

2. 如果使用的是cbc/ecb分組模式需要對明文分組進行填充

3. 創建一個密碼分組模式的介面對象 - cbc func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密 - cfb func NewCFBEncrypter(block Block, iv []byte) Stream # 加密 - ofb - ctr

 4. 加密, 得到密文

流程:

填充明文:

先求出最後一組中的位元組數、創建新切片、長度為新切片、值也為切片的長度、然後利用bytes.Reapet將長度換成位元組切片、追加到原明文中

//明文補充

func padPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、求出需要填充的個數

    padNum := blockSize-len(plaintText) % blockSize

    //2、對填充的個數進行操作、與原明文進行合並

    newPadding := []byte{byte(padNum)}

    newPlain := bytes.Repeat(newPadding,padNum)

    plaintText = append(plaintText,newPlain...)

    return plaintText

}

去掉填充數據:

拿去切片中的最後一個位元組、得到尾部填充的位元組個數、截取返回

//解密後的明文曲調補充的地方

func createPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、得到最後一個位元組、並將位元組轉換成數字、去掉明文中此數字大小的位元組

    padNum := int(plaintText[len(plaintText)-1])

    newPadding := plaintText[:len(plaintText)-padNum]

    return newPadding

}

des加密:

1、創建一個底層使用des的密碼介面、參數為秘鑰、返回一個介面

2、對明文進行填充

3、創建一個cbc模式的介面、需要創建iv初始化向量、返回一個blockmode對象

4、加密、調用blockmode中的cryptBlock函數進行加密、參數為目標參數和源參數

//des利用分組模式cbc進行加密

func EncryptoText(plaintText []byte,key []byte)[]byte{

    //1、創建des對象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、對明文進行填充

    newText := padPlaintText(plaintText,cipherBlock.BlockSize())

    //3、選擇分組模式、其中向量的長度必須與分組長度相同

    iv := make([]byte,cipherBlock.BlockSize())

    blockMode := cipher.NewCBCEncrypter(cipherBlock,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

des解密:

1、創建一個底層使用des的密碼介面、參數為秘鑰、返回一個介面

2、創建一個cbc模式的介面、需要創建iv初始化向量,返回一個blockmode對象

3、加密、調用blockmode中的cryptBlock函數進行解密、參數為目標參數和源參數

4、調用去掉填充數據的方法

//des利用分組模式cbc進行解密

func DecryptoText(cipherText []byte, key []byte)[]byte{

    //1、創建des對象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、創建cbc分組模式介面

    iv := []byte("12345678")

    blockMode := cipher.NewCBCDecrypter(cipherBlock,iv)

    //3、解密

    blockMode.CryptBlocks(cipherText,cipherText)

    //4、將解密後的數據進行去除填充的數據

    newText := clearPlaintText(cipherText,cipherBlock.BlockSize())

    return newText

}

Main函數調用

func main(){

    //需要進行加密的明文

    plaintText := []byte("CBC--密文沒有規律、經常使用的加密方式,最後一個分組需要填充,需要初始化向量" +

        "(一個數組、數組的長度與明文分組相等、數據來源:負責加密的人提供,加解密使用的初始化向量必須相同)")

    //密鑰Key的長度需要與分組長度相同、且加密解密的密鑰相同

    key := []byte("1234abcd")

    //調用加密函數

    cipherText := EncryptoText(plaintText,key)

    newPlaintText := DecryptoText(cipherText,key)

    fmt.Println(string(newPlaintText))

}

AES加密解密相同、所以只需要調用一次方法就可以加密、調用兩次則解密

推薦是用分組模式:cbc、ctr

aes利用分組模式cbc進行加密

//對明文進行補充

func paddingPlaintText(plaintText []byte , blockSize int ) []byte {

    //1、求出分組余數

    padNum := blockSize - len(plaintText) % blockSize

    //2、將余數轉換為位元組切片、然後利用bytes.Repeat得出有該余數的大小的位元組切片

    padByte := bytes.Repeat([]byte{byte(padNum)},padNum)

    //3、將補充的位元組切片添加到原明文中

    plaintText = append(plaintText,padByte...)

    return plaintText

}

//aes加密

func encryptionText(plaintText []byte, key []byte) []byte {

    //1、創建aes對象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、明文補充

    newText := paddingPlaintText(plaintText,block.BlockSize())

    //3、創建cbc對象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCEncrypter(block,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

//解密後的去尾

func clearplaintText(plaintText []byte, blockSize int) []byte {

    //1、得到最後一個位元組、並轉換成整型數據

    padNum := int(plaintText[len(plaintText)-1])

    //2、截取明文位元組中去掉得到的整型數據之前的數據、此處出錯、沒有用len-padNum

    newText := plaintText[:len(plaintText)-padNum]

    return newText

}

//aes解密

func deCryptionText(crypherText []byte, key []byte ) []byte {

    //1、創建aes對象

    block, err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、創建cbc對象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCDecrypter(block,iv)

    //3、解密

    blockMode.CryptBlocks(crypherText,crypherText)

    //4、去尾

    newText := clearplaintText(crypherText,block.BlockSize())

    return newText

}

func main(){

    //需要進行加密的明文

    plaintText := []byte("CBC--密文沒有規律、經常使用的加密方式,最後一個分組需要填充,需要初始化向量")

    //密鑰Key的長度需要與分組長度相同、且加密解密的密鑰相同

    key := []byte("12345678abcdefgh")

    //調用加密函數

    cipherText := encryptionText(plaintText,key)

    //調用解密函數

    newPlaintText := deCryptionText(cipherText,key)

    fmt.Println("解密後",string(newPlaintText))

}

//aes--ctr加密

func encryptionCtrText(plaintText []byte, key []byte) []byte {

    //1、創建aes對象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、創建ctr對象,雖然ctr模式不需要iv,但是go中使用ctr時還是需要iv

    iv := []byte("12345678abcdefgh")

    stream := cipher.NewCTR(block,iv)

    stream.XORKeyStream(plaintText,plaintText)

    return plaintText

}

func main() {

//aes--ctr加密解密、調用兩次即為解密、因為加密解密函數相同stream.XORKeyStream

    ctrcipherText := encryptionCtrText(plaintText, key)

    ctrPlaintText := encryptionCtrText(ctrcipherText,key)

    fmt.Println("aes解密後", string(ctrPlaintText))

}

英文單詞:

明文:plaintext     密文:ciphertext   填充:padding/fill    去掉clear  加密Encryption  解密Decryption

❼ 哪些是對稱加密演算法

對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密演算法。有時又叫傳統密碼演算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。
主要有DES演算法,3DES演算法,TDEA演算法,Blowfish演算法,RC5演算法,IDEA演算法。

❽ 對稱加密演算法的加密演算法主要有哪些

1、3DES演算法

3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,M代表明文,C代表密文,這樣:

3DES加密過程為:C=Ek3(Dk2(Ek1(M)))

3DES解密過程為:M=Dk1(EK2(Dk3(C)))

2、Blowfish演算法

BlowFish演算法用來加密64Bit長度的字元串。

BlowFish演算法使用兩個「盒」——unsignedlongpbox[18]和unsignedlongsbox[4,256]。

BlowFish演算法中,有一個核心加密函數:BF_En(後文詳細介紹)。該函數輸入64位信息,運算後,以64位密文的形式輸出。用BlowFish演算法加密信息,需要兩個過程:密鑰預處理和信息加密。

分別說明如下:

密鑰預處理:

BlowFish演算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化演算法如下:

1)用sbox填充key_sbox

2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。

比如說:選的key是"abcdefghijklmn"。則異或過程為:

key_pbox[0]=pbox[0]abcdefgh;

key_pbox[1]=pbox[1]ijklmnab;

…………

…………

如此循環,直到key_pbox填充完畢。

3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1],i=0;

4)用BF_En加密替換後的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3];

5)i+2,繼續第4步,直到key_pbox全部被替換;

6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。

信息加密就是用函數把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換。

3、RC5演算法

RC5是種比較新的演算法,Rivest設計了RC5的一種特殊的實現方式,因此RC5演算法有一個面向字的結構:RC5-w/r/b,這里w是字長其值可以是16、32或64對於不同的字長明文和密文塊的分組長度為2w位,r是加密輪數,b是密鑰位元組長度。

(8)對稱密鑰加密演算法擴展閱讀:

普遍而言,有3個獨立密鑰的3DES(密鑰選項1)的密鑰長度為168位(三個56位的DES密鑰),但由於中途相遇攻擊,它的有效安全性僅為112位。密鑰選項2將密鑰長度縮短到了112位,但該選項對特定的選擇明文攻擊和已知明文攻擊的強度較弱,因此NIST認定它只有80位的安全性。

對密鑰選項1的已知最佳攻擊需要約2組已知明文,2部,2次DES加密以及2位內存(該論文提到了時間和內存的其它分配方案)。

這在現在是不現實的,因此NIST認為密鑰選項1可以使用到2030年。若攻擊者試圖在一些可能的(而不是全部的)密鑰中找到正確的,有一種在內存效率上較高的攻擊方法可以用每個密鑰對應的少數選擇明文和約2次加密操作找到2個目標密鑰中的一個。

❾ 快速了解常用的對稱加密演算法,再也不用擔心面試官的刨根問底

加密演算法通常被分為兩種: 對稱加密 非對稱加密 。其中,對稱加密演算法在加密和解密時使用的密鑰相同;非對稱加密演算法在加密和解密時使用的密鑰不同,分為公鑰和私鑰。此外,還有一類叫做 消息摘要演算法 ,是對數據進行摘要並且不可逆的演算法。

這次我們了解一下對稱加密演算法。

對稱加密演算法在加密和解密時使用的密鑰相同,或是使用兩個可以簡單地相互推算的密鑰。在大多數的對稱加密演算法中,加密和解密的密鑰是相同的。

它要求雙方在安全通信之前,商定一個密鑰。對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都可以對他們發送的信息進行解密,這也是對稱加密演算法的主要缺點之一。

常見的對稱加密演算法有:DES演算法、3DES演算法、AES演算法。

DES演算法(Data Encryption Standard)是一種常見的分組加密演算法。

分組加密演算法是將明文分成固定長度的組,每一組都採用同一密鑰和演算法進行加密,輸出也是固定長度的密文。

由IBM公司在1972年研製,1976年被美國聯邦政府的國家標准局確定為聯邦資料處理標准(FIPS),隨後在國際上廣泛流傳開來。

在DES演算法中,密鑰固定長度為64位。明文按64位進行分組,分組後的明文組和密鑰按位置換或交換的方法形成密文組,然後再把密文組拼裝成密文。

密鑰的每個第八位設置為奇偶校驗位,也就是第8、16、24、32、40、48、56、64位,所以密鑰的實際參與加密的長度為56位。

我們用Java寫個例子:

運行結果如下:

DES現在已經不是一種安全的加密方法,主要因為它使用的密鑰過短,很容易被暴力破解。

3DES演算法(Triple Data Encryption Algorithm)是DES演算法的升級版本,相當於是對明文進行了三次DES加密。

由於計算機運算能力的增強,DES演算法由於密鑰長度過低容易被暴力破解;3DES演算法提供了一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

在DES演算法中,密鑰固定長度為192位。在加密和解密時,密鑰會被分為3個64位的密鑰。

加密過程如下:

解密過程如下:

我們用Java寫個例子:

運行結果如下:

雖然3DES演算法在安全性上有所提升,但是因為使用了3次DES演算法,加密和解密速度比較慢。

AES(Advanced Encryption Standard,高級加密標准)主要是為了取代DES加密演算法的,雖然出現了3DES的加密方法,但由於它的加密時間是DES演算法的3倍多,密鑰位數還是不能滿足對安全性的要求。

1997年1月2號,美國國家標准與技術研究院(NIST)宣布希望徵集高級加密標准,用以取代DES。全世界很多密碼工作者都提交了自己設計的演算法。經過甄選流程,高級加密標准由美國國家標准與技術研究院於2001年11月26日發布於FIPS PUB 197,並在2002年5月26日成為有效的標准。

該演算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以 Rijndael 為名投稿高級加密標準的甄選流程。

AES演算法的密鑰長度是固定,密鑰的長度可以使用128位、192位或256位。

AES演算法也是一種分組加密演算法,其分組長度只能是128位。分組後的明文組和密鑰使用幾種不同的方法來執行排列和置換運算形成密文組,然後再把密文組拼裝成密文。

我們用Java寫個例子:

運行結果如下:

AES演算法是目前應用最廣泛的對稱加密演算法。

對稱加密演算法在加密和解密時使用的密鑰相同,常見的對稱加密演算法有:DES演算法、3DES演算法、AES演算法。
由於安全性低、加密解密效率低,DES演算法和3DES演算法是不推薦使用的,AES演算法是目前應用最廣泛的對稱加密演算法。

❿ 屬於對稱加密演算法的有哪些

主要有DES演算法,3DES演算法,TDEA演算法,Blowfish演算法,RC5演算法,IDEA演算法。

對稱加密演算法的特點是演算法公開、計算量小、加密速度快、加密效率高。優點在於加解密的高速度和使用長密鑰時的難破解性,缺點是交易雙方都使用同樣鑰匙,安全性得不到保證。

對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。



(10)對稱密鑰加密演算法擴展閱讀

常見的加密演算法

DES演算法是密碼體制中的對稱密碼體制,把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位。

3DES是基於DES的對稱演算法,對一塊數據用三個不同的密鑰進行三次加密,強度更高。

RC2和RC4是對稱演算法,用變長密鑰對大量數據進行加密,比DES快。

IDEA演算法是在DES演算法的基礎上發展出來的,是作為迭代的分組密碼實現的,使用128位的密鑰和8個循環。

RSA是由RSA公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的,非對稱演算法。

DSA,即數字簽名演算法,是一種標準的 DSS(數字簽名標准),嚴格來說不算加密演算法。

AES是高級加密標准對稱演算法,是下一代的加密演算法標准,速度快,安全級別高,在21世紀AES 標準的一個實現是 Rijndael演算法。

Blowfish演算法是一個64位分組及可變密鑰長度的對稱密鑰分組密碼演算法,可用來加密64比特長度的字元串。

閱讀全文

與對稱密鑰加密演算法相關的資料

熱點內容
php如何解析xml文件 瀏覽:700
如何改變appstore的語言 瀏覽:460
javahtmlxml 瀏覽:28
單片機啟動文件 瀏覽:811
橙app如何開啟聊天 瀏覽:899
訪問伺服器公網地址 瀏覽:666
pdf列印底色去掉 瀏覽:463
java快遞介面 瀏覽:397
哪個app可以教新爸爸 瀏覽:210
如何查看伺服器系統版本信息 瀏覽:524
成都市土地出讓金演算法 瀏覽:703
鋼筋加密標記 瀏覽:578
ps中擴展功能在文件夾的什麼位置 瀏覽:905
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:692
電子和伺服器是什麼意思 瀏覽:692
phpurl中文亂碼問題 瀏覽:894
程序員那麼可愛大結局陸漓產子 瀏覽:539
java如何從雲伺服器讀取本地文件 瀏覽:924