
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应用程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)