最近忙,事比較多,活多了,還要降薪,唉。沒什麼時間看書,將以前的一些技術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位元組...