21xrx.com
2024-12-22 21:19:20 Sunday
登录
文章检索 我的文章 写文章
C++字符串加解密:实现方法分享
2023-07-10 10:19:55 深夜i     --     --
C++ 字符串加密 字符串解密 实现方法 方法分享

在C++编程中,字符串加解密是一个常见的需求,尤其是在安全性要求较高的场合下。本文将分享一些实现C++字符串加解密的方法,帮助读者更好地应对实际开发中的需求。

1. 基本思路

字符串加解密的基本思路是将明文字符串转换为密文字符串,以增加信息安全性。加密可通过运用异或、Base64等编码方式实现,而解密则用相应的解码方式将密文还原为明文。以下列举几种常见的加解密算法。

2. 异或加解密算法

异或加解密算法是基于按位异或的逻辑运算实现的,统一使用同一个密钥进行加解密。加密时根据密钥将明文字符串的每个字符和该密钥取异或运算,得到的结果即密文字符串;解密时再次运用相同的密钥将密文字符串中的每个字符和该密钥取异或运算,得到的结果即原始明文字符串。

示例代码:


// 异或加密解密算法

#include <iostream>

using namespace std;

string encrypt(string s, char key) {

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

    s[i] ^= key;

  }

  return s;

}

string decrypt(string s, char key) {

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

    s[i] ^= key;

  }

  return s;

}

int main() {

  string str = "Hello, world!";

  char key = 'k';

  string encStr = encrypt(str, key);

  cout << "encStr: " << encStr << endl;

  string decStr = decrypt(encStr, key);

  cout << "decStr: " << decStr << endl;

  return 0;

}

3. Base64编码解码算法

Base64是一种常见的编码方式,将二进制数据转换为可打印字符。Base64编码将每三个字符转换为四个字符,因此会引入一定的冗余字符,但由于其便于传输和显示,因此得到广泛应用。Base64编码解码算法实现的加解密方式与异或算法类似,即将原始字符串进行编码并得到密文字符串,再将密文字符串进行解码还原为原始字符串。

示例代码:


// Base64编码解码算法

#include <iostream>

#include <sstream>

#include <iomanip>

#include <string>

#include <cstdio>

#include <cstdlib>

#include <cstring>

using namespace std;

typedef unsigned char BYTE;

string base64_encode(BYTE const* buf, unsigned int bufLen) {

  string ret;

  int i = 0;

  int j = 0;

  BYTE char_array_3[3];

  BYTE char_array_4[4];

  while (bufLen--) {

    char_array_3[i++] = *(buf++);

    if (i == 3) {

      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;

      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);

      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

      char_array_4[3] = char_array_3[2] & 0x3f;

      for(i = 0; i < 4; ++i) {

        ret += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[char_array_4[i]];

      }

      i = 0;

    }

  }

  if (i) {

    for(j = i; j < 3; ++j) {

      char_array_3[j] = '\0';

    }

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;

    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);

    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

    char_array_4[3] = char_array_3[2] & 0x3f;

    for(j = 0; j < i + 1; ++j) {

      ret += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[char_array_4[j]];

    }

    while(i++ < 3) {

      ret += '=';

    }

  }

  return ret;

}

string base64_decode(string const& encodedString) {

  int i = 0;

  int j = 0;

  int in_ = 0;

  BYTE char_array_4[4], char_array_3[3];

  string ret;

  while (encodedString.size() && encodedString[in_] != '=') {

    char_array_4[i++] = encodedString[in_];

    ++in_;

    if (i ==4) {

      for (i = 0; i <4; ++i) {

        char_array_4[i] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".

        find(char_array_4[i]);

      }

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);

      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

      for (i = 0; (i < 3); ++i) {

       ret += char_array_3[i];

      }

      i = 0;

    }

  }

  if (i) {

    for (j = i; j <4; ++j) {

      char_array_4[j] = 0;

    }

    for (j = 0; j <4; ++j) {

      char_array_4[j] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".

      find(char_array_4[j]);

    }

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);

    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

    for (j = 0; (j < i - 1); ++j) {

      ret += char_array_3[j];

    }

  }

  return ret;

}

int main() {

  string str = "Hello, world!";

  string encStr = base64_encode((BYTE const*)str.c_str(), str.length());

  cout << "encStr: " << encStr << endl;

  string decStr = base64_decode(encStr);

  cout << "decStr: " << decStr << endl;

  return 0;

}

以上两种加解密算法都可以轻松实现字符串加解密。需要注意的是,密钥在实际应用中需要保密,否则容易被攻击者通过加密算法反推出原始的明文字符串。

  
  

评论区

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