C++简单加解密
来源:互联网 发布:中国银联 工作知乎 编辑:程序博客网 时间:2024/06/05 23:01
最近做个C++小项目,其中的用户名、密码要求加密,要求原字母、数字不会重现就行。
//Password.h文件CString Base64Encode(LPCTSTR lpszSrc);//加密CString Base64Decode(LPCTSTR lpszSrc);//解密
//Password.cpp文件CString Base64Encode(LPCTSTR lpszSrc){ ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc)); const char BASE64_ENCODE_TABLE[64] = { 65, 66, 67, 68, 69, 70, 71, 72, // 00 - 07 73, 74, 75, 76, 77, 78, 79, 80, // 08 - 15 81, 82, 83, 84, 85, 86, 87, 88, // 16 - 23 89, 90, 97, 98, 99, 100, 101, 102, // 24 - 31 103, 104, 105, 106, 107, 108, 109, 110, // 32 - 39 111, 112, 113, 114, 115, 116, 117, 118, // 40 - 47 119, 120, 121, 122, 48, 49, 50, 51, // 48 - 55 52, 53, 54, 55, 56, 57, 43, 47 };// 56 - 63 unsigned int iTest; LPCTSTR pInBuffer = lpszSrc; int nSize = (int)_tcslen(lpszSrc); char* pOutBuffer = new char[nSize / 3 * 4 + 5]; ZeroMemory(pOutBuffer, nSize / 3 * 4 + 5); for (int i = 0; i < nSize / 3; i++) { iTest = (unsigned char)*pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char)*pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char)*pInBuffer++; //以4 byte倒序写入输出缓冲 pOutBuffer[3] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer += 4; } //设置尾部 switch (_tcslen(lpszSrc) % 3) { case 0: break; case 1: iTest = (unsigned char)*pInBuffer; iTest = iTest << 4; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer[2] = '='; //用'='也就是64码填充剩余部分 pOutBuffer[3] = '='; break; case 2: iTest = (unsigned char)*pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char)*pInBuffer; iTest = iTest << 2; pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer[3] = '='; // Fill remaining byte. break; } pOutBuffer -= nSize / 3 * 4; CString strEncode(pOutBuffer); delete[] pOutBuffer; pOutBuffer = NULL; return strEncode;}CString Base64Decode(LPCTSTR lpszSrc){ ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc)); const unsigned int BASE64_DECODE_TABLE[256] = { 255, 255, 255, 255, 255, 255, 255, 255, // 00 - 07 255, 255, 255, 255, 255, 255, 255, 255, // 08 - 15 255, 255, 255, 255, 255, 255, 255, 255, // 16 - 23 255, 255, 255, 255, 255, 255, 255, 255, // 24 - 31 255, 255, 255, 255, 255, 255, 255, 255, // 32 - 39 255, 255, 255, 62, 255, 255, 255, 63, // 40 - 47 52, 53, 54, 55, 56, 57, 58, 59, // 48 - 55 60, 61, 255, 255, 255, 255, 255, 255, // 56 - 63 255, 0, 1, 2, 3, 4, 5, 6, // 64 - 71 7, 8, 9, 10, 11, 12, 13, 14, // 72 - 79 15, 16, 17, 18, 19, 20, 21, 22, // 80 - 87 23, 24, 25, 255, 255, 255, 255, 255, // 88 - 95 255, 26, 27, 28, 29, 30, 31, 32, // 96 - 103 33, 34, 35, 36, 37, 38, 39, 40, // 104 - 111 41, 42, 43, 44, 45, 46, 47, 48, // 112 - 119 49, 50, 51, 255, 255, 255, 255, 255, // 120 - 127 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; const int nSrcCount = (int)_tcslen(lpszSrc); int nSize = nSrcCount / 4 * 3; if (lpszSrc[nSrcCount - 1] == '=') nSize--; if (lpszSrc[nSrcCount - 2] == '=') nSize--; char* pOutBuffer = new char[nSize + 3]; ZeroMemory(pOutBuffer, nSize + 3); LPCTSTR pInBuffer = lpszSrc; UINT iTest, iPack; for (int i = 0; i < nSize / 3; i++) { for (int j = 0; j < 4; j++) { iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. //InPtr++; if (iTest == 0xFF) { j--; continue; //读到255非法字符 } iPack = iPack << 6; iPack = iPack | iTest; } pOutBuffer[2] = iPack; iPack = iPack >> 8; pOutBuffer[1] = iPack; iPack = iPack >> 8; pOutBuffer[0] = iPack; //准备写入后3位 pOutBuffer += 3; iPack = 0; } switch (nSize % 3) { case 1: iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6; iPack = iPack | iTest; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6; iPack = iPack | iTest; } iPack = iPack >> 4; pOutBuffer[0] = iPack; pOutBuffer++; break; case 2: iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6; iPack = iPack | iTest; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6; iPack = iPack | iTest; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6; iPack = iPack | iTest; } iPack = iPack >> 2; pOutBuffer[1] = iPack; iPack = iPack >> 8; pOutBuffer[0] = iPack; pOutBuffer += 2; break; default: break; } pOutBuffer -= nSize; CString strDecode(pOutBuffer); delete pOutBuffer; return strDecode;}
0 0
- c语言简单加解密
- c_简单的文件加解密
- 简单xor加解密
- 简单的加解密
- Java简单加解密
- 简单加解密
- 简单加解密算法
- C++简单加解密
- C#DES加解密
- C++DES加解密
- c base64加解密
- C#-DES加解密
- 查表法优化简单加解密
- JAVA加解密简单实现
- java简单的加解密
- 简单的加解密工具
- 简单的bytes加解密
- byte[] 简单的加解密
- scala(2)-使用Scala解释器(interpreter)
- ProcessShellCommand(cmdInfo)函数功能
- ProcessShellCommand(cmdInfo)函数功能
- Mitaka版OpenStack中调用ceilometerclient创建alarm的问题
- PAT乙级1012 数字分类
- C++简单加解密
- 正则表达式基础学习
- Java抽象类与接口的区别
- golang reflect简单使用
- HTTP中Get与Post的区别
- java集合架构____Arraylist
- Java 创建对象的几种方式
- spring中用joinpoint来访问目标方法的参数
- 《C++Primer》笔记 第二章2.3 指针和引用