作為參考:
des演算法提供cbc, ofb, cfb, ecb四種模式,mac是基於ecb實現的。
一、資料補位
des資料加解密就是將資料按照8個位元組一段進行des加密或解密得到一段8個位元組的密文或者明文,最後一段不足8個位元組,按照需求補足8個位元組(通常補00或者ff,根據實際要求不同)進行計算,之後按照順序將計算所得的資料連在一起即可。
這裡有個問題就是為什麼要進行資料補位?主要原因是des演算法加解密時要求資料必須為8個位元組。
二、ecb模式
des ecb(電子密本方式)其實非常簡單,就是將資料按照8個位元組一段進行des加密或解密得到一段8個位元組的密文或者明文,最後一段不足8個位元組,按照需求補足8個位元組進行計算,之後按照順序將計算所得的資料連在一起即可,各段資料之間互不影響。
三、cbc模式
des cbc(密文分組鏈結方式)有點麻煩,它的實現機制使加密的各段資料之間有了聯絡。其實現的機理如下:
加密步驟如下:
1)首先將資料按照8個位元組一組進行分組得到d1d2......dn(若資料不是8的整數倍,用指定的padding資料補位)
2)第一組資料d1與初始化向量i異或
後的結果進行des加密得到第一組密文c1(初始化向量i為全零)
3)第二組資料d2與第一組的加密結果c1異或
以後的結果進行des加密,得到第二組密文c2
4)之後的資料以此類推,得到cn
5)按順序連為c1c2c3......cn即為加密結果。
解密是加密的逆過程,步驟如下:
1)首先將資料按照8個位元組一組進行分組得到c1c2c3......cn
2)將第一組資料進行解密後與初始化向量i進行異或
得到第一組明文d1(注意:一定是先解密再異或)
3)將第二組資料c2進行解密後與第一組密文資料進行異或
得到第二組資料d2
4)之後依此類推,得到dn
5)按順序連為d1d2d3......dn即為解密結果。
這裡注意一點,解密的結果並不一定是我們原來的加密資料,可能還含有你補得位,一定要把補位去掉才是你的原來的資料。
**
* des演算法
*/public class des catch (nosuchalgorithmexception e)
return null;
}/**
* 加密函式
** @param data
* 加密資料
* @param key
* 金鑰
* @return 返回加密後的資料
*/public static byte encrypt(byte data, byte key) catch (exception e)
return null;
}/**
* 解密函式
** @param data
* 解密資料
* @param key
* 金鑰
* @return 返回解密後的資料
*/public static byte decrypt(byte data, byte key) catch (exception e)
return null;
}/**
* 加密函式
** @param data
* 加密資料
* @param key
* 金鑰
* @return 返回加密後的資料
*/public static byte cbcencrypt(byte data, byte key, byte iv) catch (exception e)
return null;
}/**
* 解密函式
** @param data
* 解密資料
* @param key
* 金鑰
* @return 返回解密後的資料
*/public static byte cbcdecrypt(byte data, byte key, byte iv) catch (exception e)
return null;
}public static void main(string args) catch (exception e)
}}
des的幾種填補方式
des是對64位資料的加密演算法,如資料位數不足64位的倍數,需要填充,補充到64位的倍數。
nopadding
api或演算法本身不對資料進行處理,加密資料由加密雙方約定填補演算法。例如若對字串資料進行加解密,可以補充\0或者空格,然後trim
pkcs5padding
加密前:資料位元組長度對8取餘,餘數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後乙個位元組,值為m,則從資料尾部刪除m個位元組,剩餘資料即為加密前的原文
因為des是一種block cipher,乙個block要8個位元組,所以要加密的東西要分成8位元組的整數倍,不足的就填充。
pkcs5padding這種填充,填的位元組代表所填位元組的總數:
比如差三個位元組的話填為 @@@@@333
差7個位元組就填為 @7777777
沒有差就填 88888888
java實現DES演算法
public static void main string args catch transformerexception e system.out.println time system.nanotime start 1000 1000 public desdatatransformer str...
在Java中使用Oracle blob
oracle中的lob large object 可以儲存非常大的資料 可能是4gb 這樣就可以通過將檔案或其它任何物件序列化成位元組輸出流 outputstream 後寫入資料庫,之後使用位元組輸入流 inputstream 將資料讀出然後反序列化為原始檔案或物件。操作時需要使用oracle的jd...
在Java中使用Oracle blob
oracle中的lob large object 可以儲存非常大的資料 可能是4gb 這樣就可以通過將檔案或其它任何物件序列化成位元組輸出流 outputstream 後寫入資料庫,之後使用位元組輸入流 inputstream 將資料讀出然後反序列化為原始檔案或物件。操作時需要使用oracle的jd...