{
调用时只需要调用下面两个函数即可。
function EncryStr(Str, Key: String): String
function DecryStr(Str, Key: String): String
function EncryStrHex(Str, Key: String): String
function DecryStrHex(StrHex, Key: String): String
}
interface
uses
SysUtils, Variants,strutils
type
TKeyByte = array[0..5] of Byte
TDesMode = (dmEncry, dmDecry)
function EncryStr(Str, Key: String): String
function DecryStr(Str, Key: String): String
function EncryStrHex(Str, Key: String): String
function DecryStrHex(StrHex, Key: String): String
const
BitIP: array[0..63] of Byte = //初始值置IP
(57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7,
56, 48, 40, 32, 24, 16, 8, 0,
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6 )
BitCP: array[0..63] of Byte = //逆初始置IP-1
( 39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25,
32, 0, 40, 8, 48, 16, 56, 24 )
BitExp: array[0..47] of Integer = // 位选择函数E
( 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9,10,
11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,
21,22,23,24,23,24,25,26,27,28,27,28,29,30,31,0 )
BitPM: array[0..31] of Byte = //置换函数P
( 15, 6,19,20,28,11,27,16, 0,14,22,25, 4,17,30, 9,
1, 7,23,13,31,26, 2, 8,18,12,29, 5,21,10, 3,24 )
sBox: array[0..7] of array[0..63] of Byte =//S盒
( ( 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 ),
( 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 ),
( 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 ),
( 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 ),
( 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 ),
( 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 ),
( 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 ),
( 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ) )
BitPMC1: array[0..55] of Byte = //选择置换PC-1
( 56, 48, 40, 32, 24, 16, 8,
0, 57, 49, 41, 33, 25, 17,
9, 1, 58, 50, 42, 34, 26,
18, 10, 2, 59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14,
6, 61, 53, 45, 37, 29, 21,
13, 5, 60, 52, 44, 36, 28,
20, 12, 4, 27, 19, 11, 3 )
BitPMC2: array[0..47] of Byte =//选择置换PC-2
( 13, 16, 10, 23, 0, 4,
2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7,
15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54,
29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52,
45, 41, 49, 35, 28, 31 )
var
subKey: array[0..15] of TKeyByte
implementation
procedure initPermutation(var inData: array of Byte)
var
newData: array[0..7] of Byte
i: Integer
begin
FillChar(newData, 8, 0)
for i := 0 to 63 do
if (inData[BitIP[i] shr 3] and (1 shl (7- (BitIP[i] and $07)))) <>0 then
newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)))
for i := 0 to 7 do inData[i] := newData[i]
end
procedure conversePermutation(var inData: array of Byte)
var
newData: array[0..7] of Byte
i: Integer
begin
FillChar(newData, 8, 0)
for i := 0 to 63 do
if (inData[BitCP[i] shr 3] and (1 shl (7-(BitCP[i] and $07)))) <>0 then
newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)))
for i := 0 to 7 do inData[i] := newData[i]
end
procedure expand(inData: array of Bytevar outData: array of Byte)
var
i: Integer
begin
FillChar(outData, 6, 0)
for i := 0 to 47 do
if (inData[BitExp[i] shr 3] and (1 shl (7-(BitExp[i] and $07)))) <>0 then
outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)))
end
procedure permutation(var inData: array of Byte)
var
newData: array[0..3] of Byte
i: Integer
begin
FillChar(newData, 4, 0)
for i := 0 to 31 do
if (inData[BitPM[i] shr 3] and (1 shl (7-(BitPM[i] and $07)))) <>0 then
newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)))
for i := 0 to 3 do inData[i] := newData[i]
end
function si(s,inByte: Byte): Byte
var
c: Byte
begin
c := (inByte and $20) or ((inByte and $1e) shr 1) or
((inByte and $01) shl 4)
Result := (sBox[s][c] and $0f)
end
procedure permutationChoose1(inData: array of Byte
var outData: array of Byte)
var
i: Integer
begin
FillChar(outData, 7, 0)
for i := 0 to 55 do
if (inData[BitPMC1[i] shr 3] and (1 shl (7-(BitPMC1[i] and $07)))) <>0 then
outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)))
end
procedure permutationChoose2(inData: array of Byte
var outData: array of Byte)
var
i: Integer
begin
FillChar(outData, 6, 0)
for i := 0 to 47 do
if (inData[BitPMC2[i] shr 3] and (1 shl (7-(BitPMC2[i] and $07)))) <>0 then
outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)))
end
procedure cycleMove(var inData: array of BytebitMove: Byte)
var
i: Integer
begin
for i := 0 to bitMove - 1 do
begin
inData[0] := (inData[0] shl 1) or (inData[1] shr 7)
inData[1] := (inData[1] shl 1) or (inData[2] shr 7)
inData[2] := (inData[2] shl 1) or (inData[3] shr 7)
inData[3] := (inData[3] shl 1) or ((inData[0] and $10) shr 4)
inData[0] := (inData[0] and $0f)
end
end
procedure makeKey(inKey: array of Bytevar outKey: array of TKeyByte)
const
bitDisplace: array[0..15] of Byte =
( 1,1,2,2, 2,2,2,2, 1,2,2,2, 2,2,2,1 )
var
outData56: array[0..6] of Byte
key28l: array[0..3] of Byte
key28r: array[0..3] of Byte
key56o: array[0..6] of Byte
i: Integer
begin
permutationChoose1(inKey, outData56)
key28l[0] := outData56[0] shr 4
key28l[1] := (outData56[0] shl 4) or (outData56[1] shr 4)
key28l[2] := (outData56[1] shl 4) or (outData56[2] shr 4)
key28l[3] := (outData56[2] shl 4) or (outData56[3] shr 4)
key28r[0] := outData56[3] and $0f
key28r[1] := outData56[4]
key28r[2] := outData56[5]
key28r[3] := outData56[6]
for i := 0 to 15 do
begin
cycleMove(key28l, bitDisplace[i])
cycleMove(key28r, bitDisplace[i])
key56o[0] := (key28l[0] shl 4) or (key28l[1] shr 4)
key56o[1] := (key28l[1] shl 4) or (key28l[2] shr 4)
key56o[2] := (key28l[2] shl 4) or (key28l[3] shr 4)
key56o[3] := (key28l[3] shl 4) or (key28r[0])
key56o[4] := key28r[1]
key56o[5] := key28r[2]
key56o[6] := key28r[3]
permutationChoose2(key56o, outKey[i])
end
end
procedure encry(inData, subKey: array of Byte
var outData: array of Byte)
var
outBuf: array[0..5] of Byte
buf: array[0..7] of Byte
i: Integer
begin
expand(inData, outBuf)
for i := 0 to 5 do outBuf[i] := outBuf[i] xor subKey[i]
buf[0] := outBuf[0] shr 2
buf[1] := ((outBuf[0] and $03) shl 4) or (outBuf[1] shr 4)
buf[2] := ((outBuf[1] and $0f) shl 2) or (outBuf[2] shr 6)
buf[3] := outBuf[2] and $3f
buf[4] := outBuf[3] shr 2
buf[5] := ((outBuf[3] and $03) shl 4) or (outBuf[4] shr 4)
buf[6] := ((outBuf[4] and $0f) shl 2) or (outBuf[5] shr 6)
buf[7] := outBuf[5] and $3f
for i := 0 to 7 do buf[i] := si(i, buf[i])
for i := 0 to 3 do outBuf[i] := (buf[i*2] shl 4) or buf[i*2+1]
permutation(outBuf)
for i := 0 to 3 do outData[i] := outBuf[i]
end
procedure desData(desMode: TDesMode
inData: array of Bytevar outData: array of Byte)
// inData, outData 都为8Bytes,否则出错
var
i, j: Integer
temp, buf: array[0..3] of Byte
begin
for i := 0 to 7 do outData[i] := inData[i]
initPermutation(outData)
if desMode = dmEncry then
begin
for i := 0 to 15 do
begin
for j := 0 to 3 do temp[j] := outData[j]//temp = Ln
for j := 0 to 3 do outData[j] := outData[j + 4]//Ln+1 = Rn
encry(outData, subKey[i], buf) //Rn ==Kn==>buf
for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j] //Rn+1 = Ln^buf
end
for j := 0 to 3 do temp[j] := outData[j + 4]
for j := 0 to 3 do outData[j + 4] := outData[j]
for j := 0 to 3 do outData[j] := temp[j]
end
else if desMode = dmDecry then
begin
for i := 15 downto 0 do
begin
for j := 0 to 3 do temp[j] := outData[j]
for j := 0 to 3 do outData[j] := outData[j + 4]
encry(outData, subKey[i], buf)
for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j]
end
for j := 0 to 3 do temp[j] := outData[j + 4]
for j := 0 to 3 do outData[j + 4] := outData[j]
for j := 0 to 3 do outData[j] := temp[j]
end
conversePermutation(outData)
end
//////////////////////////////////////////////////////////////
function EncryStr(Str, Key: String): String
var
StrByte, OutByte, KeyByte: array[0..7] of Byte
StrResult: String
I, J: Integer
begin
if (Length(Str) >0) and (Ord(Str[Length(Str)]) = 0) then
raise Exception.Create('Error: the last char is NULL char.')
if Length(Key) <8 then
while Length(Key) <8 do Key := Key + Chr(0)
while Length(Str) mod 8 <>0 do Str := Str + Chr(0)
for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1])
makeKey(keyByte, subKey)
StrResult := ''
for I := 0 to Length(Str) div 8 - 1 do
begin
for J := 0 to 7 do
StrByte[J] := Ord(Str[I * 8 + J + 1])
desData(dmEncry, StrByte, OutByte)
for J := 0 to 7 do
StrResult := StrResult + Chr(OutByte[J])
end
Result := StrResult
end
function DecryStr(Str, Key: String): String
var
StrByte, OutByte, KeyByte: array[0..7] of Byte
StrResult: String
I, J: Integer
begin
if Length(Key) <8 then
while Length(Key) <8 do Key := Key + Chr(0)
for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1])
makeKey(keyByte, subKey)
StrResult := ''
for I := 0 to Length(Str) div 8 - 1 do
begin
for J := 0 to 7 do StrByte[J] := Ord(Str[I * 8 + J + 1])
desData(dmDecry, StrByte, OutByte)
for J := 0 to 7 do
StrResult := StrResult + Chr(OutByte[J])
end
while (Length(StrResult) >0) and
(Ord(StrResult[Length(StrResult)]) = 0) do
Delete(StrResult, Length(StrResult), 1)
Result := StrResult
end
///////////////////////////////////////////////////////////
function EncryStrHex(Str, Key: String): String
var
StrResult, TempResult, Temp: String
I,k: Integer
begin
TempResult := EncryStr(Str, Key)
StrResult := ''
for I := 0 to Length(TempResult) - 1 do
begin
Temp := Format('%x', [Ord(TempResult[I + 1])])
if Length(Temp) = 1 then Temp := '0' + Temp
StrResult := StrResult + Temp
end
k:=0
for i := 0 to length(StrResult) - 1 do
k:=k + ord((StrResult[i+1]))
Result := StrResult + intToHex(Byte(k),2)
end
function DecryStrHex(StrHex, Key: String): String
function HexToInt(Hex: String): Integer
var
I, Res: Integer
ch: Char
begin
Res := 0
for I := 0 to Length(Hex) - 1 do
begin
ch := Hex[I + 1]
if (ch >= '0') and (ch <= '9') then
Res := Res * 16 + Ord(ch) - Ord('0')
else if (ch >= 'A') and (ch <= 'F') then
Res := Res * 16 + Ord(ch) - Ord('A') + 10
else if (ch >= 'a') and (ch <= 'f') then
Res := Res * 16 + Ord(ch) - Ord('a') + 10
else raise Exception.Create('Error: not a Hex String')
end
Result := Res
end
var
Str, Temp: String
I,k: Integer
begin
Str := ''
if length(StrHex)<=2 then
begin
result:=''
exit
end
K:=0
for i := 0 to length(StrHex) - 3 do
k:=k + ord((StrHex[i+1]))
try
if Byte(k)<>Byte(strToInt('$' + rightStr(StrHex,2))) then
begin
result:=''
exit
end
delete(StrHex,length(StrHex)-1,2)
for I := 0 to Length(StrHex) div 2 - 1 do
begin
Temp := Copy(StrHex, I * 2 + 1, 2)
Str := Str + Chr(HexToInt(Temp))
end
Result := DecryStr(Str, Key)
except
result:=''
end
end
end.
#include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> #include "Schedle.h" class CShift{ public: DWORDLONG mask[16] int step[16] CShift(){ for(int i=0i<16i++){ step[i]=2 mask[i]=0xc000000 } step[0]=step[1]=step[8]=step[15]=1 mask[0]=mask[1]=mask[8]=mask[15]=0x8000000 } } class CDES{ public: CDES(){ m_dwlKey=0 m_dwlData=0 ConvertTableToMask(dwlKey_PC_1,64) //PrintTable(dwlKey_PC_1,7,8) ConvertTableToMask(dwlKey_PC_2,56) ConvertTableToMask(dwlData_IP,64) ConvertTableToMask(dwlData_Expansion,32) ConvertTableToMask(dwlData_FP,64) ConvertTableToMask(dwlData_P,32) Generate_S() } void PrintBit(DWORDLONG) void EncryptKey(char *) unsigned char* EncryptData(unsigned char *) unsigned char* DescryptData(unsigned char*) private: void ConvertTableToMask(DWORDLONG *,int) void Generate_S(void) void PrintTable(DWORDLONG*,int,int) DWORDLONG ProcessByte(unsigned char*,BOOL) DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int) void Generate_K(void) void EncryptKernel(void) DWORDLONG Generate_B(DWORDLONG,DWORDLONG*) /*For verify schedule permutation only*/ DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int) /**************************************/ DWORDLONG dwlData_S[9][4][16] CShift m_shift DWORDLONG m_dwlKey DWORDLONG m_dwlData DWORDLONG m_dwl_K[17] } void CDES::EncryptKey(char *key){ printf("\nOriginal Key: %s",key) m_dwlKey=ProcessByte((unsigned char*)key,TRUE) // PrintBit(m_dwlKey) m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56) // PrintBit(m_dwlKey) Generate_K() // printf("\n******************************************\n") } void CDES::Generate_K(void){ DWORDLONG C[17],D[17],tmp C[0]=m_dwlKey>>28 D[0]=m_dwlKey&0xfffffff for(int i=1i<=16i++){ tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]) C[i]=((C[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]) D[i]=((D[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff m_dwl_K[i]=(C[i]<<28)|D[i] m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48) } } DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){ unsigned char tmp DWORDLONG byte=0 int i=0 while(i<8){ while(*key){ if(byte!=0) byte<<=8 tmp=*key if(shift) tmp<<=1 byte|=tmp i++ key++ } if(i<8) byte<<=8 i++ } return byte } DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWOR 基于des算法的rfid安全系统DLONG* dwlTable,int nDestLen){ int i=0 DWORDLONG tmp=0,moveBit while(i<nDestLen){ moveBit=1 if(dwlTable[i]&dwlPara){ moveBit<<=nDestLen-i-1 tmp|=moveBit } i++ } return tmp } DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){ DWORDLONG tmp=0 int i=nDestLen-1 while(dwlPara!=0){ if(dwlPara&0x01) tmp|=dwlTable[i] dwlPara>>=1 i-- } return tmp } void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){ int i,j for(i=0i<rowi++){ printf("\n") getch() for(j=0j<colj++) PrintBit(dwlPara[i*col+j]) } } void CDES::PrintBit(DWORDLONG bitstream){ char out[76] int i=0,j=0,space=0 while(bitstream!=0){ if(bitstream&0x01) out[i++]='1' else out[i++]='0' j++ if(j%8==0){ out[i++]=' ' space++ } bitstream=bitstream>>1 } out[i]='\0' strcpy(out,strrev(out)) printf("%s **:%d\n",out,i-space) } void CDES::ConvertTableToMask(DWORDLONG *mask,int max){ int i=0 DWORDLONG nBit=1 while(mask[i]!=0){ nBit=1 nBit<<=max-mask[i] mask[i++]=nBit } } void CDES::Generate_S(void){ int i int j,m,n m=n=0 j=1 for(i=0i<512i++){ dwlData_S[j][m][n]=OS[i] n=(n+1)%16 if(!n){ m=(m+1)%4 if(!m) j++ } } } unsigned char * CDES::EncryptData(unsigned char *block){ unsigned char *EncrytedData=new unsigned char(15) printf("\nOriginal Data: %s\n",block) m_dwlData=ProcessByte(block,0) // PrintBit(m_dwlData) m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64) EncryptKernel() // PrintBit(m_dwlData) DWORDLONG bit6=m_dwlData for(int i=0i<11i++){ EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46 bit6>>=6 } EncrytedData[11]='\0' printf("\nAfter Encrypted: %s",EncrytedData) for(i=0i<8i++){ EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff) m_dwlData>>=8 } EncrytedData[8]='\0' return EncrytedData } void CDES::EncryptKernel(void){ int i=1 DWORDLONG L[17],R[17],B[9],EK,PSB L[0]=m_dwlData>>32 R[0]=m_dwlData&0xffffffff for(i=1i<=16i++){ L[i]=R[i-1] R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48)//Expansion R EK=R[i-1]^m_dwl_K[i]//E Permutation PSB=Generate_B(EK,B)//P Permutation R[i]=L[i-1]^PSB } R[16]<<=32 m_dwlData=R[16]|L[16] m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64) } unsigned char* CDES::DescryptData(unsigned char *desData){ int i=1 unsigned char *DescryptedData=new unsigned char(15) DWORDLONG L[17],R[17],B[9],EK,PSB DWORDLONG dataPara dataPara=ProcessByte(desData,0) dataPara=PermuteTable(dataPara,dwlData_IP,64) R[16]=dataPara>>32 L[16]=dataPara&0xffffffff for(i=16i>=1i--){ R[i-1]=L[i] L[i]=PermuteTable(L[i],dwlData_Expansion,48)//Expansion L EK=L[i]^m_dwl_K[i]//E Permutation PSB=Generate_B(EK,B)//P Permutation L[i-1]=R[i]^PSB } L[0]<<=32 dataPara=L[0]|R[0] dataPara=PermuteTable(dataPara,dwlData_FP,64) // PrintBit(dataPara) for(i=0i<8i++){ DescryptedData[7-i]=(unsigned char)(dataPara&0xff) dataPara>>=8 } DescryptedData[8]='\0' printf("\nAfter Decrypted: %s\n",DescryptedData) return DescryptedData } DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){ int i,m,n DWORDLONG tmp=0 for(i=8i>0i--){ block[i]=EKPara&0x3f m=(int)(block[i]&0x20)>>4 m|=block[i]&0x01 n=(int)(block[i]<<1)>>2 block[i]=dwlData_S[i][m][n] EKPara>>=6 } for(i=1i<=8i++){ tmp|=block[i] tmp<<=4 } tmp>>=4 tmp=PermuteTable(tmp,dwlData_P,32) return tmp } void main(void){ CDES des des.EncryptKey("12345678") unsigned char *result=des.EncryptData((unsigned char*)"DemoData") des.DescryptData(result) }[1]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)