VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3390|回复: 8

[分享] DES加密/解密,3DES加密/解密,AES加密/解密,RSA加密/解密,SM3

[复制链接]
33_avatar_middle
在线会员 发表于 2014-6-13 14:50:49 | 显示全部楼层 |阅读模式

对选定文本文件进行DES加密/解密,3DES加密/解密,AES加密/解密,RSA加密/解密,SM3验证功能。


1 开发环境:
Windows7 64位+vs2008 (MFC)
系统配置:
cup :Core i3;           显卡:集成显 卡;    内存:4G   操作系统:windos7 64位。
运行的主文件名: me.exe
2 程序使用及菜单说明
本程序可以对选定文本文件进行DES加密/解密,3DES加密/解密,AES加密/解密,RSA加密/解密,SM3验证功能。
程序可指定文件,指定加密/解密算法以及密钥。
程序可将加密后的文件存储为指定的文件
程序可以显示出算法运行的时间。

3 功能说明
双击me.exe运行程序,打开主界面。
点击“选择明文文件”按钮可以得到如下的打开文件对话框:
选中需要进行加密的文件,点击打开,文件的内容就会显示在主界面上的明文框中,
接下来点击主界面的加密选项     
在该界面中选中自己想要对文件进行加密的算法,在前面的单选框中点击选中,然后输入相应的算法的密钥。点击完成之后自动回到主界面。此时,点击”加密”按钮,就会开始加密,这时会先弹出一个对话框出来让指定要存储的密文的文件.

  如果指定的文件已经存在就会提示:”该文件已经存在,是否替换?”选择是,则开始加密,并且将加密后的内容显示在密文框中。如果不存在该文件则直接加密,并且创建密文文件和现实密文内容到对话框中,并且显示出时间。

当我们需要对加密之后的文件进行解密时,只需要点击“选择密文文件”选择刚才存储的密文文件,然后选择解密选项,选择加密时相同的算法,如果是对称加密算法(DES、3DES、AES),则直接输入加密时的密码,再选择解密就会对密文文件进行解密,并且弹出对话框让你选择存储为的文件。如果是非对称加密算法(RSA),则在加密的时候首先点击生成密钥对,如下图(图3-4-1)所示:
   
                            图3-4-1   
然后将(n,d)记下来,在解密时输入即可。
5、如果是SM3散列算法,则在加密时没有密钥一说,该算法只能够验证,即在加密时将明文用SM3散列算法进行加密之后存储起来,当解密的时候用同样的算法将明文进行加密,我们只需要比较加密之后的内容是否相同来判断明文内容是否被改动过,如果改动过就会提示匹配失败,否则提示匹配成功。

4 自己设计的类函数功能及其接口说明
本程序主要设计了AES类,DES类,SM3类,DecrypOptionDLg类,
EncrypOptionDlg类,CmeDlg类,CmeApp类等类。
下面就介绍一下各个类吧!CmeDlg类和CmeApp类是创建MFC时自带的对话框类和应用程序类,在CmeDlg类中添加了一些打开文件,存储文件,显示文件内容,计算运行时间以及选择相应的算法的简单功能。
下面主要介绍几个算法类:
1、class CDES
{
public:
        CDES(){};//
public:
        void inttoch(_int64 temp,char ch[4]);

        unsigned int PM(unsigned int x);          /////////////32位置换

        unsigned int Sbox(unsigned int x[2]);         /////////////////// s 合置换

        void Extend(unsigned int x,unsigned int y[2]);     /////////////扩展换算
        unsigned int LTr(unsigned int x,unsigned int y);       ////////////// 28位密钥移位
        void PC1(unsigned int x[2]);      ////////////// 密钥置换64位到位
        void PC2(unsigned x[2]);        //////////// 密钥置换56位到48位
        void Ckey(unsigned int x[2],unsigned int y[16][2]);
        void cryption(unsigned int text[2],unsigned int key[16][2],int flag);
        unsigned int chtoint(char ch[4]);
        int filecryption(char *fname,char ch[9],int crypflag);// 文件的DES加密函数
        int file_TriDES_encryption(char *fname,char ch[18],int crypflag);        // 文件的DES加密函数
};





CDES::void  inttoch(int temp,char ch[4]);
返回值:无
参数1:int temp//第一个参数temp为int类型,需要转换为char类型的整数;
参数2:char ch[4]//第二个参数,将第一个参数转换之后存储在该char型数组变量中。
功能:该函数将一个整型数字 temp转换成字符类型,存储到ch[4]数组中。

CDES::unsigned int chtoint(char ch[4]);
返回值:转换后的int类型
参数:需要转化的4个char类型
功能:将4个char类型变换为一个int类型。

CDES::unsigned int  PM(unsigned int x);
返回值:unsigned int
参数1:需要置换的32位bit
功能:32位置换

CDES:: int Sbox(unsigned int x[2]);         
返回值:置换之后的的32位
参数:需要进行S盒置换的64位
功能:S盒置换

CDES::void Extend(unsigned int x,unsigned int y[2]);     
返回值:无
参数1:unsigned int x,需要扩展的32位
参数2:unsigned in y[2] ,扩展后的内容
功能:扩展换算

CDES::unsigned int LTr(unsigned int x,unsigned int y);
返回值:移位后的内容
参数1:移位的位置标号
参数2:需要移位的内容
功能:28位密钥移位

CDES::void PC1(unsigned int x[2]);
返回值:无
参数:需要置换的密钥
功能:密钥置换64位到56位

CDES::void PC2(unsigned x[2]);
返回值:无
参数:需要置换的密钥
功能:密钥置换56位到48位

CDES::void Ckey(unsigned int x[2],unsigned int y[16][2]);
返回值:无
参数1:密钥的初始值
参数2:每一轮的密钥
功能:密钥生成
CDES::void cryption(unsigned int text[2],unsigned int key[16][2],int flag);
返回值:无
参数1:需要加密的64位分组
参数2:密钥
参数3:加密还是解密的标记
功能:加解密

CDES::int filecryption(char *fname,char ch[9],int crypflag);
返回值:加密是否成功的标识
参数1:需要加密的文件指针
参数2:密钥
参数3:加密/解密的标识
功能:DES加/解密文件函数

CDES::int file_TriDES_encryption(char *fname,char ch[18],int crypflag);
返回值:加密是否成功的标识
参数1:需要加密的文件指针
参数2:密钥
参数3:加密/解密的标识
功能:3DES加/解密文件函数


2、class AES  
{
public:
        AES(unsigned char* key);
        virtual ~AES();
        unsigned char* Cipher(unsigned char* input);
        unsigned char* InvCipher(unsigned char* input);
        void* Cipher(void* input, int length=0);
        void* InvCipher(void* input, int length);

private:
        unsigned char Sbox[256];
        unsigned char InvSbox[256];
        unsigned char w[11][4][4];

        void KeyExpansion(unsigned char* key, unsigned char w[][4][4]);
        unsigned char FFmul(unsigned char a, unsigned char b);

        void SubBytes(unsigned char state[][4]);
        void ShiftRows(unsigned char state[][4]);
        void MixColumns(unsigned char state[][4]);
        void AddRoundKey(unsigned char state[][4], unsigned char k[][4]);

        void InvSubBytes(unsigned char state[][4]);
        void InvShiftRows(unsigned char state[][4]);
        void InvMixColumns(unsigned char state[][4]);
};


AES::unsigned char* Cipher(unsigned char* input);
返回值 :加密后的内容
参数:需要加密的内容
功能:AES加密

AES::        unsigned char* InvCipher(unsigned char* input);
返回值 :解密后的内容
参数:需要解密的内容
功能:AES解密

AES::void* Cipher(void* input, int length=0);
返回值 :加密后的内容
参数1:需要加密的内容
参数2:需要加密内容的长度
功能:AES加密

AES::void* InvCipher(void* input, int length);
返回值 :解密后的内容
参数1:需要解密的内容
参数2:需要解密内容的长度
功能:AES解密

AES::void KeyExpansion(unsigned char* key, unsigned char w[][4][4]);
返回值 :无
参数1:需要扩展的密钥
参数2:扩展后的密钥
功能:密钥扩展





AES::unsigned char FFmul(unsigned char a, unsigned char b);
返回值 :乘法结果
参数1:乘数a
参数2:乘数b
功能:有限域GF(28)上的乘法

AES::        void SubBytes(unsigned char state[][4]);
返回值 :无
参数:需要处理的内容
功能:字节替换

AES::        void ShiftRows(unsigned char state[][4]);
返回值 :无
参数:需要行移位变换的矩阵
功能:行移位变换

AES::void MixColumns(unsigned char state[][4]);
返回值 :无
参数:需要列混淆变换的矩阵
功能:列混淆变换

AES::        void AddRoundKey(unsigned char state[][4], unsigned char k[][4]);
返回值 :无
参数1:需要的密钥矩阵
参数2:变换后的密钥矩阵
功能:轮密钥加变换

AES::void InvSubBytes(unsigned char state[][4]);
返回值 :无
参数1:替代的矩阵
功能:逆字节替代

AES::void InvShiftRows(unsigned char state[][4]);
返回值 :无
参数:需要逆行移位变换的矩阵
功能:逆行移位变换

AES::void InvMixColumns(unsigned char state[][4]);
返回值 :无
参数:需要逆列混淆变换的矩阵
功能:逆列混淆变换


       
SM3
void SM3_Init();
返回值:无
参数:无
功能:SM3相关初始化


void SM3_Update(BYTE *message, DWORD length);
返回值:无
参数1:需要散列的消息指针
参数2:散列消息长度
功能:散列处理消息函数

void SM3_Final(DWORD *out_hash);
返回值:无
参数:需要输出的hash值指针
功能:转换成hash密文

RSA

class DecrypOptionDlg : public CDialog
{
        DECLARE_DYNAMIC(DecrypOptionDlg)

public:
        DecrypOptionDlg(CWnd* pParent = NULL);   // 标准构造函数
        virtual ~DecrypOptionDlg();

// 对话框数据
        enum { IDD = IDD_DIALOG_DECRYP_CHOSE };

protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

        DECLARE_MESSAGE_MAP()
public:
        afx_msg void OnBnClickedButtonChoseFinish();
        //CString mDesUnKey;
        CString m3DesUnKey;
        //CString mAesUnKey;
        int CheckState;
        CString mDesUnKey;
        CString mAesUnKey;
        afx_msg void OnBnClickedButtonCreateKeys();
        int judge_num(long n);
        int BianaryTransform(int num, int bin_num[]);
        long long Modular_Exonentiation(long long a, int b, int n);

        long m_rsa_decry_d;
        long m_rsa_decry_n;
};

DecrypOptionDlg ::int judge_num(long n);
返回值:int类型的标识符,标识是否是素数
参数:需要判定的数
功能:判定一个数是否是素数

DecrypOptionDlg ::OnBnClickedButtonChoseFinish()
返回值:无
参数:无
功能:选择算法和密钥设置完成

DecrypOptionDlg ::afx_msg void OnBnClickedButtonCreateKeys();
返回值:无
参数:无
功能:创建RAS密钥按钮响应函数

DecrypOptionDlg ::int BianaryTransform(int num, int bin_num[]);
返回值:二进制的位数
参数1:需要转换的数字
参数2:存储二进制数的数组
功能:将一个数字转换为二进制


DecrypOptionDlg ::long long Modular_Exonentiation(long long a, int b, int n);
返回值:加密后的密文
参数1:需要加密的明文
参数2:私钥
参数3:模
功能:RSA加密






5、CEncrypOptionDlg和CDecrypOptionDlg相似

6、class CmeDlg : public CDialog
{
// 构造
public:
        CmeDlg(CWnd* pParent = NULL);        // 标准构造函数

// 对话框数据
        enum { IDD = IDD_ME_DIALOG };

        protected:
        virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV 支持


// 实现
protected:
        HICON m_hIcon;

        // 生成的消息映射函数
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        void OnSize(UINT nType, int cx, int cy);
        afx_msg HCURSOR OnQueryDragIcon();
        DECLARE_MESSAGE_MAP()
public:
        afx_msg void OnBnClickedButtonChosePlainFile();
        CString strTemp ;//明文字符串
        double m_nLineCount1;
        double m_nLineCount2;
        CString m_edit_plain;
        CFile myMingwenFile;
        CFile myMiwenFile;
        CPoint Old;
        //afx_msg void OnBnClickedButtonChoseEncrypAlogrithm();
        afx_msg void OnBnClickedButtonEncrypOption();
        afx_msg void OnBnClickedButtonEncryp();
        afx_msg void OnBnClickedButtonChoseCipherFile();
        afx_msg void OnBnClickedButtonChoseDncrypAlogrithm();
        afx_msg void OnBnClickedButtonDecryp();
        CString m_edit_miwen;
        CRect m_rect;
};


CmeDlg ::afx_msg void OnBnClickedButtonChosePlainFile();
返回值:无
参数:无
功能:选择明文文件

CmeDlg::        afx_msg void OnBnClickedButtonEncrypOption();
返回值:无
参数:无
功能:选择加密选项

CmeDlg::afx_msg void OnBnClickedButtonEncryp();
返回值:无
参数:无
功能:加密 功能按钮 响应函数

CmeDlg:afx_msg void OnBnClickedButtonChoseCipherFile();
返回值:无
参数:无
功能:选择明文文件
CmeDlg:afx_msg void OnBnClickedButtonChoseDncrypAlogrithm();
返回值:无
参数:无
功能:选择解密算法

       
CmeDlg:afx_msg void OnBnClickedButtonDecryp();
返回值:无
参数:无
功能:解密功能按钮 响应函数

图片1.png
图片2.png
图片3.png

me.zip

287.24 KB, 下载次数: 130, 下载积分: 驿站币 -1

评分

参与人数 2威望 +4 驿站币 +8 +1 +6 收起 理由
02_avatar_small Youfal + 2 + 5 + 1 + 3 学习楼主的分享精神!
51_avatar_small Syc + 2 + 3 + 3 感谢分享!

查看全部评分





上一篇:Socket实现发送HTTP请求
下一篇:二进制转十进制一法
51_avatar_middle
online_admins 发表于 2014-6-13 15:14:17 | 显示全部楼层
这个是好东东,我得下载来读读!
59_avatar_middle
在线会员 发表于 2014-6-13 16:00:56 | 显示全部楼层
我希望做个插件 用exe来加载解密 大牛你能不能搞定啊
18_avatar_middle
在线会员 发表于 2014-7-6 11:03:07 | 显示全部楼层
多谢了 正好需要这个
05_avatar_middle
在线会员 发表于 2017-6-6 17:25:48 | 显示全部楼层
这个可以有!
71_avatar_middle
在线会员 发表于 2018-1-26 11:10:36 | 显示全部楼层
好东西,过来看看
71_avatar_middle
在线会员 发表于 2018-2-7 10:57:48 | 显示全部楼层
学习学习……
10_avatar_middle
在线会员 发表于 2018-7-13 07:42:55 | 显示全部楼层
感谢分享,非常不错
81_avatar_middle
在线会员 发表于 2018-11-28 08:06:33 | 显示全部楼层
感觉好牛逼啊,下载来学习了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-26 03:31

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表