對稱加密DES和TripleDES

2021-04-14 15:39:55 字數 3686 閱讀 9152

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

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

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

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

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位元組的整數倍。

figure 1. des

加密解密過程

上圖是整個

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...