1、對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密演算法。有時又叫傳統密碼演算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數的對稱演算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密演算法為秘密密鑰演算法或單密鑰演算法。它要求發送方和接收方在安全通信之前,商定一個密鑰。對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。
2、對稱加密演算法的特點是演算法公開、計算量小、加密速度快、加密效率高。
Ⅱ 簡述對稱加密演算法的基本原理
對稱加密是計算機加密領域最古老也是最經典的加密標准。雖然對稱加密被認為不再是安全的加密方式,但是直到現在,還看不到它被淘汰的跡象。在很多非網路化的加密環境中,對稱加密足以滿足人們的需要。
對稱加密採用單密鑰加密方式,不論是加密還是解密都是用同一個密鑰,即「一把鑰匙開一把鎖」。對稱加密的好處在於操作簡單、管理方便、速度快。它的缺點在於密鑰在網路傳輸中容易被竊聽,每個密鑰只能應用一次,對密鑰管理造成了困難。對稱加密的實現形式和加密演算法的公開性使它依賴於密鑰的安全性,而不是演算法的安全性。
一個對稱加密系統由五個部分組成,可以表述為
S={M,C,K,E,D}
各字母的含義如下:
M:明文空間,所有明文的集合。
C:密文空間,全體密文的集合。
K:密鑰空間,全體密鑰的集合。
E:加密演算法。
D:解密演算法。
Ⅲ 對稱加密和非對稱加密的 優缺點
密碼學中兩種常見的密碼演算法為對稱密碼演算法(單鑰密碼演算法)和非對稱密碼演算法(公鑰密碼演算法)。
對稱密碼演算法有時又叫傳統密碼演算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱演算法中,加密解密密鑰是相同的。這些演算法也叫秘密密鑰演算法或單密鑰演算法,它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱演算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都能對消息進行加密解密。只要通信需要保密,密鑰就必須保密。對稱演算法的加密和解密表示為:
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、明文/密文 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
Ⅳ 對稱演算法的原理
對稱演算法的加密和解密表示為:
Ek(M)=C
Dk(C)=M
對稱演算法可分為兩類。一次只對明文中的單個位(有時對位元組)運算的演算法稱為序列演算法或序列密碼。另一類演算法是對明文的一組位進行運算,這些位組稱為分組,相應的演算法稱為分組演算法或分組密碼。現代計算機密碼演算法的典型分組長度為64位――這個長度大到足以防止分析破譯,但又小到足以方便作用。
這種演算法具有如下的特性:
Dk(Ek(M))=M
常用的採用對稱密碼術的加密方案有5個組成部分(如圖所示)
l)明文:原始信息。
2)加密演算法:以密鑰為參數,對明文進行多種置換和轉換的規則和步驟,變換結果為密文。
3)密鑰:加密與解密演算法的參數,直接影響對明文進行變換的結果。
4)密文:對明文進行變換的結果。
5)解密演算法:加密演算法的逆變換,以密文為輸入、密鑰為參數,變換結果為明文。
Ⅵ 對稱加密技術包括哪些
熱心網友
對稱加密演算法用來對敏感數據等信息進行加密,常用的演算法包括:
DES(Data Encryption Standard):數據加密標准,速度較快,適用於加密大量數據的場合。
3DES(Triple DES):是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。
AES(Advanced Encryption Standard):高級加密標准,是下一代的加密演算法標准,速度快,安全級別高;
Ⅶ 對稱加密、非對稱加密、數字簽名
通信雙方使用同一個密鑰,不同演算法工作。數據發送方使用密鑰和加密演算法對數據進行加密,數據接收方使用密鑰和解密演算法對密文進行解密,還原數據。
基本模型如下圖所示。
通信雙方使用不同的密鑰,相同的演算法工作。數據發送方持有公鑰,數據接收方持有私鑰。公鑰由數據接收方通過網路發送給數據發送方。數據發送方通過加密演算法和公鑰對數據進行加密,數據接收方通過加密演算法和私鑰對密文進行解密,還原數據。
基本模型如下圖所示。
數字簽名是安卓 APK 校驗安裝包是否被篡改、損壞的有效手段。數字簽名採用了非對稱加密 + Hash 兩種技術。具體原理參見下圖,主要是以下幾步。
Ⅷ 密碼體制包含哪些要素分別表示什麼含義
1)M可能明文的有限集,稱為明文空間。
2)C可能密文的有限集,稱為密文空間。
3)K一切可能密鑰的有限集,稱為密鑰空間。
4)E加密函數
5)D解密函數