C++ 加密解密
一、加密算法分類(lèi)
對(duì)稱(chēng)加密算法、不對(duì)稱(chēng)加密算法、不可逆加密算法
1、對(duì)稱(chēng)加密算法
特點(diǎn):較早、技術(shù)成熟
原理:
數(shù)據(jù)發(fā)信方將明文和加密秘鑰一起經(jīng)過(guò)特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去;收信方收到密文后,若想解讀原文,則需要使用加密用過(guò)的密鑰及相同算法的逆算法對(duì)密文進(jìn)行解密,才能恢復(fù)成可讀明文。在對(duì)稱(chēng)加密算法中,使用的密鑰只有一個(gè),發(fā)收信雙發(fā)都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密,這就要求解密方事先必須知道加密密鑰。
技術(shù)特點(diǎn):
算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。
不足之處是:交易雙發(fā)使用相同密鑰,安全性得不到保證。此外,每對(duì)用戶(hù)都需要使用被人不知道的唯一的密鑰,這會(huì)使得密鑰管理非常困難。對(duì)稱(chēng)加密算法在分布式網(wǎng)絡(luò)上使用較為困難;在專(zhuān)用網(wǎng)中廣泛使用的加密算法有DES、IDEA等。AES
DES、IDEA
2、不對(duì)稱(chēng)加密算法
特點(diǎn):
原理:
不對(duì)稱(chēng)加密算法使用兩把完全不同但是又是完全匹配的以對(duì)鑰匙--公鑰和私鑰。在使用不對(duì)稱(chēng)加密算法加密文件時(shí)只有匹配的一對(duì)公鑰和私鑰才能完成對(duì)明文的加密和解密過(guò)程。加密明文時(shí)采用公鑰加密,解密密文時(shí)使用私鑰解密,而且發(fā)信方知道收信方的公鑰,只有收信方才知道自己的私鑰。
技術(shù)特點(diǎn):
基本原理是:如果發(fā)信方想發(fā)送只有收信方才能解讀的加密信息,發(fā)信方必須首先知道收信方的公鑰,然后利用收信方的公鑰來(lái)加密原文;收信方收到加密密文后,使用自己的私鑰才能解密密文。顯然,采用不對(duì)稱(chēng)加密算法,收發(fā)信雙方在通信之前,收信方必須將自己早已隨機(jī)生成的公鑰送給發(fā)信方,而自己保留私鑰。由于不對(duì)稱(chēng)算法擁有兩個(gè)密鑰,因而特別適用于分布式系統(tǒng)中的數(shù)據(jù)加密。
RSA、DSA
3、不可逆加密算法
不可逆加密算法的特征是加密過(guò)程中不需要使用密鑰,輸入明文后由系統(tǒng)直接經(jīng)過(guò)加密算法處理成密文,這種加密后的數(shù)據(jù)是無(wú)法被解密的,只有重新輸入明文,并再次經(jīng)過(guò)同樣不可逆的加密算法處理,得到相同的加密密文并被系統(tǒng)重新識(shí)別后,才能真正解密。顯然,在這類(lèi)加密過(guò)程中,加密是自己,解密還得是自己,而所謂解密,實(shí)際上就是重新加一次密,所應(yīng)用的“密碼”也就是輸入的明文。不可逆加密算法不存在密鑰保管和分發(fā)問(wèn)題,非常適合在分布式網(wǎng)絡(luò)系統(tǒng)上使用,但因加密計(jì)算復(fù)雜,工作量相當(dāng)繁重,通常只在數(shù)據(jù)量有限的情形下使用,如廣泛應(yīng)用在計(jì)算機(jī)系統(tǒng)中的口令加密,利用的就是不可逆加密算法。近年來(lái),隨著計(jì)算機(jī)系統(tǒng)性能的不斷提高,不可逆加密的應(yīng)用領(lǐng)域正在逐漸增大。在計(jì)算機(jī)網(wǎng)絡(luò)中應(yīng)用較多不可逆加密算法的有RSA公司發(fā)明的MD5算法和由美國(guó)國(guó)家標(biāo)準(zhǔn)局建議的不可逆加密標(biāo)準(zhǔn)SHS(Secure Hash Standard:安全雜亂信息標(biāo)準(zhǔn))等
二、主要的C++算法庫(kù)
OPENSSL,Crypto++,Botan,Botan
?
加密解密例子程序:對(duì)稱(chēng)加密
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:/*說(shuō)明:設(shè)置RC4加密密鑰(加密解密使用同一密鑰)密鑰長(zhǎng)度為1-256字節(jié)密鑰的長(zhǎng)度 dwKeyBytes 與明文長(zhǎng)度、密鑰流的長(zhǎng)度沒(méi)有必然關(guān)系通常密鑰的長(zhǎng)度取16字節(jié)(128比特)參數(shù):lpbzKey 密鑰dwBytes 密鑰長(zhǎng)度返回:只要NULL != lpbzKey就返回TRUE*/BOOL Init(LPCBYTE lpbzKey, DWORD dwKeyBytes);/*說(shuō)明:加密過(guò)程:輸入待加密明文 lpbzSrc ,輸出密文lpbzDst ;解密過(guò)程:輸入待解密密文 lpbzSrc ,輸出解密明文lpbzDst 。輸入和輸出長(zhǎng)度都是 nSrcBytes 字節(jié)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 : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 //#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中國(guó)@#¥%+-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中國(guó)@#¥%+-12233 //密文:, }e鍴 扎; 雮7尉u蝲 //解密:AbcD中國(guó)@#¥%+-12233?
總結(jié)
- 上一篇: U盘启动的WinPe安装winxp(非g
- 下一篇: 手动查毒删除病毒文件图