AES加密算法

  • b4_577215
    了解作者
  • 3.8MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-23 06:37
    上传日期
基于MVC的实现的AES加密解密算法,采用的是Unicode编码的格式,每个字符占两个字节。所以输入的原文为八个字符。密钥根据长度不同为8个,12个或者16个不等。程序会首先将字符转化成十六进制再进行加密,每一步的加密解密过程都可以显示出来。
AESEncryption.zip
  • AESEncryption
  • Release
  • AESEncryption.log
    96B
  • res
  • AESEncryption.ico
    66.2KB
  • AESEncryption.rc2
    682B
  • AESEncryption.rc
    13.4KB
  • AESEncryption.aps
    104.7KB
  • stdafx.h
    1.6KB
  • AESEncryptionDlg.h
    1.6KB
  • AESEncryption.cpp
    2KB
  • resource.h
    2.6KB
  • AESEncryptionDlg.cpp
    25.6KB
  • AESEncryption.vcxproj.filters
    2KB
  • AESEncryption.sdf
    11.1MB
  • AESEncryption.vcxproj
    5.8KB
  • targetver.h
    234B
  • AESEncryption.vcxproj.user
    143B
  • stdafx.cpp
    146B
  • AESEncryption.h
    484B
内容介绍
// AESEncryptionDlg.cpp : 实现文件 // #include "stdafx.h" #include "AESEncryption.h" #include "AESEncryptionDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CAESEncryptionDlg 对话框 CAESEncryptionDlg::CAESEncryptionDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CAESEncryptionDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CAESEncryptionDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAESEncryptionDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(EncryptionBtn, &CAESEncryptionDlg::OnBnClickedEncryptionbtn) ON_BN_CLICKED(Radio192, &CAESEncryptionDlg::OnBnClickedRadio192) ON_BN_CLICKED(Radio256, &CAESEncryptionDlg::OnBnClickedRadio256) ON_BN_CLICKED(Radio128, &CAESEncryptionDlg::OnBnClickedRadio128) ON_BN_CLICKED(DecryptionBtn, &CAESEncryptionDlg::OnBnClickedDecryptionbtn) ON_BN_CLICKED(TimeTestStartBtn, &CAESEncryptionDlg::OnBnClickedTimeteststartbtn) END_MESSAGE_MAP() // CAESEncryptionDlg 消息处理程序 BOOL CAESEncryptionDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 ((CButton *)GetDlgItem(Radio128))->SetCheck(TRUE);//选上 ((CButton *)GetDlgItem(Radio192))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(Radio256))->SetCheck(FALSE);//不选上 ((CEdit*) GetDlgItem(KeyWords))->SetLimitText(8); ((CEdit*) GetDlgItem(OriginalWords))->SetLimitText(8); ((CEdit*) GetDlgItem(EncryptionStrBox))->SetLimitText(8); ((CEdit*)GetDlgItem(RunTimesBox))->SetWindowTextW(_T("1000")); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CAESEncryptionDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CAESEncryptionDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CAESEncryptionDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CAESEncryptionDlg::OnBnClickedEncryptionbtn() { // TODO: 在此添加控件通知处理程序代码 isTest = FALSE; ((CEdit*)GetDlgItem(EncryptionDetail))->SetWindowTextW(_T("")); int key_words_length; // ((CButton *)GetDlgItem(Radio128))->SetCheck(TRUE);//选上 // ((CButton *)GetDlgItem(Radio192))->SetCheck(FALSE);//不选上 // ((CButton *)GetDlgItem(Radio256))->SetCheck(FALSE);//不选上 if (((CButton *)GetDlgItem(Radio128))->GetCheck())//根据选择结果判断密钥长度128 192 256三种 { key_words_length = 4;//暂且为4即128位密钥 }else if (((CButton *)GetDlgItem(Radio192))->GetCheck())//根据选择结果判断密钥长度128 192 256三种 { key_words_length = 6;//暂且为4即128位密钥 }else if (((CButton *)GetDlgItem(Radio256))->GetCheck())//根据选择结果判断密钥长度128 192 256三种 { key_words_length = 8;//暂且为4即128位密钥 } CEdit* pBoxOne; CString key_words;//输入的密钥 CString original_words;//输入的明文 pBoxOne = (CEdit*) GetDlgItem(KeyWords); pBoxOne->GetWindowTextW(key_words); pBoxOne = (CEdit*)GetDlgItem(OriginalWords); pBoxOne->GetWindowTextW(original_words); if (key_words.GetLength()*16 == key_words_length*32) {//密钥长度正确 开始加密 if (original_words.GetLength()==8) { CString EncryptionStr = Encryption(original_words,key_words,key_words_length); pBoxOne = (CEdit*) GetDlgItem(EncryptionStrBox); pBoxOne->SetWindowTextW(EncryptionStr); CString key_str; for (int i = 0; i<(key_words_length+7)*4 ; i++) { if (i%4 == 0) { ((CEdit*)GetDlgItem(ExpansionKeyBox))->GetWindowTextW(key_str); CString str; str.Format(_T("%d"),i/4); ((CEdit*)GetDlgItem(ExpansionKeyBox))->SetWindowTextW(key_str+str+_T("轮密匙:")+"\r\n"); } for(int j = 0 ; j<4 ; j++) { CString temp(""); CString temp2(""); int a = NewKeyWords[i][j]/16; int b = NewKeyWords[i][j]%16; temp.Format(_T("%x"),a); temp2 = temp2+temp; temp.Format(_T("%x"),b); temp2 = temp2+temp+_T(" "); ((CEdit*)GetDlgItem(ExpansionKeyBox))->GetWindowTextW(key_str); ((CEdit*)GetDlgItem(ExpansionKeyBox))->SetWindowTextW(key_str+temp2); } ((CEdit*)GetDlgItem(ExpansionKeyBox))->GetWindowTextW(key_str); ((CEdit*)GetDlgItem(ExpansionKeyBox))->SetWindowTextW(key_str+"\r\n"); } }else{ MessageBox(_T("明文长度不够"),_T("提示"),MB_ICONWARNING); } }else{ //弹出提示框,提示密码长度不符合要求 MessageBox(_T("密钥长度不够"),_T("提示"),MB_ICONWARNING); } // CString str; // pBoxOne->GetWindowTextW(str); // BYTE buf[200]; // memcpy(buf,str.GetBuffer(str.GetLength()),str.GetLength()*2); // int i = str.GetLength(); // CString *pPhoneNum =new CString((wchar_t*)buf, str.GetLength()); // pBoxOne->SetWindowTextW(*pPhoneNum+" OK"); } CString CAESEncryptionDlg::Encryption(CString original_words, CString key_words, int key_words_length){//加密函数 int RoundTimes = key_words_length + 6;//加密轮数 int ExpansionKeyWordsLength = RoundTimes+1;//密匙四个字为一组 共有多少组 KeyExpansion(key_words,4*(RoundTimes+1));//密钥扩展 OriginalWordsToState(original_words);//得到状态矩阵 if (isTest == FALSE) { EncryptionDetails(_T("原文")); } AddRoundKey(0);//第0次 AddRoundkey if (isTest == FALSE) { EncryptionDetails(_T("ARdKy")); } for (int i = 1;i<=RoundTimes-1;i++)//第1到RoundTimeshare-1轮变换 { ByteSub(); if (isTest == FALSE) { EncryptionDetails(_T("S变换 ")); } ShiftRow(); if (isTest == FALSE) { EncryptionDetails(_T("行变换")); } MixColunm(); if (isTest == FALSE) { EncryptionDetails(_T("列变换")); } AddRoundKey(i); if (isTest == FALSE) { EncryptionDetails(_T("ARdKy")); } } //最后一轮变换 ByteSub(); if (isTest == FALSE) { EncryptionDetails(_T("S变换 ")); } ShiftRow(); if (isTest == FALSE) { EncryptionDetails(_T("行变换 ")); } AddRoundKey(RoundTimes); if (isTest == FALSE) { EncryptionDetails(_T("AdRdKy"
评论
    相关推荐