Blowfish秘鑰加密

2021-07-14 00:01:34 字數 1778 閱讀 5018

blowfish

1.兩個box:  ungigned long pbox[18]和unsigned long sbox[4,256]

2.加密函式bf_en(), 輸入64位資訊,輸出64位密文

3.過程:

(1)秘鑰處理

源秘鑰(pbox, sbox固定的),要加密的資訊,和自己選擇的乙個key,---> 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[i],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,xr bf_en對輸入資訊進行變換,bf_en函式詳細過程

對於i=1至16 

xl=xl^pi 

xr=f(xl)^xr 

交換xl和xr(最後一輪取消該運算) 

xr=xr^p17 

xl=xl^p18 

重新合併xl和xr 

函式f見下圖:

8位 32位 

|-----------s盒1----------- 

| |加 

| 8位 32位 |---- 

|-----------s盒2----------- | 

| | 

| |異或---- 

32位-| | | 

| 8位 32位 | | 

|-----------s盒3--------------- |加 

| |-----------------32位 

| | 

| | 

| 8位 32位 | 

|-----------s盒4-----------------------

把xl分成4個8位分組:a,b,c和d 

輸出為:f(xl)=((((s[1,a]+s[2,b])mod 4294967296)^s[3,c])+s[4,d])mod 4294967296 

(2的32次方) (2的32次方) 

重新合併後輸出的結果就是我們需要的密文。 

用blowfish演算法解密,同樣也需要兩個過程。 

1.金鑰預處理 

2.資訊解密 

金鑰預處理的過程與加密時完全相同 

資訊解密的過程就是把資訊加密過程的key_pbox逆序使用即可。

可以看出,選擇不同的key,用blowfish演算法加密同樣的資訊,可以得出不同的結果。 

要破解blowfish演算法,就是要得到blowfish演算法的key。所以,使用blowfish演算法進行加密,最重要的也就是key的選擇以及key的保密。其中key的選擇可以使用bf_sdk中的_weakkey函式進行檢驗。

AES加密解密(根據指定秘鑰)

最近在做呼叫第三方介面,要求入參aes加密,並且秘鑰為16位的長度,在此記錄一下。首先引用命名空間 using system.io using system.text using system.security.cryptography 1 2 aes加密 無向量 3 4 被加密的明文 5 金鑰 6...

Blowfish加密演算法

blowfish演算法是乙個64位分組及可變金鑰長度的對稱金鑰分組密碼演算法,可用來加密64位元長度的字串。32位處理器誕生後,blowfish演算法因其在加密速度上超越了des而引起人們的關注。blowfish演算法具有加密速度快 緊湊 金鑰長度可變 可免費使用等特點,已被廣泛使用於眾多加密軟體。...

SSH公鑰秘鑰

可是碼雲不認識你是誰,這個時候就提示你輸入賬號密碼來確認是誰誰誰提交了這次 往後的日子裡每次修改提交 都需要輸入賬號密碼來確認身份,這是個很煩的事情,所以出現了 ssh 公鑰 這種形式來解決這個問題。使用 git,第一件事就是通過使用者名稱密碼生成公鑰和私鑰,這是一一對應的關係,就像一把鑰匙開一把鎖...