加密與安全學習筆記

2021-10-25 22:20:22 字數 3993 閱讀 5819

url編碼:

base64:

常用的雜湊演算法有:

演算法輸出長度(位)

輸出長度(位元組)

md5128 bits

16 bytes

sha-1

160 bits

20 bytes

ripemd-160

160 bits

20 bytes

sha-256

256 bits

32 bytes

sha-512

512 bits

64 bytes

根據碰撞概率,雜湊演算法的輸出長度越長,就越難產生碰撞,也就越安全

雜湊碰撞是指,兩個不同的輸入得到了相同的輸出

public

class

main

}//使用messagedigest時,我們首先根據雜湊演算法獲取乙個messagedigest例項,然後,反覆呼叫update(byte)輸入資料。當輸入結束後,呼叫digest()方法獲得byte陣列表示的摘要,最後,把它轉換為十六進製制的字串

演算法

金鑰長度

工作模式

填充模式

des56/64

ecb/cbc/pcbc/ctr/…

nopadding/pkcs5padding/…

aes128/192/256

ecb/cbc/pcbc/ctr/…

nopadding/pkcs5padding/pkcs7padding/…

idea

128ecb

pkcs5padding/pkcs7padding/…

ecb模式是最簡單的aes加密模式,它只需要乙個固定長度的金鑰,固定的明文會生成固定的密文,這種一對一的加密方式會導致安全性降低,更好的方式是通過cbc模式,它需要乙個隨機數作為iv引數,這樣對於同乙份明文,每次生成的密文都不同:

public

class

main

// 加密:

public

static

byte

encrypt

(byte

key,

byte

input)

throws generalsecurityexception

// 解密:

public

static

byte

decrypt

(byte

key,

byte

input)

throws generalsecurityexception

public

static

byte

join

(byte

bs1,

byte

bs2)

}

注意:上述口令,都是固定的256位

pbe**現實問題:**假設一方通過aes加密之後,將密文傳送給對方時,對方需要金鑰才能解密密文。現在問題來了:如何傳遞金鑰?

要解決這個問題,金鑰交換演算法即dh演算法:diffie-hellman演算法應運而生。

dh演算法解決了金鑰在雙方不直接傳遞金鑰的情況下完成金鑰交換,這個神奇的交換原理完全由數學理論支援

雙方都有乙個自己隨機產生的私鑰,同時計算得出乙個公鑰,而公鑰可以進行隨意的傳播,然後對方根據另一方的公鑰和自己的私鑰就可以得到真正的金鑰,同時這個金鑰雙方計算出來都是一樣的,即被雙方協商出來的金鑰。

拓展:甲首選選擇乙個素數p,例如509,底數g,任選,例如5,隨機數a,例如123,然後計算a=g^a mod p,結果是215,然後,甲傳送p=509,g=5,a=215給乙;

乙方收到後,也選擇乙個隨機數b,例如,456,然後計算b=g^b mod p,結果是181,乙再同時計算s=a^b mod p,結果是121;

乙把計算的b=181發給甲,甲計算s=b^a mod p的餘數,計算結果與乙算出的結果一樣,都是121。

dh演算法的本質就是雙方各自生成自己的私鑰和公鑰,私鑰僅對自己可見,然後交換公鑰,並根據自己的私鑰和對方的公鑰,生成最終的金鑰secretkey,dh演算法通過數學定律保證了雙方各自計算出的secretkey是相同的。

public

class

main

}class

person

// 生成本地keypair:

public

void

generatekeypair()

catch

(generalsecurityexception e)

}public

void

generatesecretkey

(byte

receivedpubkeybytes)

catch

(generalsecurityexception e)

}public

void

printkeys()

}

非對稱加密就是加密和解密使用的不是相同的金鑰:只有同乙個公鑰-私鑰對才能正常加解密(而對稱加密是加密解密必須是相同的金鑰否則無法解密,從而出現了金鑰交換演算法)

解釋:

因此,如果小明要加密乙個檔案傳送給小紅,他應該首先向小紅索取她的公鑰,然後,他用小紅的公鑰加密,把加密檔案傳送給小紅,此檔案只能由小紅的私鑰解開,因為小紅的私鑰在她自己手裡,所以,除了小紅,沒有任何人能解開此檔案

因此,加密的時候要知道對方的公鑰

非對稱加密相比對稱加密的顯著優點在於,對稱加密需要協商金鑰,而非對稱加密可以安全地公開各自的公鑰,在n個人之間通訊的時候:使用非對稱加密只需要n個金鑰對(知道對方的公鑰就能加密,而只有對方的私鑰才能解密),每個人只管理自己的金鑰對。而使用對稱加密需要則需要n*(n-1)/2個金鑰(需要雙方協商金鑰,因此相當於多邊形的對角線加所有的邊數),因此每個人需要管理n-1個金鑰,金鑰管理難度大,而且非常容易洩漏
引出簽名演算法:

我們使用非對稱加密演算法的時候,對於乙個公鑰-私鑰對,通常是用公鑰加密,私鑰解密

如果使用私鑰加密,公鑰解密是否可行呢?實際上是完全可行的

用途:

不過我們再仔細想一想,私鑰是保密的,而公鑰是公開的,用私鑰加密,那相當於所有人都可以用公鑰解密。這個加密有什麼意義?
因此,私鑰加密得到的密文實際上就是數字簽名,要驗證這個簽名是否正確,只能用私鑰持有者的公鑰進行解密驗證。使用數字簽名的目的是為了確認某個資訊確實是由某個傳送方傳送的,任何人都不可能偽造訊息,並且,傳送方也不能抵賴

在實際應用的時候,簽名實際上並不是針對原始訊息,而是針對原始訊息的雜湊進行簽名,即:

signature = encrypt(privatekey, sha256(message))

對簽名進行驗證實際上就是用公鑰解密:

hash = decrypt(publickey, signature)

常用數字簽名演算法有:

public

class

main

}

我們知道,摘要演算法用來確保資料沒有被篡改,非對稱加密演算法可以對資料進行加解密,簽名演算法可以確保資料完整性和抗否認性,把這些演算法集合到一起,並搞一套完善的標準,這就是數字證書。

因此,數字證書就是集合了多種密碼學演算法,用於實現資料加解密、身份認證、簽名等多種功能的一種安全標準。

數字證書可以防止中間人攻擊,因為它採用鏈式簽名認證,即通過根證書(root ca)去簽名下一級證書,這樣層層簽名,直到最終的使用者證書。而root ca證書內置於作業系統中,所以,任何經過ca認證的數字證書都可以對其本身進行校驗,確保證書本身不是偽造的

加密與安全

對稱加密就是加密和解密使用同乙個金鑰,通常稱之為 session key 這種加密技術在當今被廣泛採用,如美國 所採用的des加密標準就是一種典型的 對稱式 加密法,它的session key長度為56bits。常見的對稱加密演算法有 非對稱加密就是加密和解密所使用的不是同乙個金鑰,通常有兩個金鑰,...

AES加密學習筆記

aes對稱加密 aes ecb pkcs5padding aes簡介 pkcs5padding aes原始碼 做專案要用到aes加密,選擇這個開源aes包,其blocksize是16位元組 每16位元組資料進行加密 pkcs5padding 以八字節為處理單位,padding的值是 1 7,如果資料...

《機器學習與安全》讀書筆記

我看的是 machine learning and security 的翻譯版,原書應該是安全資料科學領域一本比較不錯的而且較為基礎的書,奈何翻譯的太差而且本人水平有限,對書中的許多內容了解的不多,而且書中的 部分並沒有自己親自實現,只是選取了安全領域的異常檢測 惡意軟體分析和網路流量分析三個部分做...