初学密码学——python暴力破解凯撒密码
**上一个帖子描述了如何对一串字符进行加解密,这次仍是使用python进行凯撒密码的编写此次编写的是暴力破解凯撒密码,即暴力算法(brute-force),暴力破解顾名思义,是尝试每一种可能解密密文的密钥,对于凯撒密码,在不知道密钥时,暴力破解是有效的解密手段。
**
源码如下:仅供交流
```
#密文
message_encrypt = "XXXnfcQPKJFnDO"
#供加密的符号
ENCRYPT_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789 !?."
#尝试各种key密钥:0-65
for key in range(len(ENCRYPT_WORD)):
translation = ""
for symbol in message_encrypt:
if symbol in ENCRYPT_WORD:
message_encrypt_index = ENCRYPT_WORD.find(symbol)
translaion_index = message_encrypt_index - key
#执行回环
if translaion_index < 0:
translaion_index = translaion_index + len(ENCRYPT_WORD)
#添加解密的字符
translation = translation + ENCRYPT_WORD
else:
#添加未解密的字符
translaion = translaion + symbol
print("key:{}对应的明文是:{}".format(key,translation))
``` 来个C语言版本的,还是热乎的{:1_918:}{:1_918:}
#include <stdio.h>
#include <string.h>
//author:Shadowbin
//Date:2022年3月18日
int main() {
printf("暴力破解凯撒密码");
printf("请输入需要解密的密文:");
char encrypted;
int move = 1;
gets(encrypted);
for (int j = 0; j < 26; j++) {
//TODO
for (int i = 0; i < strlen(encrypted); i++) {
//TODO
if (encrypted >= 'A' && encrypted <= 'Z') {
//TODO
encrypted = ((encrypted - 'A') + move) % 26 + 'A';
} else if (encrypted >= 'a' && encrypted <= 'z') {
encrypted = ((encrypted - 'a') + move) % 26 + 'a';
}
}
printf("第%2d个可能的密码是%s", j, encrypted);
printf("\n");
}
} 本帖最后由 kingbin 于 2022-3-24 13:37 编辑
嘿嘿,昨天又搞了一下午,算是勉强做出来了吧
#include<stdio.h>
#include<string.h>
//Author:Shadowbin
//Date:2022年3月23日
//列置换加密,不太严谨,有待改进
int main() {
char passwd, encrypted, ls; //ls为临时二维数组
char key;
while (1) {
//TODO
memset(ls, 0, sizeof ls); //清空数组,防止第二次覆盖时出现Bug
memset(passwd, 0, sizeof passwd);
memset(encrypted, 0, sizeof encrypted);
printf("请输入你要加密的密钥:");
gets(key);
printf("请输入你要加密的明文:");
gets(passwd);
int a = 0, c = strlen(key), b = strlen(passwd) / strlen(key), r = b + 1;
for (int i = 0; i < strlen(key); i++) {
//TODO获取key并将其放到临时数组的第一列中
ls = key;
}
for (int i = 1; i <= r; i++) {
//TODO
for (int j = 0; j < c; j++) {
//TODO
ls = passwd;
a++;
}
}
//打印出临时二维数组
// for (int i = 0; i <= r; i++) {
// //TODO
// for (int j = 0; j < c; j++) {
// //TODO
// printf("%c", ls);
// }
// printf("\n");
// }
// 打印输出密文
printf("密文为:");
for (int i = 49; i <= (c + 49); i++) {
//TODO
for (int j = 0; j < c; j++) {
//TODO
if (int(ls) == i) {
//TODO
for (int k = 1; k <= r; k++) {
//TODO
printf("%c", ls);
}
}
}
}
printf("\n");
}
} 很好很强大,学到了 没基础还是看不懂{:1_901:} 江苏男孩 发表于 2022-3-19 16:52
没基础还是看不懂
建议先学一下语法基础,其实这段代码里面只是简单的for循环和字符串的一个内置方法加字符串拼接 今天学了凯撒加密马上就来看了欸嘿{:1_1:} 如果算最后的那个密码,需要多久跑完?:lol 没有入门,看不懂,不过太谢谢大佬们的分享了。 正在学习python,留言,反复学习 smile4009 发表于 2022-3-19 17:22
今天学了凯撒加密马上就来看了欸嘿
同刚学完密码学,作业还有三个没写出来,老哥要不要挑战一下自己?
列换位密码的加解密
vigenere密码的加解密
vernam密码的加解密 老哥的实现是不是有点问题啊