[古典密码]:Hill cipher(希尔密码)

来源于我的博客

希尔加密法

根据字典序将字母转化为数字(0-25)
设定密钥矩阵(n*n),将明文转化为r*n的矩阵

将明文矩阵与密钥矩阵相乘即可得到密文矩阵(结果模26),再将其转化为字母即可.

以3*3密钥矩阵为例:(确保密钥矩阵能求逆)

int key[3][3] = {
	6,13,20,
	24,16,17,
	1,10,15
};

假设明文CAT,C=2,A=0,T=19,明文矩阵:(2,0,19)T

则密文矩阵:

[(6,13,20)T(24,16,17)T(1,10,15)T]×(2,0,19)T

=(31,216,325)T=(5,8,13)T(mod 26)

密文:5=F , 8=I, 13=N :FIN

解密:

将密文矩阵×密钥矩阵的逆即可

密文:5=F , 8=I, 13=N :FIN

密钥矩阵的逆:

[(8,21,21)T(5,8,12)T(10,21,8)T]×(5,8,13)T

=(2,0,19)T

即为明文CAT


C++实现(固定矩阵为3*3):

#include#includeusing namespace std;
string f = { "CATCATCAT" };
string alphabet = { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
string alphabetl = { "abcdefghijklmnopqrstuvwxyz" };
int key[3][3] = {
    6,13,20,
    24,16,17,
    1,10,15
};
int keyM[3][3] = {
    8,21,21,
    5,8,12,
    10,21,8
};
string reCreateStr(string f) {
    string g;
    for (int i = 0;i < f.size();i++) {
        if ((int)(f[i])>64 && (int)(f[i]) < 91) {
            string t;
            t.resize(1);
            t[0] = f[i];
            g.insert(g.size(),t);
        }
        if ((int)(f[i])>64+32 && (int)(f[i]) < 91+32) {
            string t;
            t.resize(1);
            t[0] = f[i]-32;
            g.insert(g.size(), t);
        }
    }
    g.append("/0");
    cout << g << endl;
    return g;
}
string SplitWord_(string f) {
    string g;
    int count_g = 0;
    int char_c = 0;
    //作简单分割
    for (int i = 0;i < f.size();) {
        for (int j = 0;j < 2;j++) {
            if ((int)(f[i])>64 && (int)(f[i]) < 91) {
                //g[count_g++] = f[i];
                string t_f;
                t_f.resize(1);
                t_f[0] = f[i];
                g.append(t_f);
                char_c++;
            }
            if (((int)(f[i]) > 96) && ((int)(f[i]) < 123)) {
                //g[count_g++] = (char)((int)f[i] - 32);
                string t_f;
                t_f.resize(1);
                t_f[0] = (char)((int)f[i] - 32);
                g.append(t_f);
                char_c++;
            }
            if (char_c == 2 && i != f.size() && i != f.size() - 1) {
                //g[count_g++] = ' ';
                //g.append(" ");
                char_c = 0;
            }
            i++;
        }
    }
    //cout << g << "e"<0) {
        int matrix[3] = { 0 };
        for (int i = 0;i < 3;i++) {
            if ((int)(f[fc])>64 && (int)(f[fc]) < 91) {
                matrix[i] = (int)f[fc]- 65;
            }
            else {
                matrix[i] = 0;
            }
            fc++;
        }
        c -= 3;
        for (int i = 0;i < 3;i++) {
            int temp = 0;
            for (int j = 0;j < 3;j++) {
                temp += matrix[j] * key[j][i];
            }
            string t;
            t.resize(1);
            t[0]=(char)(temp % 26 + 65);
            g.append(t);
        }
    }
    cout << g << endl;
    return g;
}
void decrypt(string &f) {
    string g;
    int c = f.size();
    int fc = 0;
    while (c>0) {
        int matrix[3] = { 0 };
        for (int i = 0;i < 3;i++) {
            if ((int)(f[fc])>64 && (int)(f[fc]) < 91) {
                matrix[i] = (int)f[fc] - 65;
            }
            else {
                matrix[i] = 0;
            }
            fc++;
        }
        c -= 3;
        for (int i = 0;i < 3;i++) {
            int temp = 0;
            for (int j = 0;j < 3;j++) {
                temp += matrix[j] * keyM[j][i];
            }
            string t;
            t.resize(1);
            t[0] = (char)(temp % 26 + 65);

            g.append(t);
        }
    }
    cout << g << endl;
}
int main() {
    f = { "Things are not always what they see" };
    decrypt(encrypt(reCreateStr(f)));
    return 0;
}


©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页