C++ 加密解密
一、加密算法分類
對稱加密算法、不對稱加密算法、不可逆加密算法
1、對稱加密算法
特點:較早、技術成熟
原理:
數據發信方將明文和加密秘鑰一起經過特殊加密算法處理后,使其變成復雜的加密密文發送出去;收信方收到密文后,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙發都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。
技術特點:
算法公開、計算量小、加密速度快、加密效率高。
不足之處是:交易雙發使用相同密鑰,安全性得不到保證。此外,每對用戶都需要使用被人不知道的唯一的密鑰,這會使得密鑰管理非常困難。對稱加密算法在分布式網絡上使用較為困難;在專用網中廣泛使用的加密算法有DES、IDEA等。AES
DES、IDEA
2、不對稱加密算法
特點:
原理:
不對稱加密算法使用兩把完全不同但是又是完全匹配的以對鑰匙--公鑰和私鑰。在使用不對稱加密算法加密文件時只有匹配的一對公鑰和私鑰才能完成對明文的加密和解密過程。加密明文時采用公鑰加密,解密密文時使用私鑰解密,而且發信方知道收信方的公鑰,只有收信方才知道自己的私鑰。
技術特點:
基本原理是:如果發信方想發送只有收信方才能解讀的加密信息,發信方必須首先知道收信方的公鑰,然后利用收信方的公鑰來加密原文;收信方收到加密密文后,使用自己的私鑰才能解密密文。顯然,采用不對稱加密算法,收發信雙方在通信之前,收信方必須將自己早已隨機生成的公鑰送給發信方,而自己保留私鑰。由于不對稱算法擁有兩個密鑰,因而特別適用于分布式系統中的數據加密。
RSA、DSA
3、不可逆加密算法
不可逆加密算法的特征是加密過程中不需要使用密鑰,輸入明文后由系統直接經過加密算法處理成密文,這種加密后的數據是無法被解密的,只有重新輸入明文,并再次經過同樣不可逆的加密算法處理,得到相同的加密密文并被系統重新識別后,才能真正解密。顯然,在這類加密過程中,加密是自己,解密還得是自己,而所謂解密,實際上就是重新加一次密,所應用的“密碼”也就是輸入的明文。不可逆加密算法不存在密鑰保管和分發問題,非常適合在分布式網絡系統上使用,但因加密計算復雜,工作量相當繁重,通常只在數據量有限的情形下使用,如廣泛應用在計算機系統中的口令加密,利用的就是不可逆加密算法。近年來,隨著計算機系統性能的不斷提高,不可逆加密的應用領域正在逐漸增大。在計算機網絡中應用較多不可逆加密算法的有RSA公司發明的MD5算法和由美國國家標準局建議的不可逆加密標準SHS(Secure Hash Standard:安全雜亂信息標準)等
二、主要的C++算法庫
OPENSSL,Crypto++,Botan,Botan
?
加密解密例子程序:對稱加密
RC4.h
#pragma once #include <Windows.h> #include <WinNT.h> typedef unsigned char* LPBYTE; typedef const unsigned char* LPCBYTE;class CRC4 { public:CRC4(void);~CRC4(void);public:/*說明:設置RC4加密密鑰(加密解密使用同一密鑰)密鑰長度為1-256字節密鑰的長度 dwKeyBytes 與明文長度、密鑰流的長度沒有必然關系通常密鑰的長度取16字節(128比特)參數:lpbzKey 密鑰dwBytes 密鑰長度返回:只要NULL != lpbzKey就返回TRUE*/BOOL Init(LPCBYTE lpbzKey, DWORD dwKeyBytes);/*說明:加密過程:輸入待加密明文 lpbzSrc ,輸出密文lpbzDst ;解密過程:輸入待解密密文 lpbzSrc ,輸出解密明文lpbzDst 。輸入和輸出長度都是 nSrcBytes 字節lpbzDst 可以等于 lpbzSrc返回:只要NULL != lpbzSrc && NULL != lpbzDst && 0 != nSrcBytes 就返回TRUE。*/BOOL Update(LPBYTE lpbzSrc, LPBYTE lpbzDst, INT64 nSrcBytes);protected:int m_nI;int m_nJ;BYTE m_bzS[256]; };RC4.cpp
#include "StdAfx.h" #include "RC4.h"CRC4::CRC4(void): m_nI(0), m_nJ(0) {RtlZeroMemory(m_bzS, 256); }CRC4::~CRC4(void) { }BOOL CRC4::Init(LPCBYTE lpbzKey, DWORD dwKeyBytes) {BOOL bSuccess = FALSE;if (NULL != lpbzKey && 0 < dwKeyBytes && 256 >= dwKeyBytes){bSuccess = TRUE;BYTE k[256] = { 0 };if (256 == dwKeyBytes){RtlCopyMemory(k, lpbzKey, dwKeyBytes);}else{for (DWORD i = 0; 256 > i; ++i){m_bzS[i] = (BYTE)i;k[i] = lpbzKey[i % dwKeyBytes];}}int j = 0;BYTE temp = 0;for (int i = 0; 256 > i; ++i){j = (j + m_bzS[i] + k[i]) % 256;temp = m_bzS[i];m_bzS[i] = m_bzS[j];m_bzS[j] = temp;}m_nI = m_nJ = 0;}return bSuccess; }BOOL CRC4::Update(LPBYTE lpbzSrc, LPBYTE lpbzDst, INT64 nSrcBytes) {BOOL bSuccess = FALSE;if (NULL != lpbzSrc && NULL != lpbzDst && 0 < nSrcBytes){bSuccess = TRUE;BYTE temp = 0;for (INT64 x = 0; x < nSrcBytes; ++x){m_nI = (m_nI + 1) % 256;m_nJ = (m_nJ + m_bzS[m_nI]) % 256;temp = m_bzS[m_nI];m_bzS[m_nI] = m_bzS[m_nJ];m_bzS[m_nJ] = temp;int t = (m_bzS[m_nI] + m_bzS[m_nJ]) % 256;lpbzDst[x] = lpbzSrc[x] ^ m_bzS[t];}}return bSuccess; }main.cpp
// ConsoleApplication1.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <stdio.h> #include <locale.h> #include <iostream> #include <string> #include "RC4.h" const unsigned char EncryptKey[16] = {'H','e','l','l','o',' ','W','o','r','l','d','!','1','2','3','4'};int main() {std::string strMsgEn, strMsgDe;std::string strMsg = "AbcD中國@#¥%+-12233";std::cout << "明文:" << strMsg << std::endl;CRC4 objCR4;size_t nLen = strMsg.length();//加密objCR4.Init((LPCBYTE)EncryptKey, sizeof(EncryptKey));BYTE* pbDest = new BYTE[nLen + 1];memset(pbDest, 0, strMsg.length() + 1);if (TRUE == objCR4.Update((LPBYTE)strMsg.c_str(), pbDest, nLen));{strMsgEn = (char*)pbDest;std::cout << "密文:" << strMsgEn << std::endl;}//解密BYTE* pbDest2 = new BYTE[nLen + 1];memset(pbDest2, 0, nLen + 1);objCR4.Init((LPCBYTE)EncryptKey, sizeof(EncryptKey));//每次加密解密前都需要初始化if (TRUE == objCR4.Update((LPBYTE)strMsgEn.c_str(), pbDest2, nLen)){strMsgDe = (char*)pbDest2;std::cout << "解密:" << strMsgDe << std::endl;}delete[]pbDest;delete[]pbDest2;system("pause");return 0; }//明文:AbcD中國@#¥%+-12233 //密文:, }e鍴 扎; 雮7尉u蝲 //解密:AbcD中國@#¥%+-12233?
總結
- 上一篇: U盘启动的WinPe安装winxp(非g
- 下一篇: QT关于屏幕保护程序