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,第一件事就是通過使用者名稱密碼生成公鑰和私鑰,這是一一對應的關係,就像一把鑰匙開一把鎖...