【C++】简单对称加密
2015-10-06 21:25
274 查看
#include <iostream> #include <string.h> #include <tchar.h> #include <windows.h> using namespace std; /* 简单的对称加密类 */ class symEncryption { private: CHAR *m_pData; CHAR *m_Key; CHAR *m_reSult; public: /* 设置加密的数据 */ BOOL setEncryData( CHAR *pszData, DWORD dwSizes ) { if ( NULL == pszData || NULL == dwSizes ) { return(FALSE); } if ( NULL != m_pData ) { delete[]m_pData; } this->m_pData = new CHAR[dwSizes]; if ( NULL == m_pData ) { return(FALSE); } memcpy( m_pData, pszData, dwSizes ); return(TRUE); } /* 设置数据钥匙 */ BOOL setKey( CHAR *pszKey, DWORD dwSizes ) { if ( NULL == pszKey || NULL == dwSizes ) { return(FALSE); } if ( NULL != m_Key ) { delete[]m_Key; } this->m_Key = new CHAR[dwSizes]; if ( NULL == m_Key ) { return(FALSE); } memcpy( m_Key, pszKey, dwSizes ); return(TRUE); } /* 加密数据 */ BOOL encryptionData() { if ( NULL == m_pData || NULL == m_Key ) { return(FALSE); } if ( NULL != m_reSult ) { delete[]m_reSult; } /* 生成和密文相同长度的密联流 */ DWORD dwDatalen = strlen( m_pData ); CHAR *pTemp = new CHAR[dwDatalen + 1](); /* 生成密联流 */ DWORD dwKeyLne = strlen( m_Key ); for ( int sum = 0; sum < dwDatalen; sum++ ) { pTemp[sum] = m_Key[sum % dwKeyLne + sum]; } pTemp[dwDatalen] = 0; /* Xor加密 */ if ( NULL != m_reSult ) { delete[]m_reSult; } m_reSult = new CHAR[dwDatalen + 1](); for ( int sum = 0; sum < dwDatalen; sum++ ) { m_reSult[sum] = pTemp[sum] ^ m_pData[sum]; } m_reSult[dwDatalen] = 0; delete[]pTemp; } /* 获取加密/解密的数据 */ DWORD getResultSize() { return(strlen( m_reSult ) + 1); } /* 获取加密后的数据 */ BOOL getResultData( CHAR *pszData ) { if ( NULL == pszData ) { return(FALSE); } memcpy( pszData, this->m_reSult, strlen( m_reSult ) + 1 ); } ~symEncryption() { if ( NULL != this->m_pData ) { delete[]this->m_pData; this->m_pData = NULL; } if ( NULL != this->m_Key ) { delete[]this->m_Key; this->m_Key = NULL; } if ( NULL != this->m_reSult ) { delete[]this->m_reSult; this->m_reSult = NULL; } } }; int main( void ) { /* 【字符串加密测试】 */ /* 加密数据 */ char * str = "hello"; char *key = "fishc"; symEncryption encryData; /* 设置加密的数据 */ encryData.setEncryData( str, strlen( str ) + 1 ); /* 设置加密密联 */ encryData.setKey( key, strlen( key ) + 1 ); /* 设置加密数据 */ encryData.encryptionData(); cout << "数据大小" << encryData.getResultSize() << endl; cout << "加密前" << str << endl; char buffer[20] = { 0 }; /* 得到加密后的数据 */ encryData.getResultData( buffer ); cout << "加密后" << buffer << endl; /* 解密数据 */ symEncryption decryptData; /* 设置解密数据密联 */ decryptData.setKey( key, strlen( key ) + 1 ); /* 设置解密的数据 */ decryptData.setEncryData( buffer, strlen( buffer ) + 1 ); /* 解密数据 */ decryptData.encryptionData(); /* 得到解密的数据 */ decryptData.getResultData( buffer ); cout << "解密后" << buffer << endl; system( "Pause" ); return(EXIT_SUCCESS); }
相关文章推荐
- C++链式队列
- 最近公共祖先(LCA):并查集+深搜
- c++primer plus第十七章-cin输入、cout输出和文件I/O
- 字符串操作符
- Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
- C++primer学习:泛型算法(1)
- 经典C语言位域结构体内存对齐
- C++顺序循环队列
- C++之递归函数的参数传递问题
- C++类模板实例
- 鞍点
- c语言中的经典算法
- C++链式栈
- C++中引用(&)的用法和应用实例
- poco c++框架库应用:数据库的连接池 推荐
- 简单算术表达式C++实现
- leetcode笔记:Sudoku Solver
- 深度学习(七)caffe源码c++学习笔记
- 单链表的创建、增加、删除、清空操作
- Trie树:应用于统计和排序