程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> DES加密解密工具2.1及其代碼——支持字符串及文件加密,支持3重DES

DES加密解密工具2.1及其代碼——支持字符串及文件加密,支持3重DES

編輯:關於.NET

一.DES 2.1 說明

最近非常的忙,事情都已經堆著了。所以遲遲沒有更新博客,請各位需要代碼 的朋友諒解,再次給那些給那些最近留言的朋友說一聲對不起。

今天我把代碼發上來,並再次聲明,DES 1.0修正版的代碼是正確的,但修正 時沒有更新DES1.2,所以DES1.2是錯誤的,希望以後大家不要再問同樣的問題。 DES 2.x是正確的。

下面我們先看看DES 2.1 的截圖:

二. DES 2.1的簡介:

1.支持任意長度字符串加密解密

2.明文、密鑰可以不足8字節

3.支持回車換行,Tab等特殊字符

4.密文可以選擇三種方式顯示

5.支持3重DES

6.支持文件加密、解密

7.加密時顯示進度

三.DES 算法介紹

關於DES算法的介紹大家可以看我博客裡的另一篇文章,[原創]DES算法的介紹 以及實現(含上次DES程序1.0的源碼),所以在此不在重述。

四. yxyDES2 Class提供的Public函數

下面我們來看看yxyDES2 類(Class)裡public函數和它們的用法:

//功能:產生16個28位的key
        //參數:源8位的字符串(key),存放key的序號0-1
        //結果:函數將調用private CreateSubKey將結果存於char SubKeys[keyN][16][48]
        void InitializeKey(char* srcBytes,unsigned int keyN);

        //功能:加密8位字符串
        //參數:8位字符串,使用Key的序號0-1
        //結果:函數將加密後結果存放於private szCiphertext[16]
        //      用戶通過屬性Ciphertext得到
        void EncryptData(char* _srcBytes,unsigned int keyN);

        //功能:解密16位十六進制字符串
        //參數:16位十六進制字符串,使用Key的序號0-1
        //結果:函數將解密候結果存放於private szPlaintext[8]
        //      用戶通過屬性Plaintext得到
        void DecryptData(char* _srcBytes,unsigned int keyN);

        //功能:加密任意長度字符串
        //參數:任意長度字符串,長度,使用Key的序號0-1
        //結果:函數將加密後結果存放於private szFCiphertextAnyLength[8192]
        //      用戶通過屬性CiphertextAnyLength得到
        void EncryptAnyLength(char* _srcBytes,unsigned int _bytesLength,unsigned int keyN);

        //功能:解密任意長度十六進制字符串
        //參數:任意長度字符串,長度,使用Key的序號0-1
        //結果:函數將加密後結果存放於private szFPlaintextAnyLength[8192]
        //      用戶通過屬性PlaintextAnyLength得到
        void DecryptAnyLength(char* _srcBytes,unsigned int _bytesLength, unsigned int keyN);

        //功能:Bytes到Bits的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區大小
        void Bytes2Bits(char *srcBytes, char* dstBits, unsigned int sizeBits);

        //功能:Bits到Bytes的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區大小
        void Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits);

        //功能:Int到Bits的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針
        void Int2Bits(unsigned int srcByte, char* dstBits);

        //功能:Bits到Hex的轉換
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區大小
        void Bits2Hex(char *dstHex, char* srcBits, unsigned int sizeBits);

        //功能:Bits到Hex的轉換
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區大小
        void Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits);

        //szCiphertextInBinary的get函數
        char* GetCiphertextInBinary();

        //szCiphertextInHex的get函數
        char* GetCiphertextInHex();

        //Ciphertext的get函數
        char* GetCiphertextInBytes();

        //Plaintext的get函數
        char* GetPlaintext();

        //CiphertextAnyLength的get函數
        char* GetCiphertextAnyLength();

        //PlaintextAnyLength的get函數
        char* GetPlaintextAnyLength();

五. 加密、解密示例

加密時,首先初始化Key,如果是3重DES需要初始化兩個Key,InitializeKey 函數的第一個參數是char *key,第二個參數含義是指定初始化第幾個key,即 keyNum:

myDES->InitializeKey(szSourceKey1,0);
if(bIs3DES)
{
    myDES->InitializeKey(szSourceKey2,1);
}

初始化完Key以後我們就可以調用加密、解密函數進行相應操作了,以下代碼 展示了任意長度字符串解密:

myDES->InitializeKey(szSourceKey1,0);
if(bIs3DES)
{
        myDES->InitializeKey(szSourceKey2,1); //key2
        //D(key0)-E(key1)-D(key0)
        myDES->DecryptAnyLength (szCiphertextData,ConvertOtherFormat2Ciphertext (strCiphertext.GetBuffer()),0);
        myDES->EncryptAnyLength(myDES- >GetPlaintextAnyLength(),strlen(myDES->GetPlaintextAnyLength ()),1);
        myDES->DecryptAnyLength(myDES- >GetCiphertextAnyLength(),strlen(myDES->GetCiphertextAnyLength ()),0);
}
else
{
        //Decrypt
        myDES->DecryptAnyLength (szCiphertextData,ConvertOtherFormat2Ciphertext (strCiphertext.GetBuffer()),0);
}

六.關於一些特殊情況的特別說明:yxyDES2提供一些轉換函數

具體示例我的代碼裡都有,大家可以下載了看看,對於有特殊要求的朋友來說 ,比如要用16進制Key,或2進制明文等,大家可以調用yxyDES2 類裡的幾個相應 的轉換函數,將其轉換成byte,即char *。以下是這幾個函數的定義:

//功能:Bytes到Bits的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區 大小
        void Bytes2Bits(char *srcBytes, char* dstBits,  unsigned int sizeBits);

        //功能:Bits到Bytes的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區 大小
        void Bits2Bytes(char *dstBytes, char* srcBits,  unsigned int sizeBits);

        //功能:Int到Bits的轉換,
        //參數:待變換字符串,處理後結果存放緩沖區指針
        void Int2Bits(unsigned int srcByte, char*  dstBits);

        //功能:Bits到Hex的轉換
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區 大小
        void Bits2Hex(char *dstHex, char* srcBits,  unsigned int sizeBits);

        //功能:Bits到Hex的轉換
        //參數:待變換字符串,處理後結果存放緩沖區指針,Bits緩沖區 大小
        void Hex2Bits(char *srcHex, char* dstBits,  unsigned int sizeBits);

七.關於文件加密

其實文件加密很簡單的,類裡沒有提供,但是調用yxyDES2類裡的標准加密函 數很容易就搞定了,這是示例:

void CDESToolDlg::OnBnClickedButtonFileGoE()
{
    FILE *fpSrc,*fpDst;
    CString szSrcPath,szDstPath,szKey1,szKey2;
    char buff[8] = {0};
    long fileSize = 0, hasDone = 0;

    edtFileSrc.GetWindowText(szSrcPath);
    edtFileDst.GetWindowText(szDstPath);
    edtFileKey1.GetWindowText(szKey1);
    edtFileKey2.GetWindowText(szKey2);

    if((fpSrc = fopen(szSrcPath.GetBuffer(),"rb")) == NULL)
    {
        MessageBox("打不開源文件!","錯誤",MB_OK |  MB_ICONERROR);
        return;
    }
    if((fpDst = fopen(szDstPath.GetBuffer(),"wb")) == NULL)
    {
        MessageBox("打不開目的文件!","錯誤",MB_OK |  MB_ICONERROR);
        return;
    }

    fseek(fpSrc,0,SEEK_SET);
    fseek(fpSrc,0,SEEK_END);
    fileSize = ftell(fpSrc);
    rewind(fpSrc);
    prcsbar.SetRange(0,100);
    prcsbar.ShowWindow(SW_SHOW);
    myDES->InitializeKey(szKey1.GetBuffer(),0);

    if(chbFileTDES.GetCheck())
    {
        myDES->InitializeKey(szKey2.GetBuffer(),1);
        while(!feof(fpSrc))
        {
            memset(buff,0,8);
            fread(buff,sizeof(char),8,fpSrc);
            //E(key0)-D(key1)-E(key0)
            myDES->EncryptData(buff, 0);
            myDES->DecryptData(myDES- >GetCiphertextInBytes(), 1);
            myDES->EncryptData(myDES->GetPlaintext(),  0);
            fwrite(myDES->GetCiphertextInBytes(),sizeof (char),8,fpDst);
            hasDone += 8;
            prcsbar.SetPos((int)(hasDone  * 100 /  fileSize));
        }
    }
    else
    {
        while(!feof(fpSrc))
        {
            memset(buff,0,8);
            fread(buff,sizeof(char),8,fpSrc);
            myDES->EncryptData(buff,0);
            fwrite(myDES->GetCiphertextInBytes(),sizeof(char),8,fpDst);
            hasDone += 8;
            prcsbar.SetPos((int)(hasDone  * 100 /  fileSize));
        }
    }
    fclose(fpSrc);
    fclose(fpDst);
    prcsbar.SetPos(100);
    MessageBox("加密完成!","提示",MB_OK | MB_ICONINFORMATION);
    prcsbar.ShowWindow(SW_HIDE);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved