PrimerBlack 发表于 2022-3-19 15:18

初学密码学——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))
```

kingbin 发表于 2022-3-19 19:30

来个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:29

本帖最后由 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");
      }
}

KAWAYI 发表于 2022-3-19 16:13

很好很强大,学到了

江苏男孩 发表于 2022-3-19 16:52

没基础还是看不懂{:1_901:}

PrimerBlack 发表于 2022-3-19 16:59

江苏男孩 发表于 2022-3-19 16:52
没基础还是看不懂

建议先学一下语法基础,其实这段代码里面只是简单的for循环和字符串的一个内置方法加字符串拼接

smile4009 发表于 2022-3-19 17:22

今天学了凯撒加密马上就来看了欸嘿{:1_1:}

kof888 发表于 2022-3-19 18:00

如果算最后的那个密码,需要多久跑完?:lol

xz91168 发表于 2022-3-19 18:15

没有入门,看不懂,不过太谢谢大佬们的分享了。

XINJIAN9 发表于 2022-3-19 18:31

正在学习python,留言,反复学习

kingbin 发表于 2022-3-19 19:23

smile4009 发表于 2022-3-19 17:22
今天学了凯撒加密马上就来看了欸嘿

同刚学完密码学,作业还有三个没写出来,老哥要不要挑战一下自己?
列换位密码的加解密
vigenere密码的加解密
vernam密码的加解密

kingbin 发表于 2022-3-19 19:27

老哥的实现是不是有点问题啊
页: [1] 2 3
查看完整版本: 初学密码学——python暴力破解凯撒密码