當前位置:首頁 » 密碼管理 » des加密對稱

des加密對稱

發布時間: 2022-02-26 05:15:00

A. 對稱加密演算法中,des演算法的密鑰長度是多少,採用什麼進行加密

DES使用56位密鑰對64位的數據塊進行加密,並對64位的數據塊進行16輪編碼。與每輪編碼時,一個48位的「每輪」密鑰值由56位的完整密鑰得出來。DES用軟體進行解碼需要用很長時間,而用硬體解碼速度非常快,但幸運的是當時大多數黑客並沒有足夠的設備製造出這種硬體設備。在1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用於DES的解密,而且需要12個小時的破解才能得到結果。所以,當時DES被認為是一種十分強壯的加密方法。
但是,當今的計算機速度越來越快了,製造一台這樣特殊的機器的花費已經降到了十萬美元左右,所以用它來保護十億美元的銀行間線纜時,就會仔細考慮了。另一個方面,如果只用它來保護一台伺服器,那麼DES確實是一種好的辦法,因為黑客絕不會僅僅為入侵一個伺服器而花那麼多的錢破解DES密文。由於現在已經能用二十萬美圓製造一台破譯DES的特殊的計算機,所以現在再對要求「強壯」加密的場合已經不再適用了。
三重DES
因為確定一種新的加密法是否真的安全是極為困難的,而且DES的唯一密碼學缺點,就是密鑰長度相對比較短,所以人們並沒有放棄使用DES,而是想出了一個解決其長度問題的方法,即採用三重DES。這種方法用兩個密鑰對明文進行三次加密,假設兩個密鑰是K1和K2,其演算法的步驟如圖5.9所示:
1. 用密鑰K1進行DEA加密。
2. 用K2對步驟1的結果進行DES解密。
3. 用步驟2的結果使用密鑰K1進行DES加密。
這種方法的缺點,是要花費原來三倍時間,從另一方面來看,三重DES的112位密鑰長度是很「強壯」的加密方式了


B. DES演算法是屬於對稱加密演算法嗎

是的,
最著名的保密密鑰或對稱密鑰加密演算法DES(Data Encryption Standard)是由IBM公司在70年代發展起來的,並經過政府的加密標准篩選後,於1976年11月被美國政府採用,DES隨後被美國國家標准局和美國國家標准協會(American National Standard Institute, ANSI) 承認。

DES使用56位密鑰對64位的數據塊進行加密,並對64位的數據塊進行16輪編碼。與每輪編碼時,一個48位的「每輪」密鑰值由56位的完整密鑰得出來。DES用軟體進行解碼需要用很長時間,而用硬體解碼速度非常快,但幸運的是當時大多數黑客並沒有足夠的設備製造出這種硬體設備。在1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用於DES的解密,而且需要12個小時的破解才能得到結果。所以,當時DES被認為是一種十分強壯的加密方法。

但是,當今的計算機速度越來越快了,製造一台這樣特殊的機器的花費已經降到了十萬美元左右,所以用它來保護十億美元的銀行間線纜時,就會仔細考慮了。另一個方面,如果只用它來保護一台伺服器,那麼DES確實是一種好的辦法,因為黑客絕不會僅僅為入侵一個伺服器而花那麼多的錢破解DES密文。由於現在已經能用二十萬美圓製造一台破譯DES的特殊的計算機,所以現在再對要求「強壯」加密的場合已經不再適用了。

三重DES
因為確定一種新的加密法是否真的安全是極為困難的,而且DES的唯一密碼學缺點,就是密鑰長度相對比較短,所以人們並沒有放棄使用DES,而是想出了一個解決其長度問題的方法,即採用三重DES。這種方法用兩個密鑰對明文進行三次加密,假設兩個密鑰是K1和K2,其演算法的步驟如圖5.9所示:

1. 用密鑰K1進行DEA加密。

2. 用K2對步驟1的結果進行DES解密。

3. 用步驟2的結果使用密鑰K1進行DES加密。

這種方法的缺點,是要花費原來三倍時間,從另一方面來看,三重DES的112位密鑰長度是很「強壯」的加密方式了

C. 什麼是DES對稱加密演算法

數據加密的基本過程就是對原來為明文的文件或數據按某種演算法進行處理,使其成為不可讀的一段代碼,通常稱為「密文」,一般來說,是需要仔細的酸,才可以算的出來的,

D. 什麼叫des加密,對稱加密演算法,公鑰加密,RAS,CA,Kerberas

des,是對稱加密的一種演算法
對稱加密,加密和解密用的是同一個密鑰

不對稱加密的話,加密密鑰和解密密鑰是不同的,但是一一對應。

一般來說其一公開,其一保密。
如果用公鑰加密,那就能保證只有擁有私鑰才能解密。

另一種用法用私鑰加密一份文件,別人用公鑰解密,這樣就能證明你是這份文件的賺寫者。

E. 什麼是3DES對稱加密演算法

DES加密經過下面的步驟
1、提供明文和密鑰,將明文按照64bit分塊(對應8個位元組),不足8個位元組的可以進行填充(填充方式多種),密鑰必須為8個位元組共64bit
填充方式:

當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些數據使其湊滿一個分組長度。
* NoPadding
API或演算法本身不對數據進行處理,加密數據由加密雙方約定填補演算法。例如若對字元串數據進行加解密,可以補充\0或者空格,然後trim

* PKCS5Padding
加密前:數據位元組長度對8取余,余數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後一個位元組,值為m,則從數據尾部刪除m個位元組,剩餘數據即為加密前的原文。
例如:加密字元串為為AAA,則補位為AAA55555;加密字元串為BBBBBB,則補位為BBBBBB22;加密字元串為CCCCCCCC,則補位為CCCCCCCC88888888。

* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的位元組數不同。PKCS5Padding明確定義了加密塊是8位元組,PKCS7Padding加密快可以是1-255之間。
2、選擇加密模式

**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式
**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式
**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式
**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。
**CTR模式** 全稱Counter模式,譯為計數器模式。
3、開始加密明文(內部原理--加密步驟,加密演算法實現不做講解)

image
1、將分塊的64bit一組組加密,示列其中一組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。
2、開始Feistel結構的16次轉換,第一次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,
運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於一次Feistel輪並不會加密右側,因此需要將上一輪輸出後的左右兩側對調後才正式完成一次Feistel加密,
3、DES演算法共計進行16次Feistel輪,最後一輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。
4、末置換是初始置換的逆過程,DES最後一輪後,左、右兩半部分並未進行交換,而是兩部分合並形成一個分組做為末置換的輸入
DES解密經過下面的步驟
1、拿到密文和加密的密鑰
2、解密:DES加密和解密的過程一致,均使用Feistel網路實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。
3、講解密後的明文去填充 (padding)得到的即為明文
Golang實現DES加密解密
package main

import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)

func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼
fmt.Printf("%s",txt) // hello world
}
// 加密函數
func DESEncode(orignData, key []byte)([]byte,error){

// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 明文分組,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())

// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這么做)
blockMode := cipher.NewCBCEncrypter(block,key)

// 創建密文長度的切片,用來存放密文位元組
crypted :=make([]byte,len(txt))

// 開始加密,將txt作為源,crypted作為目的切片輸入
blockMode.CryptBlocks(crypted,txt)

// 將加密後的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函數
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 設置解密模式,加密模式和解密模式要一樣
blockMode := cipher.NewCBCDecrypter(block,key)

// 設置切片長度,用來存放明文位元組
originData := make([]byte,len(cripter))

// 使用解密模式解密,將解密後的明文位元組放入originData 切片中
blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)

return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 獲取最後一位轉為整型,然後根據這個整型截取掉整型數量的長度
// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在設置加密模式為CBC的時候,我們需要設置一個初始化向量,這個量的意思 在對稱加密演算法中,如果只有一個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給一個初始化向量,第一個明文使用初始化向量混合並加密,第二個明文用第一個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下

CBC
3DES
DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的一種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。
對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這一點,PHP中卻不是這樣的,只要是8byte以上就行;而java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)

F. des是對稱加密演算法還是非對稱加密演算法加密密鑰是多少位

對稱加密的加密和解密密鑰都是一樣的。而非對稱加密的加密和解密密鑰是不一樣的。它們的演算法也是不同的。 l 對稱加密演算法 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,數據發信方將明文(原始數據)和加密密鑰一起經過特殊...

G. DES 加密解密的對稱性 懂的進,高手來 AVR

推薦TEA加密,速度快

H. JAVA和.NET使用DES對稱加密的區別

如果我說沒有區別你會信嗎?
但答案還真是這樣,兩者沒有任何區別的,只不過實現的語言代碼不同而已。
那麼java與dot net之間的DES是否可以通用?答案也是完全通用。無論是Java的DES加密還是dot net的DES回密,均可以使用另一種語言且不限於Java或dot net解密。夠明白嗎?
DES其實只是一個演算法,加密與解密我們都知道演算法與密碼是分離的。演算法是公開的,都可以用,而密碼是獨立於演算法的。所以DES在不同的語言中實現的演算法根本就是一樣的——也正是因為如此不管何種語言都是通用的(除非偽DES,要知道DES演算法網上本身能搜到而且是一個標准,最先是由美國安全部門公開的)
再說一下,為什麼有人「通」用不起來的原因。DES其實有CBC之類的參數的,也就是針對加密塊選用的不同的加密手段。正是這個參數的原因,不同的語言中使用不同的參數做為默認值,所以使用默認的方式進行讓兩個串進行加解密肯定是不同的。DES使用一種模式(方法)加密,用另一種模式(方法)進行解密能得到正確的結果嗎?一些人不怪自己的學藝不精,反說是兩種語言的DES不通用(這也就是為什麼網路上會出現諸多說java和dot net的DES加密方法不通用的原因)。
即便是自己使用的DES加密的代碼也是通用的(前提你要遵守DES分開演算法),但不要「重復實現已經實現的東西(專業術語叫造輪子)」。
附:
DES.Model屬性取值
CBC 密碼塊鏈 (CBC) 模式引入了反饋。每個純文本塊在加密前,通過按位「異或」操作與前一個塊的密碼文本結合。這樣確保了即使純文本包含許多相同的塊,這些塊中的每一個也會加密為不同的密碼文本塊。在加密塊之前,初始化向量通過按位「異或」操作與第一個純文本塊結合。如果密碼文本塊中有一個位出錯,相應的純文本塊也將出錯。此外,後面的塊中與原出錯位的位置相同的位也將出錯。
ECB 電子密碼本 (ECB) 模式分別加密每個塊。這意味著任何純文本塊只要相同並且在同一消息中,或者在用相同的密鑰加密的不同消息中,都將被轉換成同樣的密碼文本塊。如果要加密的純文本包含大量重復的塊,則逐塊破解密碼文本是可行的。另外,隨時准備攻擊的對手可能在您沒有察覺的情況下替代和交換個別的塊。如果密碼文本塊中有一個位出錯,相應的整個純文本塊也將出錯。
OFB 輸出反饋 (OFB) 模式將少量遞增的純文本處理成密碼文本,而不是一次處理整個塊。此模式與 CFB 相似;這兩種模式的唯一差別是移位寄存器的填充方式不同。如果密碼文本中有一個位出錯,純文本中相應的位也將出錯。但是,如果密碼文本中有多餘或者缺少的位,則那個位之後的純文本都將出錯。
CFB 密碼反饋 (CFB) 模式將少量遞增的純文本處理成密碼文本,而不是一次處理整個塊。該模式使用在長度上為一個塊且被分為幾部分的移位寄存器。例如,如果塊大小為 8 個位元組,並且每次處理一個位元組,則移位寄存器被分為 8 個部分。如果密碼文本中有一個位出錯,則一個純文本位出錯,並且移位寄存器損壞。這將導致接下來若干次遞增的純文本出錯,直到出錯位從移位寄存器中移出為止。
CTS 密碼文本竊用 (CTS) 模式處理任何長度的純文本並產生長度與純文本長度匹配的密碼文本。除了最後兩個純文本塊外,對於所有其他塊,此模式與 CBC 模式的行為相同。

DES.Padding屬性的取值
None 不填充。
PKCS7 PKCS #7 填充字元串由一個位元組序列組成,每個位元組填充該位元組序列的長度。
Zeros 填充字元串由設置為零的位元組組成。
ANSIX923 ANSIX923 填充字元串由一個位元組序列組成,此位元組序列的最後一個位元組填充位元組序列的長度,其餘位元組均填充數字零。
ISO10126 ISO10126 填充字元串由一個位元組序列組成,此位元組序列的最後一個位元組填充位元組序列的長度,其餘位元組填充隨機數據。

當Mode不同時,解密的內密內容能與相同嗎?PaddingMode不同時,解密的內容的結尾部分能相同嗎(填充結果只涉及到最後的一個塊).所以當不管何種語言使用相同的Mode及PaddingMode時,加解密的結果是相同的(當然不排除部分語言不實現全部的Mode和PaddingMode)但,基本的都是實現了的,所以基本上任何兩種語言之間的DES都可以實現相同的加解密結果!而java和dot net中的DES顯然指的是演算法,兩者是相同的,可以隨意使用(Java中dot net中的Mode默認值是不同的,一定要設置相同的Mode和PaddingMode才可以的,不要雙方都採用默認值,那樣真的通不起來)

I. DES加密和解密的對稱性

#include <iostream>
#include <fstream>
using namespace std;
const static char ip[] = { //IP置換
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
const static char fp[] = { //zuizhonghuan
40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25
};
const static char sbox[8][64] = { //s_box
/* S1 */
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,

/* S2 */
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,

/* S3 */
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,

/* S4 */
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,

/* S5 */
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,

/* S6 */
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,

/* S7 */
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,

/* S8 */
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
};
const static char rar[] = { //ya suo huan
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32
};
const static char ei[] = { //kuo zhan huan
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1
};
const static char Pzh[]={ //P置換
16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25
};
const static char Keyrar[]={
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4
};
bool key[16][48]={0},/*rekey[16][48],*/
char key_in[8];
void ByteToBit(bool *Out,char *In,int bits) //位元組到位的轉換
{
int i;
for(i=0;i<bits;i++)
Out[i]=(In[i/8]>>(i%8))&1;
}
void BitToByte(char *Out,bool *In,int bits) //位到位元組轉換
{
for(int i=0;i<bits/8;i++)
Out[i]=0;
for(i=0;i<bits;i++)
Out[i/8]|=In[i]<<(i%8); //"|="組合了位操作符和賦值操作符的功能
}
void Xor(bool *InA,const bool *InB,int len) //按位異或
{
for(int i=0;i<len;i++)
InA[i]^=InB[i];
}
void keyfc(char *In) //獲取密鑰函數
{
int i,j=0,mov,k;
bool key0[56],temp,keyin[64];
ByteToBit(keyin,In,64); //位元組到位的轉換
for(i=0;i<56;i++) //密鑰壓縮為56位
key0[i]=keyin[Keyrar[i]-1];
for(i=0;i<16;i++) //16輪密鑰產生
{
if(i==0||i==1||i==8||i==15)
mov=1;
else
mov=2;
for(k=0;k<mov;k++) //分左右兩塊循環左移
{
// for(int m=0;m<8;m++)
// {
// temp=key0[m*7];
// for(j=m*7;j<m*7+7;j++)
// key0[j]=key0[j+1];
// key0[m*7+6]=temp;
// }
temp=key0[0];
for(int m=0;m<27;m++)
key0[m]=key0[m+1];
key0[27]=temp;
temp=key0[28];
for(m=28;m<55;m++)
key0[m]=key0[m+1];
key0[55]=temp;
}

for(j=0;j<48;j++) //壓縮置換並儲存
key[i][j]=key0[rar[j]-1];
}
}

void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0時加密,反之解密
{
bool MW[64],tmp[32],PMW[64]; //注意指針
bool kzmw[48],keytem[48],ss[32];
int hang,lie;
ByteToBit(PMW,In,64);
for(int j=0;j<64;j++)
{
MW[j]=PMW[ip[j]-1]; //初始置換
}
bool *Li=&MW[0],*Ri=&MW[32];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針

if(MS==0) //DES加密過程
{
for(int lun=0;lun<16;lun++)
{
for(i=0;i<32;i++)
ss[i]=Ri[i];
for(i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
for(i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}

for(int i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}
}
for(i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到位元組的轉換
}
else //DES解密過程
{

for(int lun=15;lun>=0;lun--)
{
for(i=0;i<32;i++)
ss[i]=Ri[i];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
for(i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}

for(i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}

}
for(i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到位元組的轉換
}
}
void main()
{
char Ki[8],jm[8],final[8];
int i0;
cout<<"請輸入密鑰(8位元組):"<<endl;
for(i0=0;i0<8;i0++)
cin>>Ki[i0];
// if(i0<8)
// for(i0=0;i0<8;i0++)
// cin//[i0];
keyfc(Ki);
cout<<"請輸入明文:"<<endl;
for(i0=0;i0<8;i0++)
cin>>jm[i0];
DES(final,jm,0); //加密
for(i0=0;i0<8;i0++)
cout<<final[i0];
cout<<endl;
DES(jm,final,1); //解密
for(i0=0;i0<8;i0++)
cout<<jm[i0];
cout<<endl;
}
這個事用VC實現
給你演算法你自己看

J. des對稱加密的介紹

des對稱加密,是一種對稱加密演算法。

熱點內容
java捕捉異常 發布:2025-01-18 17:05:18 瀏覽:265
lob存儲器 發布:2025-01-18 16:49:36 瀏覽:145
c語言統計字元串出現次數 發布:2025-01-18 16:47:56 瀏覽:930
androidpcmamr 發布:2025-01-18 16:45:02 瀏覽:775
南昊成績查詢的密碼是多少 發布:2025-01-18 16:44:53 瀏覽:89
雷克薩斯nx哪個配置最保值 發布:2025-01-18 16:07:41 瀏覽:463
怎麼改加密密碼 發布:2025-01-18 16:06:48 瀏覽:126
通過域名訪問內網 發布:2025-01-18 16:01:39 瀏覽:275
md5加密後的密碼是什麼意思 發布:2025-01-18 15:50:16 瀏覽:193
如何qq空間訪問許可權 發布:2025-01-18 15:49:30 瀏覽:532