實現PROXY穿越(3) DES演算法之一

2021-05-10 20:42:31 字數 3418 閱讀 1681

最近忙,事比較多,活多了,還要降薪,唉。沒什麼時間看書,將以前的一些技術blog也移到這裡。ntlm在去年年底和今年年初研究過一陣子,寫了總結和 例子程式。裡面涉及很多演算法,在網上查了很久。(下面是以前的部落格)最近想實現乙個通過proxy穿越的網路程式設計,將相關的內容進行一下彙總。很多東西來 自網路共產主義,也應該為共產主義有所回饋。介紹des演算法的實現。

在ntlm中使用des演算法生成lm-hash和ntlm-hash(以後在介紹)。我們現討論des演算法的實現。 des是data encryption standard(資料加密標準)的縮寫。它是由ibm公司研製的一種加密演算法,美國國家標準局於2023年公布把它作為非機要部門使用的資料加密標準,二十年來,它一直活躍在國際保密通訊的舞台上,扮演了十分重要的角色。而des演算法本身稱自己為dea(data encryption althorithm),因此des和dea實際是同乙個東東。

des輸入64bit的資料來源,通過56bits的key(由8bytes去掉crc校驗位獲得,輸入也可以看作是64bits,至少在程式**中是這樣體現),生成乙個64bits的結果,des屬於對稱加密方式。一共分為三個步驟。

在實現的過程中,最為鬱悶的是網上有很多**和例子,也有一些檢測工具,例如crytotool1.2,但是很奇怪,他們給出的結果不一樣,因此有必要認真了解一下整個des的過程。

步驟一:源和key的初始化序列改動(initail permutation)

通過對位元的序列移動,生成新的源'和key』,用於後續的演算法計算。

a:對源的處理

8位元組,共64bits,從1到64按下面左陣列的擺列方式,經過序列移動,成規下面右陣列的排列方式,實際上新的第乙個8bit就是左陣列的第2 列,從下到上的順序,後面的7組8位元分別為第4、6、8、1、3、5、7列從下到上的排序。這種方式,我想對於晶元實現是很便利的,可惜c程式語言不等 直接按列處理,只好寫段**來實現。

| 1  2  3  4  5  6  7  8|    |58 50 42 34 26 18 10 2|

| 9 10 11 12 13 14 15 16|    |60 52 44 36 28 20 12 4|

|17 18 19 20 21 22 23 24|    |62 54 46 38 30 22 14 6|

|25 26 27 28 29 30 31 32|    |64 56 48 40 32 24 16 8|

|33 34 35 36 37 38 39 40| -> |57 49 41 33 25 17  9 1|

|41 42 43 44 45 46 47 48|    |59 51 43 35 27 19 11 3|

|49 50 51 52 53 54 55 56|    |61 53 45 37 29 21 13 5|

|57 58 59 60 61 62 63 64|    |63 55 47 39 31 23 15 7|

實現**:

//變換序列

static int ip_data_seq = ;

//由於後面存在大量的位元操作,而c程式中一般以位元組為單位,因此我們將位元組中的位元分別

//存貯在8個位元組中,以方便後面的大量運算

static void storebit(in unsigned char * data, in int data_len, out unsigned char * dst)

}//這是storebit得反操作。

static void parsebit(in unsigned char * data,out unsigned char * dst,in int dst_len)

}//移位操作函式

static void initail_permutation(in unsigned char * data,in int * schedule, in int num,

out unsigned char * dst)

memcpy(dst,temp,num);

free(temp);

}//演算法主函式

void algorithm_des(in unsigned char * src, in unsigned char * secrect,

out unsigned char * dst)

b:對key的處理

對於輸入的8位元組的key,每個位元組去除其crc校驗位(第8位),然後經過類似的序列移位生成了56bit的新的key。從這個處理,我們也可以看出des演算法的古老,採用流的概念,而crc校驗位用於初期比較古老的誤位元速率高的通訊中。

這種以通訊以流的方式傳遞,需要注意和我們程式中的順序問題。如果我們使用byte(unsinged char)來放置一8bit的資訊,那麼第一位是我們byte的高位。這與我們網路程式設計中碰到的little_endian和big_endian的情況有點類似。閒話少談,移動位的方式如下:

| 1 2  3  4  5  6  7  8 |    |57 49 41 33 25 17  9|    |57 49 41 33 25 17  9  1|

| 9 10 11 12 13 14 15 16|    | 1 58 50 42 34 26 18|    |58 50 42 34 26 18 10  2|

|17 18 19 20 21 22 23 24|    |10  2 59 51 43 35 27|    |59 51 43 35 27 19 11  3|

|25 26 27 28 29 30 31 32|    |19 11  3 60 52 44 36|    |60 52 44 36            |

|33 34 35 36 37 38 39 40| -> |63 55 47 39 31 23 15| -> |63 55 47 39 31 23 15  7|

|41 42 43 44 45 46 47 48|    | 7 62 54 46 38 30 22|    |62 54 46 38 30 22 14  6|

|49 50 51 52 53 54 55 56|    |14  6 61 53 45 37 29|    |61 53 45 37 29 21 13  5|

|57 58 58 60 61 62 63 64|    |21 13  5 28 20 12  4|    |28 20 12  4            |

中間和右圖是一樣的,只是我們採用7bit一組還是按照8bit一組的方式存放,我們希望通過右圖給出乙個有規律的處理。

static int ip_key_seq =;

//演算法主函式

void algorithm_des(in unsigned char * src, in unsigned char * secrect,

out unsigned char * dst)

ok,終於完成了第一步,得到了s[64]和key[56]為第二步演算法的輸入。

ntlm的實現:

實現PROXY穿越(5) DES演算法之三

最近忙,事比較多,活多了,還要降薪,唉。沒什麼時間看書,將以前的一些技術blog也移到這裡。ntlm在去年年底和今年年初研究過一陣子,寫了總結和例子程式。裡面涉及很多演算法,在網上查了很久。下面是以前的部落格 最近想實現乙個通過proxy穿越的網路程式設計,將相關的內容進行一下彙總。很多東西來自網路...

3des演算法加密

實現的原理 public class encryption 執行3des加密 param secretkey 秘鑰 param datastring 明文 return base64編碼文字 public static string encryptdes string secretkey,strin...

Golang實現ECB模式3DES演算法

因專案需要使用ecb模式下的3des演算法加解密資訊,golang預設只提供cbc模式,只能自己實現ecb模式。參考文章對ecb模式的des有解釋,並實現了部分des演算法樣例。這裡把演算法補全,提供3des演算法實現。3des 3des演算法就是採用乙個長度為24位元組的金鑰,將金鑰分成各8位元組...