21xrx.com
2024-11-05 12:16:17 Tuesday
登录
文章检索 我的文章 写文章
C++文件加密实现方法指南
2023-07-13 16:50:48 深夜i     --     --
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];

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复