[java]
/**
* DES算法理論
本世紀五十年代以來
DES密碼實際上是Lucifer密碼的進一步發展
美國國家標准局
提供高質量的數據保護
目前在這裡
DES算法的入口參數有三個
DES算法是這樣工作的
通過定期在通信網絡的源端和目的端同時改用新的Key
DES算法詳述
DES算法把
即將輸入的第
經過
放大換位表
單純換位表
在f(Ri
選擇函數Si
S
S
S
S
S
S
S
S
在此以S
現設輸入為
令
行=D
然後在S
從子密鑰Ki的生成算法描述圖中我們可以看到
循環左移位數
以上介紹了DES算法的加密過程
DES算法具有極高安全性
由上述DES算法介紹我們可以看到
DES算法應用誤區的驗證數據
筆者用Turbo C編寫了DES算法程序
Key:
Data:
Mode: Encryption
結果
如果把上述的Key換為
我們可以得到出結論
Key用
Key用
當Key由
DES解密的驗證數據
Key:
Data:
Mode: Decryption
結果
由以上看出
避開DES算法應用誤區的具體操作
在DES密鑰Key的使用
* @author zy
*/
/**
* 本類實現的是基本數據類型上的算法運算
*/
public class DES {
// 密鑰
private String key;
// 為了字節數組與字符串互換而使用的
private static final String BASE
private static final char[] BASE
// 聲明常量字節數組
/**
* DES算法把
* 並把輸出分為L
* 最後一位是原來的第
* 例
*/
private static final int[] IP = { // OK
/**
* 經過
* 逆置換正好是初始置的逆運算
*/
private static final int[] IP_
/**
* PC
*/
private static final int[] PC_
/**
* PC
*/
private static final int[] PC_
/**
* 放大換位表
*/
private static final int[] E = { // OK
/**
* 單純換位表
*/
private static final int[] P = { // OK
/**
* 在f(Ri
* 下面給出選擇函數Si(i=
*/
private static final int[][][] S_Box = {
{// S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
{ // S_Box[
{
{
{
{
/**
* 循環左移位數
*/
private static final int[] LeftMove = {
// 構造函數
public DES(String key) {
this
}
/**
*
* @param des_key
*
* @param des_data
*
* @param flag
*
* @return
*/
private byte[] UnitDes(byte[] des_key
// 檢測輸入參數格式是否正確
if ((des_key
|| ((flag !=
throw new RuntimeException(
}
int flags = flag;
// 二進制加密數據
int[] encryptdata = new int[
// 加密操作完成後的字節數組
byte[] EncryptCode = new byte[
encryptdata = ReadDataToBirnaryIntArray(des_data)
// 執行加密解密操作
EncryptCode = Encrypt(encryptdata
return EncryptCode;
}
/**
* 初試化密鑰為二維密鑰數組
*
* @param key
* int[
* @param keyarray
* new int[
*/
private void KeyInitialize(int[] key
int i;
int j;
int[] K
// 特別注意
for (i =
K
}
for (i =
LeftBitMove(K
// 特別注意
for (j =
keyarray[i][j] = K
}
}
}
/**
* 執行加密解密操作
*
* @param timeData
* (int[
* @param flag
*
* @param keyarray
* new int[
* @return 長度為
*/
private byte[] Encrypt(int[] timeData
int i;
byte[] encrypt = new byte[
int flags = flag;
int[] M = new int[
int[] MIP_
// 特別注意
for (i =
M[i] = timeData[IP[i]
}
if (flags ==
for (i =
LoopF(M
}
} else if (flags ==
for (i =
LoopF(M
}
}
for (i =
MIP_
}
// 將(int[
GetEncryptResultOfByteArray(MIP_
// 返回加密數據
return encrypt;
}
/**
* 轉換
*
* @param intdata
*
* @return 長度為
*/
private int[] ReadDataToBirnaryIntArray(byte[] intdata) {
int i;
int j;
// 將數據轉換為二進制數
int[] IntDa = new int[
for (i =
IntDa[i] = intdata[i];// intdata[i]為byte
if (IntDa[i] <
IntDa[i] +=
IntDa[i] %=
}
}
int[] IntVa = new int[
for (i =
for (j =
IntVa[((i *
IntDa[i] = IntDa[i] /
}
}
return IntVa;
}
/**
* int[
*
* @param data
* int[
* @param value
* byte[
*/
private void GetEncryptResultOfByteArray(int[] data
int i;
int j;
// 將存儲
for (i =
for (j =
value[i] += (byte) (data[(i 《
}
}
for (i =
value[i] %=
if (value[i] >
value[i]
}
}
}
/**
* 左移
*
* @param k
* @param offset
*/
private void LeftBitMove(int[] k
int i;
// 循環移位操作函數
int[] c
int[] d
int[] c
int[] d
for (i =
c
d
}
if (offset ==
for (i =
c
d
}
c
d
} else if (offset ==
for (i =
c
d
}
c
d
c
d
}
for (i =
k[i] = c
k[i +
}
}
/**
* S盒處理
*
* @param M
* @param times
* @param flag
* @param keyarray
*/
private void LoopF(int[] M
int i;
int j;
int[] L
int[] R
int[] L
int[] R
int[] RE = new int[
int[][] S = new int[
int[] sBoxData = new int[
int[] sValue = new int[
int[] RP = new int[
for (i =
L
R
}
for (i =
RE[i] = R
RE[i] = RE[i] + keyarray[times][i]; // 與KeyArray[times][i]按位作不進位加法運算
if (RE[i] ==
RE[i] =
}
}
for (i =
for (j =
S[i][j] = RE[(i *
}
// 下面經過S盒
sBoxData[i] = S_Box[i][(S[i][
+ (S[i][
//
for (j =
sValue[((i *
sBoxData[i] = sBoxData[i] /
}
}
for (i =
RP[i] = sValue[P[i]
L
R
if (R
R
}
// 重新合成M
// 最後一次變換時
if (((flag ==
M[i] = R
M[i +
} else {
M[i] = L
M[i +
}
}
}
/**
* 把一個字節數組的元素拷貝到另一個字節數組中
*
* @param src
* @param srcPos
* @param dest
* @param destPos
* @param length
*/
private void arraycopy(byte[] src
int length) {
if (dest != null && src != null) {// 當兩個都不為空時
byte[] temp = new byte[length];
for (int i =
temp[i] = src[srcPos + i];
}
for (int i =
dest[destPos + i] = temp[i];
}
}
}
/**
* 格式化字節數組
*
* @return 一個新的字節數組
*/
private byte[] ByteDataFormat(byte[] data) {
int len = data
int padlen =
int newlen = len + padlen;
byte[] newdata = new byte[newlen];
arraycopy(data
for (int i = len; i < newlen; i++)
newdata[i] =
return newdata;
}
/**
* 加密解密(主要方法)
*
* @param des_key
* 密鑰字節數組
* @param des_data
* 要處理的數據字節數組
* @param flag
* (
* @return 處理後的數據
*/
private byte[] DesEncrypt(byte[] des_key
byte[] format_key = ByteDataFormat(des_key)
byte[] format_data = ByteDataFormat(des_data)
int datalen = format_data
int unitcount = datalen /
byte[] result_data = new byte[datalen];// 用於盛放加密後的結果
// Log
byte[] tmpkey = new byte[
arraycopy(format_key
byte[] tmpdata = new byte[
createKey(tmpkey)
// 每一次循環
for (int i =
// if (i %
// Log
arraycopy(format_data
byte[] tmpresult = UnitDes(tmpkey
arraycopy(tmpresult
}
return result_data;
}
// 密鑰初試化成二維數組
int[][] KeyArray = new int[
private void createKey(byte[] des_key) {
// 二進制加密密鑰
int[] keydata = new int[
// 將密鑰字節數組轉換成二進制字節數組
keydata = ReadDataToBirnaryIntArray(des_key)
// 初試化密鑰為二維密鑰數組
KeyInitialize(keydata
// 將加密數據字節數組轉換成二進制字節數組
}
/**
* DES加密
*
* @param data
* 原始數據
* @return 加密後的數據字節數組
*/
public String encrypt(String data) {
String dataLength = data
String datal = dataLength;
// 原始數據長度不滿
for (int i =
dataLength =
}
// System
String sbDate = dataLength + data;// 保證原始數據的前
byte[] bytekey = key
byte[] bytedata = sbDate
byte[] result = new byte[(bytedata
result = DesEncrypt(bytekey
return toBase
}
/**
* DES解密
*
* @param encryptData
* 加密後的數據字節數組
* @return 還原後的數據字符串
*/
public String decrypt(String encryptData) {
try {
byte[] encryptByteArray = fromBase
byte[] bytekey = key
byte[] result = new byte[encryptByteArray
result = DesEncrypt(bytekey
String deResult = new String(result)
int dataLength = Integer
return deResult
} catch (Exception e) {
return
}
}
/**
* 字節數組轉換為字符串
*
* @param buffer
* @return
*/
private String toBase
int len = buffer
byte b
switch (pos) {
case
b
break;
case
b
b
break;
}
String returnValue =
int c;
boolean notleading = false;
do {
// c = (b
c = (b
if (notleading || c !=
returnValue += BASE
notleading = true;
}
// c = ((b
c = ((b
if (notleading || c !=
returnValue += BASE
notleading = true;
}
// c = ((b
c = ((b
if (notleading || c !=
returnValue += BASE
notleading = true;
}
c = b
if (notleading || c !=
returnValue += BASE
notleading = true;
}
if (pos >= len) {
break;
} else {
try {
b
b
b
} catch (Exception x) {
break;
}
}
} while (true)
if (notleading) {
return returnValue;
}
return
}
/**
* 字符串轉換為字節數組
*
* @param str
* @return
* @throws Exception
*/
private byte[] fromBase
int len = str
if (len ==
throw new Exception(
}
byte[] a = new byte[len +
int i
for (i =
try {
a[i] = (byte) BASE
} catch (Exception x) {
throw new Exception(
}
}
i = len
j = len;
try {
while (true) {
a[j] = a[i];
if (
break;
}
a[j] |= (a[i] &
j
// a[j] = (byte)((a[i] &
a[j] = (byte) ((a[i] &
if (
break;
}
a[j] |= (a[i] &
j
// a[j] = (byte)((a[i] &
a[j] = (byte) ((a[i] &
if (
break;
}
a[j] |= (a[i] 《
j
a[j] =
if (
break;
}
}
} catch (Exception ignored) {
}
try { // ignore leading
while (a[j] ==
j++;
}
} catch (Exception x) {
return new byte[
}
byte[] result = new byte[len
arraycopy(a
return result;
}
public byte[] eCode(byte[] bytes){
DesEncrypt(key
return new byte [
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26705.html