導航:首頁 > 文檔加密 > 對稱加密中大小寫有區別嗎

對稱加密中大小寫有區別嗎

發布時間:2024-06-11 04:58:13

『壹』 對稱加密演算法和非對稱加密演算法的區別是什麼

(一)對稱加密(Symmetric Cryptography)
對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),這種方法在密碼學中叫做對稱加密演算法。對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
對稱加密通常使用的是相對較小的密鑰,一般小於256 bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個密鑰,那黑客們可以先試著用0來解密,不行的話就再用1解;但如果你的密鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個trade-off。
2000年10月2日,美國國家標准與技術研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael演算法作為新的高級加密標准(AES--Advanced Encryption Standard)。.NET中包含了Rijndael演算法,類名叫RijndaelManaged,下面舉個例子。
加密過程:

private string myData = "hello";
private string myPassword = "OpenSesame";
private byte[] cipherText;
private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };

private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Encrypt the data.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);
using (var sourceStream = new MemoryStream(sourceBytes))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
cipherText = destinationStream.ToArray();
}
MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));
}
private void moveBytes(Stream source, Stream dest)
{
byte[] bytes = new byte[2048];
var count = source.Read(bytes, 0, bytes.Length);
while (0 != count)
{
dest.Write(bytes, 0, count);
count = source.Read(bytes, 0, bytes.Length);
}
}

解密過程:

private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if (cipherText == null)
{
MessageBox.Show("Encrypt Data First!");
return;
}
var key = new Rfc2898DeriveBytes(myPassword, salt);
// Try to decrypt, thus showing it can be round-tripped.
var algorithm = new RijndaelManaged();
algorithm.Key = key.GetBytes(16);
algorithm.IV = key.GetBytes(16);
using (var sourceStream = new MemoryStream(cipherText))
using (var destinationStream = new MemoryStream())
using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))
{
moveBytes(crypto, destinationStream);
var decryptedBytes = destinationStream.ToArray();
var decryptedMessage = new UnicodeEncoding().GetString(
decryptedBytes);
MessageBox.Show(decryptedMessage);
}
}

對稱加密的一大缺點是密鑰的管理與分配,換句話說,如何把密鑰發送到需要解密你的消息的人的手裡是一個問題。在發送密鑰的過程中,密鑰有很大的風險會被黑客們攔截。現實中通常的做法是將對稱加密的密鑰進行非對稱加密,然後傳送給需要它的人。

(二)非對稱加密(Asymmetric Cryptography)
1976年,美國學者Dime和Henman為解決信息公開傳送和密鑰管理問題,提出一種新的密鑰交換協議,允許在不安全的媒體上的通訊雙方交換信息,安全地達成一致的密鑰,這就是「公開密鑰系統」。相對於「對稱加密演算法」這種方法也叫做「非對稱加密演算法」。
非對稱加密為數據的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那麼只有私鑰的持有人--銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要將私鑰通過網路發送出去,因此安全性大大提高。
目前最常用的非對稱加密演算法是RSA演算法,是Rivest, Shamir, 和Adleman於1978年發明,他們那時都是在MIT。.NET中也有RSA演算法,請看下面的例子:
加密過程:

private byte[] rsaCipherText;
private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e)
{
var rsa = 1;
// Encrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var sourceBytes = new UnicodeEncoding().GetBytes(myData);
rsaCipherText = algorithm.Encrypt(sourceBytes, true);
MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}",
myData, Environment.NewLine,
Convert.ToBase64String(rsaCipherText)));
}

解密過程:

private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e)
{
if(rsaCipherText==null)
{
MessageBox.Show("Encrypt First!");
return;
}
var rsa = 1;
// decrypt the data.
var cspParms = new CspParameters(rsa);
cspParms.Flags = CspProviderFlags.UseMachineKeyStore;
cspParms.KeyContainerName = "My Keys";
var algorithm = new RSACryptoServiceProvider(cspParms);
var unencrypted = algorithm.Decrypt(rsaCipherText, true);
MessageBox.Show(new UnicodeEncoding().GetString(unencrypted));
}

雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。為了解釋這個過程,請看下面的例子:
(1) Alice需要在銀行的網站做一筆交易,她的瀏覽器首先生成了一個隨機數作為對稱密鑰。
(2) Alice的瀏覽器向銀行的網站請求公鑰。
(3) 銀行將公鑰發送給Alice。
(4) Alice的瀏覽器使用銀行的公鑰將自己的對稱密鑰加密。
(5) Alice的瀏覽器將加密後的對稱密鑰發送給銀行。
(6) 銀行使用私鑰解密得到Alice瀏覽器的對稱密鑰。
(7) Alice與銀行可以使用對稱密鑰來對溝通的內容進行加密與解密了。

(三)總結
(1) 對稱加密加密與解密使用的是同樣的密鑰,所以速度快,但由於需要將密鑰在網路傳輸,所以安全性不高。
(2) 非對稱加密使用了一對密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然後發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然後雙方可以使用對稱加密來進行溝通。
電腦上可以試一下超級加密3000.具有文件加密、文件夾加密、數據粉碎、徹底隱藏硬碟分區、禁止或只讀使用USB存儲設備等功能。加密速度塊!並且還有防復制防移動防刪除的功能。每次使用加密文件夾或加密文件後不用再重新加密。而且使用也非常方便,安裝軟體後直接對需要加密的文件夾右擊,選擇超級加密或文件夾保護就可以了。

『貳』 對稱加密演算法以及使用方法

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

加密必備要素: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

『叄』 科普知識—對稱加密和非對稱加密

區塊鏈技術中廣泛應用到非對稱加密技術,非對稱加密技術保證了信息在傳輸過程中的安全性,非對稱加密技術是在對稱加密技術上發展來的。本文主要闡述對稱加密技術和非對稱加密技術的概念和特點,並舉例說明。

對稱加密就是用相同的密鑰對原文進行加密和解密,通信雙方共用一個密鑰。

基於對稱加密演算法傳輸信息「ABC」的步驟。

(1)發送方通過密鑰對原文"ABC"進行加密,得到密文"abc",並發送給接收方。密鑰為將字母轉換為對應的小寫字母,大寫A轉換為小寫a,「BC」同理轉換為「bc」。

(2)發送方將密鑰發送給接收方。

(3)接收方通過密鑰對密文進行解密,反推出原文「ABC」。

對稱加密演算法的缺點:無法確保密鑰被安全傳遞。

密鑰就是傳說中的「密碼本」。密文在傳輸過程中是可能被第三方截獲的,關鍵就落在「密碼本」上,如果密碼本也被第三方截獲,則傳輸的密碼信息將被第三方破獲,所以經常看到電影、電視劇的情節中通過各種手段保護密碼本的安全送達。

非對稱加密技術很好的解決了對稱加密技術密鑰無法安全傳遞的問題。

非對稱加密有兩個密鑰,即公鑰(Public Key)和私鑰(Private Key),對數據進行加密和解密使用不同的密鑰。使用公鑰進行加密,使用私鑰進行解密。

非對稱加密演算法中私鑰就是一個隨機數,基於不同的演算法生成不同的隨機數,如:SHA256演算法生成的是256位的隨機數,通常是調用操作系統的隨機數生成器來生成私鑰,私鑰通過一定的加密演算法推導出公鑰,私鑰到公鑰的推導過程是單向的,也就是說公鑰無法反推導出私鑰。

基於非對稱加密演算法傳輸信息「hello world」的步驟。

(1)發送方使用接收方的公鑰對待發送信息「hello world」加密,此處需注意:信息發送給誰,使用誰的公鑰進行加密,公鑰是可以公開的,類似於銀行卡賬戶。

(2)發送方將加密後的密文通過網路發送給接收方。

(3)接收方接收到密文後,使用自己的私鑰對密文進行解密,從而獲得傳輸信息「hello world」。

採用非對稱加密演算法即使第三方在網路上截獲到密文,但其無法獲得接收方的私鑰,也就無法對密文進行解密,作為接收方務必保證自己私鑰的安全,所以非對稱加密技術解決了密鑰傳輸過程的安全性問題。

本文主要闡述對稱加密技術和非對稱加密技術的概念和特點,並舉例說明。對稱加密是通信雙方共用密鑰,無法保證密鑰的安全傳遞;非對稱加密使用接收方的公鑰對數據加密,接收方使用自己的私鑰解密,即使信息被第三方截獲,由於沒有接收方的私鑰,也無法破解密文。

『肆』 簡要說說對稱加密和非對稱加密的原理以及區別是什麼

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

非對稱加密的原理是甲方首先生成一對密鑰同時將其中的一把作為公開密鑰;得到公開密鑰的乙方再使用該密鑰對需要加密的信息進行加密後再發送給甲方;甲方再使用哪鍵另一把對應的私有密鑰對加密後的信息進行解密,這樣就實現了機密數據傳輸。

對稱加密和非對稱加密的區別為:密鑰不同、安全性不同、數字簽名不同。

一、密鑰不同

1、對稱加密:對稱加密加密和解密使用同一個密鑰。

2、非對稱加密:非對稱加密加密和解密所使用的不是同一個密鑰,需要兩個密鑰來進行加密和解密。

二、安全性不同

1、對基緩銷稱加密:對稱加密如果用於通過網路傳輸加密文件,那麼不管使用任何方法將密鑰告訴對方,都有可能被竊聽。

2、非對稱加密:非對稱加密因為它包含有兩個密鑰,且僅有其中的「公鑰」是可以被公開的,接收方只需要使用自己已持有的私鑰進行解密,這樣就可以很好的避免密鑰在傳輸過程中產生的安全問題。

三搏游、數字簽名不同

1、對稱加密:對稱加密不可以用於數字簽名和數字鑒別。

2、非對稱加密:非對稱加密可以用於數字簽名和數字鑒別。

『伍』 對稱密碼體制的內容和典型演算法

內容:在對稱加密系統中,加密和解密採用相同的密鑰。因為加解密密鑰相同,需要通信的雙方必須選擇和保存他們共同的密鑰,各方必須信任對方不會將密鑰泄密出去,這樣就可以實現數據的機密性和完整性。

演算法:DES(Data Encryption Standard數據加密標准)演算法及其變形Triple DES(三重DES),GDES(廣義DES);歐洲的IDEA;日本的FEAL N、RC5等。

Triple DES使用兩個獨立的56bit密鑰對交換的信息進行3次加密,從而使其有效長度達到112bit。RC2和RC4方法是RSA數據安全公司的對稱加密專利演算法,它們採用可變密鑰長度的演算法。通過規定不同的密鑰長度,,C2和RC4能夠提高或降低安全的程度。

(5)對稱加密中大小寫有區別嗎擴展閱讀:

密碼體制的基本模式:

通常的密碼體制採用移位法、代替法和代數方法來進行加密和解密的變換,可以採用一種或幾種方法結合的方式作為數據變換的基本模式,下面舉例說明:

移位法也叫置換法。移位法把明文中的字元重新排列,字元本身不變但其位置改變了。

例如最簡單的例子:把文中的字母和字元倒過來寫。

或將密文以固定長度來發送

5791ECNI SYLDIPAT DEVLOBES AHYTIRUC ESATAD**。

『陸』 密碼學基礎(二):對稱加密

加密和解密使用相同的秘鑰稱為對稱加密。

DES:已經淘汰
3DES:相對於DES有所加強,但是仍然存在較大風險
AES:全新的對稱加密演算法。

特點決定使用場景,對稱加密擁有如下特點:

速度快,可用於頻率很高的加密場景。

使用同一個秘鑰進行加密和解密。

可選按照128、192、256位為一組的加密方式,加密後的輸出值為所選分組位數的倍數。密鑰的長度不同,推薦加密輪數也不同,加密強度也更強。

例如:
AES加密結果的長度由原字元串長度決定:一個字元為1byte=4bit,一個字元串為n+1byte,因為最後一位為'',所以當字元串長度小於等於15時,AES128得到的16進制結果為32位,也就是32 4=128byte,當長度超過15時,就是64位為128 2byte。

因為對稱加密速度快的特點,對稱加密被廣泛運用在各種加密場所中。但是因為其需要傳遞秘鑰,一旦秘鑰被截獲或者泄露,其加密就會玩完全破解,所以AES一般和RSA一起使用。

因為RSA不用傳遞秘鑰,加密速度慢,所以一般使用RSA加密AES中鎖使用的秘鑰後,再傳遞秘鑰,保證秘鑰的安全。秘鑰安全傳遞成功後,一直使用AES對會話中的信息進行加密,以此來解決AES和RSA的缺點並完美發揮兩者的優點,其中相對經典的例子就是HTTPS加密,後文會專門研究。

本文針對ECB模式下的AES演算法進行大概講解,針對每一步的詳細演算法不再該文討論范圍內。

128位的明文被分成16個位元組的明文矩陣,然後將明文矩陣轉化成狀態矩陣,以「abcdefghijklmnop」的明文為例:

同樣的,128位密鑰被分成16組的狀態矩陣。與明文不同的是,密文會以列為單位,生成最初的4x8x4=128的秘鑰,也就是一個組中有4個元素,每個元素由每列中的4個秘鑰疊加而成,其中矩陣中的每個秘鑰為1個位元組也就是8位。

生成初始的w[0]、w[1]、w[2]、w[3]原始密鑰之後,通過密鑰編排函數,該密鑰矩陣被擴展成一個44個組成的序列W[0],W[1], … ,W[43]。該序列的前4個元素W[0],W[1],W[2],W[3]是原始密鑰,用於加密運算中的初始密鑰加,後面40個字分為10組,每組4個32位的欄位組成,總共為128位,分別用於10輪加密運算中的輪密鑰加密,如下圖所示:

之所以把這一步單獨提出來,是因為ECB和CBC模式中主要的區別就在這一步。

ECB模式中,初始秘鑰擴展後生成秘鑰組後(w0-w43),明文根據當前輪數取出w[i,i+3]進行加密操作。

CBC模式中,則使用前一輪的密文(明文加密之後的值)和當前的明文進行異或操作之後再進行加密操作。如圖所示:

根據不同位數分組,官方推薦的加密輪數:

輪操作加密的第1輪到第9輪的輪函數一樣,包括4個操作:位元組代換、行位移、列混合和輪密鑰加。最後一輪迭代不執行列混合。

當第一組加密完成時,後面的組循環進行加密操作知道所有的組都完成加密操作。

一般會將結果轉化成base64位,此時在iOS中應該使用base64編碼的方式進行解碼操作,而不是UTF-8。

base64是一種編碼方式,常用語傳輸8bit位元組碼。其編碼原理如下所示:

將原數據按照3個位元組取為一組,即為3x8=24位

將3x8=24的數據分為4x6=24的數據,也就是分為了4組

將4個組中的數據分別在高位補上2個0,也就成了8x4=32,所以原數據增大了三分之一。

根據base64編碼表對數據進行轉換,如果要編碼的二進制數據不是3的倍數,最後會剩下1個或2個位元組怎麼辦,Base64用x00位元組在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少位元組,解碼的時候,會自動去掉。

舉個栗子:Man最後的結果就是TWFu。

計算機中所有的數據都是以0和1的二進制來存儲,而所有的文字都是通過ascii表轉化而來進而顯示成對應的語言。但是ascii表中存在許多不可見字元,這些不可見字元在數據傳輸時,有可能經過不同硬體上各種類型的路由,在轉義時容易發生錯誤,所以規定了64個可見字元(a-z、A-Z、0-9、+、/),通過base64轉碼之後,所有的二進制數據都是可見的。

ECB和CBC是兩種加密工作模式。其相同點都是在開始輪加密之前,將明文和密文按照128/192/256進行分組。以128位為例,明文和密文都分為16組,每組1個位元組為8位。

ECB工作模式中,每一組的明文和密文相互獨立,每一組的明文通過對應該組的密文加密後生成密文,不影響其他組。

CBC工作模式中,後一組的明文在加密之前先使用前一組的密文進行異或運算後再和對應該組的密文進行加密操作生成密文。

為簡單的分組加密。將明文和密文分成若干組後,使用密文對明文進行加密生成密文
CBC

加密:

解密:

閱讀全文

與對稱加密中大小寫有區別嗎相關的資料

熱點內容
申請農業銀行信用卡用什麼app 瀏覽:184
在線看的網站 瀏覽:696
金碟專業版的伺服器如何啟動 瀏覽:402
谷輪壓縮機上海 瀏覽:724
兩對情侶互換的電影 瀏覽:347
linux的解壓gz命令 瀏覽:377
排序演算法的測試用例 瀏覽:411
linux終端編碼 瀏覽:141
程序員決定去擺攤 瀏覽:213
戰術手語圖解命令手語 瀏覽:58
不同視覺演算法優缺點 瀏覽:523
兩台伺服器一台存儲怎麼冗餘 瀏覽:125
android的層次結構圖 瀏覽:459
極簡雲是什麼垃圾伺服器 瀏覽:260
怎麼給電腦硬碟解壓 瀏覽:337
大廠程序員年薪多少 瀏覽:303
小黃人電影在線觀看 瀏覽:595
退火演算法求解背包問題 瀏覽:263
小米電視上的抖音短視頻app怎麼操作 瀏覽:958
哇聽app怎麼賺錢 瀏覽:378