用C语言来实现DES加密算法(很急)两天内

用C语言来实现DES加密算法(很急)两天内,第1张

DES虽然不难但是挺繁复的,代码如下,关键点都有英文解释,仔细看。各个函数的功能都可以从函数名看出来。

#include "pchh"

#include "misch"

#include "desh"

NAMESPACE_BEGIN(CryptoPP)

/ Tables defined in the Data Encryption Standard documents

Three of these tables, the initial permutation, the final

permutation and the expansion operator, are regular enough that

for speed, we hard-code them They're here for reference only

Also, the S and P boxes are used by a separate program, genspc,

to build the combined SP box, Spbox[] They're also here just

for reference

/

#ifdef notdef

/ initial permutation IP /

static byte ip[] = {

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

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

};

/ final permutation IP^-1 /

static byte fp[] = {

40, 8, 48, 16, 56, 24, 64, 32,

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

};

/ expansion operation matrix /

static byte ei[] = {

32, 1, 2, 3, 4, 5,

4, 5, 6, 7, 8, 9,

8, 9, 10, 11, 12, 13,

12, 13, 14, 15, 16, 17,

16, 17, 18, 19, 20, 21,

20, 21, 22, 23, 24, 25,

24, 25, 26, 27, 28, 29,

28, 29, 30, 31, 32, 1

};

/ The (in)famous S-boxes /

static byte sbox[8][64] = {

/ S1 /

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,

/ S2 /

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,

/ S3 /

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,

/ S4 /

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,

/ S5 /

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,

/ S6 /

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,

/ S7 /

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,

/ S8 /

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

};

/ 32-bit permutation function P used on the output of the S-boxes /

static byte p32i[] = {

16, 7, 20, 21,

29, 12, 28, 17,

1, 15, 23, 26,

5, 18, 31, 10,

2, 8, 24, 14,

32, 27, 3, 9,

19, 13, 30, 6,

22, 11, 4, 25

};

#endif

/ permuted choice table (key) /

static const byte pc1[] = {

57, 49, 41, 33, 25, 17, 9,

1, 58, 50, 42, 34, 26, 18,

10, 2, 59, 51, 43, 35, 27,

19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15,

7, 62, 54, 46, 38, 30, 22,

14, 6, 61, 53, 45, 37, 29,

21, 13, 5, 28, 20, 12, 4

};

/ number left rotations of pc1 /

static const byte totrot[] = {

1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28

};

/ permuted choice key (table) /

static const byte pc2[] = {

14, 17, 11, 24, 1, 5,

3, 28, 15, 6, 21, 10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20, 13, 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

};

/ End of DES-defined tables /

/ bit 0 is left-most in byte /

static const int bytebit[] = {

0200,0100,040,020,010,04,02,01

};

/ Set key (initialize key schedule array) /

DES::DES(const byte key, CipherDir dir)

: k(32)

{

SecByteBlock buffer(56+56+8);

byte const pc1m=buffer; / place to modify pc1 into /

byte const pcr=pc1m+56; / place to rotate pc1 into /

byte const ks=pcr+56;

register int i,j,l;

int m;

for (j=0; j<56; j++) { / convert pc1 to bits of key /

l=pc1[j]-1; / integer bit location /

m = l & 07; / find bit /

pc1m[j]=(key[l>>3] & / find which key byte l is in /

bytebit[m]) / and which bit of that byte /

1 : 0; / and store 1-bit result /

}

for (i=0; i<16; i++) { / key chunk for each iteration /

memset(ks,0,8); / Clear key schedule /

for (j=0; j<56; j++) / rotate pc1 the right amount /

pcr[j] = pc1m[(l=j+totrot[i])<(j<28 28 : 56) l: l-28];

/ rotate left and right halves independently /

for (j=0; j<48; j++){ / select bits individually /

/ check bit that goes to ks[j] /

if (pcr[pc2[j]-1]){

/ mask it in if it's there /

l= j % 6;

ks[j/6] |= bytebit[l] >> 2;

}

}

/ Now convert to odd/even interleaved form for use in F /

k[2i] = ((word32)ks[0] << 24)

| ((word32)ks[2] << 16)

| ((word32)ks[4] << 8)

| ((word32)ks[6]);

k[2i+1] = ((word32)ks[1] << 24)

| ((word32)ks[3] << 16)

| ((word32)ks[5] << 8)

| ((word32)ks[7]);

}

if (dir==DECRYPTION) // reverse key schedule order

for (i=0; i<16; i+=2)

{

std::swap(k[i], k[32-2-i]);

std::swap(k[i+1], k[32-1-i]);

}

}

/ End of C code common to both versions /

/ C code only in portable version /

// Richard Outerbridge's initial permutation algorithm

/

inline void IPERM(word32 &left, word32 &right)

{

word32 work;

work = ((left >> 4) ^ right) & 0x0f0f0f0f;

right ^= work;

left ^= work << 4;

work = ((left >> 16) ^ right) & 0xffff;

right ^= work;

left ^= work << 16;

work = ((right >> 2) ^ left) & 0x33333333;

left ^= work;

right ^= (work << 2);

work = ((right >> 8) ^ left) & 0xff00ff;

left ^= work;

right ^= (work << 8);

right = rotl(right, 1);

work = (left ^ right) & 0xaaaaaaaa;

left ^= work;

right ^= work;

left = rotl(left, 1);

}

inline void FPERM(word32 &left, word32 &right)

{

word32 work;

right = rotr(right, 1);

work = (left ^ right) & 0xaaaaaaaa;

left ^= work;

right ^= work;

left = rotr(left, 1);

work = ((left >> 8) ^ right) & 0xff00ff;

right ^= work;

left ^= work << 8;

work = ((left >> 2) ^ right) & 0x33333333;

right ^= work;

left ^= work << 2;

work = ((right >> 16) ^ left) & 0xffff;

left ^= work;

right ^= work << 16;

work = ((right >> 4) ^ left) & 0x0f0f0f0f;

left ^= work;

right ^= work << 4;

}

/

// Wei Dai's modification to Richard Outerbridge's initial permutation

// algorithm, this one is faster if you have access to rotate instructions

// (like in MSVC)

inline void IPERM(word32 &left, word32 &right)

{

word32 work;

right = rotl(right, 4U);

work = (left ^ right) & 0xf0f0f0f0;

left ^= work;

right = rotr(right^work, 20U);

work = (left ^ right) & 0xffff0000;

left ^= work;

right = rotr(right^work, 18U);

work = (left ^ right) & 0x33333333;

left ^= work;

right = rotr(right^work, 6U);

work = (left ^ right) & 0x00ff00ff;

left ^= work;

right = rotl(right^work, 9U);

work = (left ^ right) & 0xaaaaaaaa;

left = rotl(left^work, 1U);

right ^= work;

}

inline void FPERM(word32 &left, word32 &right)

{

word32 work;

right = rotr(right, 1U);

work = (left ^ right) & 0xaaaaaaaa;

right ^= work;

left = rotr(left^work, 9U);

work = (left ^ right) & 0x00ff00ff;

right ^= work;

left = rotl(left^work, 6U);

work = (left ^ right) & 0x33333333;

right ^= work;

left = rotl(left^work, 18U);

work = (left ^ right) & 0xffff0000;

right ^= work;

left = rotl(left^work, 20U);

work = (left ^ right) & 0xf0f0f0f0;

right ^= work;

left = rotr(left^work, 4U);

}

// Encrypt or decrypt a block of data in ECB mode

void DES::ProcessBlock(const byte inBlock, byte outBlock) const

{

word32 l,r,work;

#ifdef IS_LITTLE_ENDIAN

l = byteReverse((word32 )inBlock);

r = byteReverse((word32 )(inBlock+4));

#else

l = (word32 )inBlock;

r = (word32 )(inBlock+4);

#endif

IPERM(l,r);

const word32 kptr=k;

for (unsigned i=0; i<8; i++)

{

work = rotr(r, 4U) ^ kptr[4i+0];

l ^= Spbox[6][(work) & 0x3f]

^ Spbox[4][(work >> 8) & 0x3f]

^ Spbox[2][(work >> 16) & 0x3f]

^ Spbox[0][(work >> 24) & 0x3f];

work = r ^ kptr[4i+1];

l ^= Spbox[7][(work) & 0x3f]

^ Spbox[5][(work >> 8) & 0x3f]

^ Spbox[3][(work >> 16) & 0x3f]

^ Spbox[1][(work >> 24) & 0x3f];

work = rotr(l, 4U) ^ kptr[4i+2];

r ^= Spbox[6][(work) & 0x3f]

^ Spbox[4][(work >> 8) & 0x3f]

^ Spbox[2][(work >> 16) & 0x3f]

^ Spbox[0][(work >> 24) & 0x3f];

work = l ^ kptr[4i+3];

r ^= Spbox[7][(work) & 0x3f]

^ Spbox[5][(work >> 8) & 0x3f]

^ Spbox[3][(work >> 16) & 0x3f]

^ Spbox[1][(work >> 24) & 0x3f];

}

FPERM(l,r);

#ifdef IS_LITTLE_ENDIAN

(word32 )outBlock = byteReverse(r);

(word32 )(outBlock+4) = byteReverse(l);

#else

(word32 )outBlock = r;

(word32 )(outBlock+4) = l;

#endif

}

void DES_EDE_Encryption::ProcessBlock(byte inoutBlock) const

{

eProcessBlock(inoutBlock);

dProcessBlock(inoutBlock);

eProcessBlock(inoutBlock);

}

void DES_EDE_Encryption::ProcessBlock(const byte inBlock, byte outBlock) const

{

eProcessBlock(inBlock, outBlock);

dProcessBlock(outBlock);

eProcessBlock(outBlock);

}

void DES_EDE_Decryption::ProcessBlock(byte inoutBlock) const

{

dProcessBlock(inoutBlock);

eProcessBlock(inoutBlock);

dProcessBlock(inoutBlock);

}

void DES_EDE_Decryption::ProcessBlock(const byte inBlock, byte outBlock) const

{

dProcessBlock(inBlock, outBlock);

eProcessBlock(outBlock);

dProcessBlock(outBlock);

}

void TripleDES_Encryption::ProcessBlock(byte inoutBlock) const

{

e1ProcessBlock(inoutBlock);

dProcessBlock(inoutBlock);

e2ProcessBlock(inoutBlock);

}

void TripleDES_Encryption::ProcessBlock(const byte inBlock, byte outBlock) const

{

e1ProcessBlock(inBlock, outBlock);

dProcessBlock(outBlock);

e2ProcessBlock(outBlock);

}

void TripleDES_Decryption::ProcessBlock(byte inoutBlock) const

{

d1ProcessBlock(inoutBlock);

eProcessBlock(inoutBlock);

d2ProcessBlock(inoutBlock);

}

void TripleDES_Decryption::ProcessBlock(const byte inBlock, byte outBlock) const

{

d1ProcessBlock(inBlock, outBlock);

eProcessBlock(outBlock);

d2ProcessBlock(outBlock);

}

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

各位好,请求各位java学习者帮助钉解决这个问题。

我想用des算法对我的名字进行加密

我也在网上下载了des算法,包括FileDES,SubKey,Des各程序,

可能没真正理解这些程序,所以我想调用都不知道将这些东西

组合起来,有知道的请帮帮忙啊!

解析:

package des;

import javaio;

import javanio;

import javaniochannelsFileChannel;

public class FileDES{

private static final boolean enc=true; 加密

private static final boolean dec=false; 解密

private String srcFileName;

private String destFileName;

private String inKey;

private boolean actionType;

private File srcFile;

private File destFile;

private Des des;

private void yzePath(){

String dirName;

int pos=srcFileNamestIndexOf("/");

dirName=srcFileNamesubstring(0,pos);

File dir=new File(dirName);

if (!direxists()){

Systemerrprintln(dirName+" is not exist");

Systemexit(1);

}else if(!dirisDirectory()){

Systemerrprintln(dirName+" is not a directory");

Systemexit(1);

}

pos=destFileNamestIndexOf("/");

dirName=destFileNamesubstring(0,pos);

dir=new File(dirName);

if (!direxists()){

if(!dirmkdirs()){

Systemoutprintln ("can not creat directory:"+dirName);

Systemexit(1);

}

}else if(!dirisDirectory()){

Systemerrprintln(dirName+" is not a directory");

Systemexit(1);

}

}

private static int replenish(FileChannel channel,ByteBuffer buf) throws IOException{

long byteLeft=channelsize()-channelposition();

if(byteLeft==0L)

return -1;

bufposition(0);

buflimit(bufposition()+(byteLeft<8 (int)byteLeft :8));

return channelread(buf);

}

private void file_operate(boolean flag){

des=new Des(inKey);

FileOutputStream outputFile=null;

try {

outputFile=new FileOutputStream(srcFile,true);

}catch (javaioFileNotFoundException e) {

eprintStackTrace(Systemerr);

}

FileChannel outChannel=outputFilegetChannel();

try{

if(outChannelsize()%2!=0){

ByteBuffer bufTemp=ByteBufferallocate(1);

bufTempput((byte)32);

bufTempflip();

outChannelposition(outChannelsize());

outChannelwrite(bufTemp);

bufTempclear();

}

}catch(Exception ex){

exprintStackTrace(Systemerr);

Systemexit(1);

}

FileInputStream inFile=null;

try{

inFile=new FileInputStream(srcFile);

}catch(javaioFileNotFoundException e){

eprintStackTrace(Systemerr);

Systemexit(1);

}

outputFile=null;

try {

outputFile=new FileOutputStream(destFile,true);

}catch (javaioFileNotFoundException e) {

eprintStackTrace(Systemerr);

}

FileChannel inChannel=inFilegetChannel();

outChannel=outputFilegetChannel();

ByteBuffer inBuf=ByteBufferallocate(8);

ByteBuffer outBuf=ByteBufferallocate(8);

try{

String srcStr;

String destStr;

while(true){

if (replenish(inChannel,inBuf)==-1) break;

srcStr=((ByteBuffer)(inBufflip()))asCharBuffer()toString();

inBufclear();

if (flag)

destStr=desenc(srcStr,srcStrlength());

else

destStr=desdec(srcStr,srcStrlength());

outBufclear();

if (destStrlength()==4){

for (int i = 0; i<4; i++) {

outBufputChar(destStrcharAt(i));

}

outBufflip();

}else{

outBufposition(0);

outBuflimit(2destStrlength());

for (int i = 0; i<destStrlength(); i++) {

outBufputChar(destStrcharAt(i));

}

outBufflip();

}

try {

outChannelwrite(outBuf);

outBufclear();

}catch (javaioIOException ex) {

exprintStackTrace(Systemerr);

}

}

Systemoutprintln (inChannelsize());

Systemoutprintln (outChannelsize());

Systemoutprintln ("EoF reached");

inFileclose();

outputFileclose();

}catch(javaioIOException e){

eprintStackTrace(Systemerr);

Systemexit(1);

}

}

public FileDES(String srcFileName,String destFileName,String inKey,boolean actionType){

thissrcFileName=srcFileName;

thisdestFileName=destFileName;

thisactionType=actionType;

yzePath();

srcFile=new File(srcFileName);

destFile=new File(destFileName);

thisinKey=inKey;

if (actionType==enc)

file_operate(enc);

else

file_operate(dec);

}

public static void main(String[] args){

String file1=SystemgetProperty("userdir")+"/111doc";

String file2=SystemgetProperty("userdir")+"/222doc";

String file3=SystemgetProperty("userdir")+"/333doc";

String passWord="1234ABCD";

FileDES fileDes=new FileDES(file1,file2,passWord,true);

FileDES fileDes1=new FileDES(file2,file3,passWord,false);

}

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

namespace ZU14

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//ZU14DES des = new ZU14DES();

ZU14DES des = null;

private void btn_jiami_Click(object sender, EventArgs e)

{

textBox2Text = desEncrypt(textBox1Text);

// MessageBoxShow("加密成功!", "提示", MessageBoxButtonsOK, MessageBoxIconAsterisk);

}

private void btn_jiemi_Click(object sender, EventArgs e)

{

textBox3Text = desDecrypt(textBox2Text);

//MessageBoxShow("解密成功!", "提示", MessageBoxButtonsOK, MessageBoxIconAsterisk);

}

private void btn_wjjiami_Click(object sender, EventArgs e)

{

OpenFileDialog open = new OpenFileDialog();

openInitialDirectory = @"d:\";

openFilter = "文本文件(txt,doc,xls)|txt;doc;xls";

if (openShowDialog()== DialogResultOK)

{

desEncryptFile(openFileName, openFileName);

MessageBoxShow("加密成功!", "提示", MessageBoxButtonsOK, MessageBoxIconAsterisk);

}

}

private void btn_wjjiemi_Click(object sender, EventArgs e)

{

OpenFileDialog open = new OpenFileDialog();

openInitialDirectory = @"d:\";

openFilter = "文本文件(txt,doc,xls)|txt;doc;xls";

if (openShowDialog() == DialogResultOK)

{

desDecryptFile(openFileName);

MessageBoxShow("解密成功!", "提示", MessageBoxButtonsOK, MessageBoxIconAsterisk);

}

}

private void button1_Click(object sender, EventArgs e)

{

zifusetmisi1 = textBox4TextTrim();

zifusetmisi2 = textBox5TextTrim();

des = new ZU14DES();

}

}

}

上面的代码是窗体的

下面是调用的两个类的

using System;

using SystemCollectionsGeneric;

using SystemText;

namespace ZU14

{

class zifu

{

private static string misi1;

private static string misi2;

public static string getmisi1

{

get

{

return misi1;

}

}

public static string setmisi1

{

set

{

misi1 = value;

}

}

public static string getmisi2

{

get

{

return misi2;

}

}

public static string setmisi2

{

set

{

misi2 = value;

}

}

}

}

using System;

using SystemCollectionsGeneric;

using SystemText;

using SystemIO;

using SystemSecurity;

using SystemSecurityCryptography;

using SystemCollections;

using SystemData;

using SystemWindowsForms;

namespace ZU14

{

class DES

{

string iv =zifugetmisi1; //"1234的yza";

string key = zifugetmisi2;//"123在yzb";

/// <summary>

/// DES加密偏移量,必须是>=8位长的字符串

/// </summary>

public string IV

{

get { return iv; }

set { iv = value; }

}

/// <summary>

/// DES加密的私钥,必须是8位长的字符串

/// </summary>

public string Key

{

get { return key; }

set { key = value; }

}

/// <summary>

/// 对字符串进行DES加密

/// </summary>

/// <param name="sourceString">待加密的字符串</param>

/// <returns>加密后的BASE64编码的字符串</returns>

public string Encrypt(string sourceString)

{

byte[] btKey = EncodingDefaultGetBytes(key);

byte[] btIV = EncodingDefaultGetBytes(iv);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

using (MemoryStream ms = new MemoryStream())

{

byte[] inData = EncodingDefaultGetBytes(sourceString);

try

{

using (CryptoStream cs = new CryptoStream(ms, desCreateEncryptor(btKey, btIV), CryptoStreamModeWrite))

{

csWrite(inData, 0, inDataLength);

csFlushFinalBlock();

}

return ConvertToBase64String(msToArray());

}

catch

{

throw;

}

}

}

/// <summary>

/// 对DES加密后的字符串进行解密

/// </summary>

/// <param name="encryptedString">待解密的字符串</param>

/// <returns>解密后的字符串</returns>

public string Decrypt(string encryptedString)

{

byte[] btKey = EncodingDefaultGetBytes(key);

byte[] btIV = EncodingDefaultGetBytes(iv);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

using (MemoryStream ms = new MemoryStream())

{

byte[] inData = ConvertFromBase64String(encryptedString);

try

{

using (CryptoStream cs = new CryptoStream(ms, desCreateDecryptor(btKey, btIV), CryptoStreamModeWrite))

{

csWrite(inData, 0, inDataLength);

csFlushFinalBlock();

}

return EncodingDefaultGetString(msToArray());

}

catch

{

throw;

}

}

}

/// <summary>

/// 对文件内容进行DES加密

/// </summary>

/// <param name="sourceFile">待加密的文件绝对路径</param>

/// <param name="destFile">加密后的文件保存的绝对路径</param>

public void EncryptFile(string sourceFile, string destFile)

{

if (!FileExists(sourceFile)) throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);

byte[] btKey = EncodingDefaultGetBytes(key);

byte[] btIV = EncodingDefaultGetBytes(iv);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

byte[] btFile = FileReadAllBytes(sourceFile);

using (FileStream fs = new FileStream(destFile, FileModeCreate, FileAccessWrite))

{

try

{

using (CryptoStream cs = new CryptoStream(fs, desCreateEncryptor(btKey, btIV), CryptoStreamModeWrite))

{

csWrite(btFile, 0, btFileLength);

csFlushFinalBlock();

}

}

catch

{

// throw;

}

finally

{

fsClose();

}

}

}

/// <summary>

/// 对文件内容进行DES加密,加密后覆盖掉原来的文件

/// </summary>

/// <param name="sourceFile">待加密的文件的绝对路径</param>

public void EncryptFile(string sourceFile)

{

EncryptFile(sourceFile, sourceFile);

}

/// <summary>

/// 对文件内容进行DES解密

/// </summary>

/// <param name="sourceFile">待解密的文件绝对路径</param>

/// <param name="destFile">解密后的文件保存的绝对路径</param>

public void DecryptFile(string sourceFile, string destFile)

{

if (!FileExists(sourceFile)) throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);

byte[] btKey = EncodingDefaultGetBytes(key);

byte[] btIV = EncodingDefaultGetBytes(iv);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

byte[] btFile = FileReadAllBytes(sourceFile);

using (FileStream fs = new FileStream(destFile, FileModeCreate, FileAccessWrite))

{

try

{

using (CryptoStream cs = new CryptoStream(fs, desCreateDecryptor(btKey, btIV), CryptoStreamModeWrite))

{

csWrite(btFile, 0, btFileLength);

csFlushFinalBlock();

}

}

catch

{

// MessageBoxShow(exMessage);

//throw;

}

finally

{

fsClose();

}

}

}

/// <summary>

/// 对文件内容进行DES解密,加密后覆盖掉原来的文件

/// </summary>

/// <param name="sourceFile">待解密的文件的绝对路径</param>

public void DecryptFile(string sourceFile)

{

DecryptFile(sourceFile, sourceFile);

}

}

}

有什么看不明白的,再联系我,我的账号就是我的QQ

以上就是关于用C语言来实现DES加密算法(很急)两天内全部的内容,包括:用C语言来实现DES加密算法(很急)两天内、用java实现des算法、VS中用C#编写一个DES(或3DES)加解密的Windows应用程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10066080.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存