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