読者です 読者をやめる 読者になる 読者になる

つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

単一換字暗号

シーザー暗号とちょっと似てますが、文字の対応付けをして、それに基づいて暗号化を行うというものです。

暗号化を行うプログラムを書いてみました。(難しいのは書けないっす(T_T))

//単一換字暗号
#include <bits/stdc++.h>
using namespace std;
char table[] = {'K', 'H', 'U', 'B', 'Y', 'V', 'X', 'W', 'E', 'L', 'G', 'A',
                'C', 'D', 'F', 'J', 'I', 'Q', 'M', 'S', 'T', 'O', 'R'};
map<char, char> hm;

string encrypt(string input) {
    string res = "";
    for(int r = 0; r < input.length(); r++) {
        if(isspace(input[r])) {res += ' '; continue;}
        if(isdigit(input[r])) {res += hm['a' + (input[r] % 26)]; continue;}
        res += hm[input[r]];
    }
    return(res);
}

int main(void) {
    for(int alpha = 'a'; alpha <= 'z'; alpha++) {
        hm[alpha] = table[alpha - 'a'];
    }
    
    string input; getline(cin, input);
    cout << encrypt(input) << endl;
    
    return(0);
}

これを解読するには、文字の頻度を利用した方法を使います。
文字の頻度を割り出し、その文字に基づき、英語でもっともよく使われる単語について考えます。
これを繰り返していくと無理やり複合化できるというものです。
鍵(テーブル)さえ知っていれば対応させることですぐに変換できるんですが、頻度を調べて・・・なんて大変ですね