delphi des算法的源程序

delphi des算法的源程序,第1张

unit U_DES

{

调用时只需要调用下面两个函数即可。

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]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12144098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存