希尔密码(加密、解密、破解)

希尔密码(加密、解密、破解)

简介

希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。

每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。(注意用作加密的矩阵(即密匙)在 必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。)

例子

用希尔密码对明文串 x = ecnu 进行加密,

密钥矩阵:在这里插入图片描述

加密

密文向量 = 明文向量 * 密钥矩阵 (mod 26)
1.先将明文串对应英文字母编码表进行数字转化 4 2 13 20
然后两两一组写成矩阵形式:
在这里插入图片描述
2.接下来开始加密
在这里插入图片描述
得到密文矩阵后,按照分组对应的向量转成字母:
SUWJ

解密

解密和加密类似,先通过刚刚的方法计算出 模 m 的逆矩阵,然后用 A−1 再进行解密:

求逆矩阵的方法:
在这里插入图片描述

实际二阶矩阵的逆矩阵就是:

在这里插入图片描述
mod 26后 ,然后用上述相同的方法转换成明文串即可。

三阶同理:
在这里插入图片描述

分析与破解

例子:
假设已知明文friday利用n=2的希尔密码加密,得到密文VYUZSM,求秘钥K

n等于2,说明把friday分成3段,矩阵是2*2的

根据字母与整数的对应关系:
(5,17)---->(21,24),
(8,3)---->(20,25),
(0,24)—>(18,12),得到
在这里插入图片描述
用(0,24)—>(18,12)验证K:

在这里插入图片描述
正确!得到密钥K就随便破解密文了

好的,以下是一个简单的希尔密码加密解密的示例代码: ```c #include <stdio.h> #include <string.h> // 希尔密码加密 void hill_encrypt(char* str, int key) { int len = strlen(str); int cols = key; int rows = len / cols; if (len % cols) rows++; char matrix[rows][cols]; int k = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (k < len) matrix[i][j] = str[k++]; else matrix[i][j] = ' '; } } for (int i = 0; i < cols; i++) { for (int j = 0; j < rows; j++) { printf("%c", matrix[j][i]); } } printf("\n"); } // 希尔密码解密 void hill_decrypt(char* str, int key) { int len = strlen(str); int cols = key; int rows = len / cols; if (len % cols) rows++; char matrix[rows][cols]; int k = 0; for (int i = 0; i < cols; i++) { for (int j = 0; j < rows; j++) { if (k < len) matrix[j][i] = str[k++]; else matrix[j][i] = ' '; } } for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%c", matrix[i][j]); } } printf("\n"); } int main() { char str[] = "HELLO WORLD"; int key = 4; printf("原文: %s\n", str); hill_encrypt(str, key); char encrypted[] = "HOLELWRLOD "; printf("密文: %s\n", encrypted); hill_decrypt(encrypted, key); return 0; } ``` 代码中的 `hill_encrypt` 函数实现了希尔密码加密,`hill_decrypt` 函数实现了希尔密码解密。其中,加密函数将原文按照指定的密钥分成若干列,然后按列读取输出,得到密文。解密函数则是将密文按列分成若干行,然后按行读取输出,得到原文。在示例代码中,我们将字符串 `"HELLO WORLD"` 使用密钥为 4 的希尔密码加密,得到密文 `"HOLELWRLOD "`,然后再用相同的密钥进行解密,得到原文 `"HELLO WORLD"`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值