對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。
單鑰密碼系統的安全性依賴於以下兩個因素: 第
一、加密演算法必須是足夠強的,僅僅基於密文本身去解密資訊在實踐上是不可能的。 第
二、加密方法的安全性依賴於金鑰的秘密性,而不是演算法的秘密性,因此,我們沒有必要確保演算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證金鑰的秘密性。
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...