對稱加密DES和TripleDES

2021-09-07 21:27:45 字數 3790 閱讀 5225

對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。

單鑰密碼系統的安全性依賴於以下兩個因素: 第

一、加密演算法必須是足夠強的,僅僅基於密文本身去解密資訊在實踐上是不可能的。 第

二、加密方法的安全性依賴於金鑰的秘密性,而不是演算法的秘密性,因此,我們沒有必要確保演算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證金鑰的秘密性。

des(data encryption standard)

和tripledes

是對稱加密的兩種實現。

des和tripledes

基本演算法一致,只是

tripledes

演算法提供的

key位數更多,加密可靠性更高。

des使用的金鑰

key為

8位元組,初始向量

iv也是

8位元組。

tripledes

使用24

位元組的key

,初始向量

iv也是

8位元組。

兩種演算法都是以

8位元組為乙個塊進行加密,乙個資料塊乙個資料塊的加密,乙個

8位元組的明文加密後的密文也是

8位元組。如果明文長度不為

8位元組的整數倍,新增值為

0的位元組湊滿

8位元組整數倍。所以加密後的密文長度一定為

8位元組的整數倍。

本文測試源**:/files/chnking/tripledestest.rar

加密解密過程

上圖是整個

des和

tripledes

演算法的加密解密過程,下面以

tripledes

為例,結合

dotnet

分析加密解密的各個步驟,並給出相關實現**。

system.security.cryptography. tripledescryptoserviceprovider

類是dotnet

中實現tripledes

演算法的主要的類。

tripledescryptoserviceprovider

類只有乙個構造方法

tripledescryptoserviceprovider

(),這個方法把一些屬性初始化:

keysize

(加密金鑰長度,以位為單位)

= 192(24

位元組)

blocksize

(加密處理的資料塊大小,以位為單位)

= 64(8

位元組)

feedbacksize

(加密資料塊後返回的資料大小,以位為單位)

= 64(8

位元組)

tripledescryptoserviceprovider

構造方法同時會初始化一組隨機的

key和iv。

預設的tripledescryptoserviceprovider

的key為24

位元組,iv為8

位元組,加密資料塊為

8位元組。

生成key和

iv的**很簡單:

tripledescryptoserviceprovider

tdesalg = new

tripledescryptoserviceprovider();

byte

keyarray = tdesalg.key;

byte

ivarray = tdesalg.iv;

生成的key和

iv在加密過程和解密過程都要使用。

待加密的資料可能有兩種形式,一種是二進位制的資料,本身就是一組位元組流,這樣的資料可以跳過這一步,直接進入加密步驟。還有一種情況是字串資料,字串中同樣的字元使用不同的**頁會生成不同的位元組碼,所以從字串到位元組流的轉換是需要指定使用何種編碼的。在解密之後,要從位元組流轉換到字串就要使用相同的**頁解碼,否則就會出現亂碼。

// 待加密的字串

string

plaintextstring = "here is some data to encrypt.

這裡是一些要加密的資料。";

// 使用utf-8

編碼(也可以使用其它的編碼)

encoding

sencoding = encoding.getencoding("utf-8");

// 把字串明文轉換成

utf-8

編碼的位元組流

byte

plaintextarray = sencoding.getbytes(plaintextstring);

加密的原料是明文本節流,

tripledes

演算法對位元組流進行加密,返回的是加密後的位元組流。同時要給定加密使用的

key和iv。

// 把字串明文轉換成

utf-8

編碼的位元組流

byte

plaintextarray = sencoding.getbytes(plaintextstring);

public

static

byte encryptstring(byte plaintextarray, byte key, byte iv)

解密操作解密上面步驟生成的密文

byte

,需要使用到加密步驟使用的同一組

key和iv。

// 呼叫解密方法,返回已解密資料的

byte

byte

finalplaintextarray = decrypttextfrommemory(data, keyarray, ivarray);

public

static

byte decrypttextfrommemory(byte encrypteddataarray, byte key, byte iv)

有一點需要注意,

des加密是以資料塊為單位加密的,

8個位元組乙個資料塊,如果待加密明

byte

的長度不是

8位元組的整數倍,演算法先用值為「0」的

byte補足8

個位元組,然後進行加密。所以加密後的密文長度一定是

8的整數倍。這樣的密文解密後如果補了0值的

byte

,則解密後這些0值的

byte

依然存在。比如上例中要加密的明文是: 「

here is some data to encrypt.

這裡是一些要加密的資料。」

轉成明文

byte

後是66

個位元組,

des演算法就會補上6個

0值的byte

,補到72

個位元組。這樣加密後再解密回來的密文

byte

解碼後的字串就是這樣的:

"here is some data to encrypt.

這裡是一些要加密的資料。

\0\0\0\0\0\0"

// 使用前面定義的

encoding

,utf-8

的編碼把

byte

轉成字串

plaintextstring = sencoding.getstring(finalplaintextarray);

Des對稱加密

1 package com.util 2import j a.io.ioexception 3import j a.security.securerandom 45 import j ax.crypto.cipher 6import j ax.crypto.secretkey 7import j a...

對稱加密DES和TripleDES

對稱加密,是一種比較傳統的加密方式,其加密運算 解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼 稱為對稱密碼 因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。單鑰密碼系統的安全性依賴於以下兩個因素 第 一 加密演算法必須是足夠強的,僅僅基於密文...

對稱加密 AES和DES加密 解密

對稱加密 aes和des加密 解密 目前主流的加密方式有 對稱加密 aes des 非對稱加密 rsa dsa 呼叫aes des加密演算法包最精要的就是下面兩句話 cipher cipher cipher.getinstance des cbc pkcs5padding cipher.init c...