21xrx.com
2025-03-31 16:30:39 Monday
文章检索 我的文章 写文章
C++文件加密实现方法指南
2023-07-13 16:50:48 深夜i     64     0
C++语言 文件加密 实现方法 安全性 加密算法

在今天的数字化时代,文件加密早已不是什么新鲜的概念。文件加密可以保护个人隐私,防止商业机密泄露,还可以保护软件版权。C++是一种广泛使用的编程语言,有很多实现文件加密的方法。在本文中,我们将指导您实现使用C++进行文件加密的方法。

1.对称加密算法

对称加密算法用于加密数据,比如对文件进行加密,通过输入的密码或密钥进行加密。C++中常用的对称加密算法有DES,AES等。

DES加密算法:

DES加密算法通过一个密码进行加密,可以实现文件的加密。DES加密的优点是速度快,且安全性较高。下面是使用DES加密算法进行文件加密的代码:

#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
class CryptDES
{
public:
static void des(char* src, char* key, char mode, char* result);   // des加密/解密
};
void CryptDES::des(char* src, char* key, char mode, char* result) {   // 加密/解密
static bool s_IsTableOK = false;
static char s_szCreateTableMessage[] = "Ready to create DES Tables";
static char s_szError[] = "Can't create tables";
static int IP_Table[64] =   // IP置换表
  58;
static int PC1_Table[56] = 23;
static int PC2_Table[48] = 24;
static int LOOP_Table[16] = 2;
static int E_Table[48] = 3;
static int S_Box[8][4][16] = {   // s盒
  {
    15,
    5,
    14,
    14,
  },
  ...
  {
    6,
    8,
    10,
    2,
  }
};
static int P_Table[32] = 30;
static int IP_1_Table[64] =
  38;
if (!s_IsTableOK)
  cout << s_szCreateTableMessage << endl;
  // 创建table
  s_IsTableOK = true;
char* ip_result = new char[64];
for (int i = 0; i < 64; ++i) // 初始置换 IP
{
  ip_result[i] = src[IP_Table[i] - 1];
}
char* l_char = new char[32], * r_char = new char[32];
memcpy(l_char, ip_result, 32);
memcpy(r_char, ip_result + 32, 32);
char* new_r_char = new char[32], * e_r_char = new char[48];
char* s_r_char = new char[32], * p_r_char = new char[32];
for (int i = 0; i < 16; ++i)  // 迭代算法
{
  memcpy(new_r_char, l_char, 32);
  memset(e_r_char, 0, sizeof(char) * 48);
  memset(s_r_char, 0, sizeof(char) * 32);
  memset(p_r_char, 0, sizeof(char) * 32);
  // 构造ER:从 R 中选 48 位
  for (int j = 0; j < 48; ++j)
  {
    e_r_char[j] = r_char[E_Table[j] - 1];
  }
  if (mode == 'E')  // 加密
  {
    // 通过异或进行加密
    for (int j = 0; j < 48; ++j)
    {
      e_r_char[j] = e_r_char[j] ^ key[j];
    }
  }
  else  // 解密
  {
    // 通过异或进行解密
    for (int j = 0; j < 48; ++j)
    {
      e_r_char[j] = e_r_char[j] ^ key[47 - j];
    }
  }
  // 通过S盒进行替换
  for (int j = 0; j < 8; ++j)
  {
    int x = e_r_char[j * 6] * 2 + e_r_char[j * 6 + 5];
    int y = e_r_char[j * 6 + 1] * 8 + e_r_char[j * 6 + 2] * 4 + e_r_char[j * 6 + 3] * 2 + e_r_char[j * 6 + 4];
    int val = S_Box[j][x][y];
    for (int k = 0; k < 4; ++k)
    {
      s_r_char[4 * j + k] = ((val >> (3 - k)) & 0x1) + '0';
    }
  }
  // 通过P盒进行置换
  for (int j = 0; j < 32; ++j)
  {
    p_r_char[j] = s_r_char[P_Table[j] - 1];
  }
  // 左右合并
  for (int j = 0; j < 32; ++j)
  {
    l_char[j] = new_r_char[j];
    r_char[j] = (new_r_char[j] ^ p_r_char[j]);
  }
}
// 以上进行16轮递归得到的L, R合并成64位字符
char* merge_result = new char[64];
for (int i = 0; i < 32; ++i)
{
  merge_result[i] = r_char[i];
  merge_result[i + 32] = l_char[i];
}
// 逆初始置换 IP-1
for (int i = 0; i < 64; ++i)
{
  result[i] = merge_result[IP_1_Table[i] - 1];
}
}
int main()
{
CryptDES aes; // 加密/解密类
// 打开文件
ifstream fin("src.txt", ios::binary);
if (!fin.is_open())
  cout << "can't open file" << endl;
  return 0;
// 读文件大小
fin.seekg(0, ios_base::end);
int fileSize = fin.tellg();
fin.seekg(0, ios_base::beg);
// 读取文件内容
char* buffer = new char[fileSize];
fin.read(buffer, fileSize);
fin.close();
// 设置Key
char key[64] = "1234abcd1234abcd";
// 加密
char* outbuffer = new char[fileSize];
for (int j = 0; j < fileSize; j += 8)
{
  // 对于每一个block进行加密
  char inbuffer[16] = "";
  for (int k = 0; k < 8; ++k)
  {
    inbuffer[k] = buffer[j + k];
  }
  aes.des(inbuffer, key, 'E', inbuffer);
  memcpy(outbuffer + j, inbuffer, 8);
}
// 写入文件
ofstream fout("dst.txt", ios::binary);
fout.write(outbuffer, fileSize);
fout.close();
delete[] outbuffer;
delete[] buffer;
return 0;
}

2.非对称加密算法

非对称加密算法是通过对两个密钥进行加密和解密来实现安全通信。其中一串密钥是公钥,另一串是私钥。公钥可以被任何人使用,私钥只有拥有者才能使用。C++中常用的非对称加密算法有RSA算法等。

RSA算法:

RSA是一种非对称加密算法,通过一个公钥和一个私钥来进行加解密操作。RSA加密算法通常应用于电子商务、安全通信等领域。下面是使用RSA进行文件加密的代码。

```c++

#include

#include

#include

#include

#include

#include

#include

using namespace std;

unsigned int gcd(unsigned int u, unsigned int v)

{

  int shift;

  if (u == 0) return v;

  if (v == 0) return u;

  for (shift = 0; ((u | v) & 1) == 0; ++shift)

    u >>= 1;

    v >>= 1;

  while ((u & 1) == 0) u >>= 1;

  do {

    while ((v & 1) == 0) v >>= 1;

    if (u > v)

      unsigned int t = v; v = u; u = t;

    v = v - u;

  } while (v != 0);

  return u << shift;

}

unsigned int phi(unsigned int n)

{

  if (n == 0) return 0;

  unsigned int result = n;

  for (unsigned int i = 2; i * i <= n; i++)

  {

    if (n % i == 0)

    {

      while (n % i == 0) n /= i;

      result -= result / i;

    }

  }

  if (n > 1) result -= result / n;

  return result;

}

unsigned int FastExp(unsigned int x, unsigned int n, unsigned int m)

{

  unsigned int result = 1;

  while (n > 0)

  {

    if (n % 2 == 1) result = (result * x) % m;

    x = (x * x) % m;

    n = n / 2;

  }

  return result;

}

unsigned int Prime(unsigned int n)

{

  bool* S = new bool[n + 1];

  for (unsigned int i = 2; i <= n; ++i) S[i] = true;

  for (unsigned int i = 2; i <= sqrt(n); ++i)

  {

    if (S[i])

    {

      for (unsigned int j = i * i; j <= n; j += i) S[j] = false;

    }

  }

  unsigned int* F = new unsigned int[n];

  unsigned int count = 0;

  for (unsigned int i = 2; i <= n; ++i)

  {

    if (S[i])

    {

      F[count] = i;

      ++count;

    }

  }

  int i = rand() % count;

  delete[] S;

  unsigned int p = F[i];

  delete[] F;

  return p;

}

class RSA

{

public:

  RSA();

  unsigned int GetN() return m_n;

  unsigned int GetE() return m_e;

  unsigned int GetD() return m_d;

  void Init(unsigned int p, unsigned int q);

  string Encrypto(string msg);

  string Decrypto(string cipher);

private:

  unsigned int m_n, m_d, m_e;

};

RSA::RSA()

{

  srand((unsigned)time(NULL));

  unsigned int p = Prime(128);

  unsigned int q = Prime(128);

  Init(p, q);

}

void RSA::Init(unsigned int p, unsigned int q)

{

  m_n = p * q;

  unsigned int fai_n = phi(m_n);

  do

  {

    m_e = rand() % (fai_n - 2) + 2;

  } while (gcd(m_e, fai_n) != 1);

  unsigned int n = 1;

  while (n > 0)

  {

    n++;

    m_d = (1 + n * fai_n) / m_e;

  }

  m_d = m_d % fai_n;

}

string RSA::Encrypto(string msg)

{

  string result = "";

  for (int i = 0; i < msg.length(); ++i)

  {

    unsigned int c = FastExp(msg[i], m_e, m_n);

    result = result + (char)c;

  }

  return result;

}

string RSA::Decrypto(string cipher)

{

  string result = "";

  for (int i = 0; i < cipher.length(); ++i)

  {

    unsigned int c = FastExp(cipher[i], m_d, m_n);

    result = result + (char)c;

  }

  return result;

}

int main()

{

  RSA rsa;

  unsigned int n = rsa.GetN();

  unsigned int e = rsa.GetE();

  unsigned int d = rsa.GetD();

  cout << "N: " << n << endl;

  cout << "E: " << e << endl;

  cout << "D: " << d << endl;

  ifstream fin("src.txt", ios::binary);

  if (!fin.is_open())

    cout << "can't open file" << endl;

    return 0;

  fin.seekg(0, ios_base::end);

  int fileSize = fin.tellg();

  fin.seekg(0, ios_base::beg);

  char* buffer = new char[fileSize];

  
  

评论区

请求出错了