古典加密的C++实现——凯撒密码、单表代换密码

2023-10-16 13:59:48 浏览数 (2)

前言

好久没写文了,今天更新几个加密算法,均采用C 实现

系列文章

  1. DH算法

古典加密

凯撒密码

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。编写代码为右移3位

不难得到,他的加密公式为:CaesarCipher(a) = (a 3) mod 26

解密公式为:CaesarCipher(a) = (a 23)mod 26

代码语言:javascript复制
#include <iostream>
#include <string>
using namespace std;

string caesarEncrypt(const string& message, int shift) {
    string encryptedMessage = "";
    for (char c : message) {
        if (isalpha(c)) {
            char shiftedChar = (toupper(c) - 'A'   shift) % 26   'A';
            encryptedMessage  = shiftedChar;
        }
        else {
            encryptedMessage  = c;
        }
    }
    return encryptedMessage;
}

int main() {
    string message;
    int shift;

    cout << "输入: ";
    getline(cin, message);

    cout << "输入移位:";
    cin >> shift;

    string encryptedMessage = caesarEncrypt(message, shift);

    cout << "加密后字符串:" << encryptedMessage << endl;

    return 0;
}

解密和加密差不多,上面也给出公式了,还请读者自己实现一下。

单表代换密码

这个也比较简单,就是把明文中的每个字母替换为固定的密文字母来进行加密。

代码语言:javascript复制
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

string monoalphabeticEncrypt(const string& message, const unordered_map<char, char>& substitutionTable) {
    string encryptedMessage = "";
    for (char c : message) {
        if (isalpha(c)) {
            char substitutedChar = substitutionTable.at(toupper(c));
            encryptedMessage  = islower(c) ? tolower(substitutedChar) : substitutedChar;
        }
        else {
            encryptedMessage  = c;
        }
    }
    return encryptedMessage;
}

int main() {
    string message;
    unordered_map<char, char> substitutionTable;

    // 初始化替换表
    substitutionTable['A'] = 'Q';
    substitutionTable['B'] = 'W';
    substitutionTable['C'] = 'E';
   

    cout << "输入 ";
    getline(cin, message);

    string encryptedMessage = monoalphabeticEncrypt(message, substitutionTable);

    cout << "输出 " << encryptedMessage << endl;

    return 0;
}

最后

如果本文对你有所帮助,还请三连支持一下博主!

0 人点赞