吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4755|回复: 26
收起左侧

[Python 转载] 初学密码学——python暴力破解凯撒密码

[复制链接]
PrimerBlack 发表于 2022-3-19 15:18

上一个帖子描述了如何对一串字符进行加解密,这次仍是使用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[translaion_index]
        else:
            #添加未解密的字符
            translaion = translaion + symbol

    print("key:{}对应的明文是:{}".format(key,translation))

免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
weng_zh + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kingbin 发表于 2022-3-19 19:30
来个C语言版本的,还是热乎的
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
//author:Shadowbin
//Date:2022年3月18日
int main() {
	printf("暴力破解凯撒密码");
	printf("请输入需要解密的密文:");
	char encrypted[100];
	int move = 1;
	gets(encrypted);
	for (int j = 0; j < 26; j++) {
		//TODO
		for (int i = 0; i < strlen(encrypted); i++) {
			//TODO
			if (encrypted[i] >= 'A' && encrypted[i] <= 'Z') {
				//TODO
				encrypted[i] = ((encrypted[i] - 'A') + move) % 26 + 'A';
			} else if (encrypted[i] >= 'a' && encrypted[i] <= 'z') {
				encrypted[i] = ((encrypted[i] - 'a') + move) % 26 + 'a';
			}
		}
		printf("第%2d个可能的密码是%s", j, encrypted);
		printf("\n");
	}

}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
PrimerBlack + 1 + 1 用心讨论,共获提升!

查看全部评分

kingbin 发表于 2022-3-24 13:29
本帖最后由 kingbin 于 2022-3-24 13:37 编辑

嘿嘿,昨天又搞了一下午,算是勉强做出来了吧
[C] 纯文本查看 复制代码
#include<stdio.h>
#include<string.h>
//Author:Shadowbin
//Date:2022年3月23日
//列置换加密,不太严谨,有待改进
int main() {
        char passwd[100], encrypted[100], ls[11][11]; //ls为临时二维数组
        char key[10];
        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[0][i] = key[i];
                }
                for (int i = 1; i <= r; i++) {
                        //TODO
                        for (int j = 0; j < c; j++) {
                                //TODO
                                ls[i][j] = passwd[a];
                                a++;
                        }
                }
                
                //打印出临时二维数组
                //                for (int i = 0; i <= r; i++) {
                //                        //TODO
                //                        for (int j = 0; j < c; j++) {
                //                                //TODO
                //                                printf("%c", ls[i][j]);
                //                        }
                //                        printf("\n");
                //                }
                
                //        打印输出密文
                printf("密文为:");
                for (int i = 49; i <= (c + 49); i++) {
                        //TODO
                        for (int j = 0; j < c; j++) {
                                //TODO
                                if (int(ls[0][j]) == i) {
                                        //TODO
                                        for (int k = 1; k <= r; k++) {
                                                //TODO
                                                printf("%c", ls[k][j]);
                                                
                                        }
                                }
                        }
                }
                printf("\n");
        }
}
KAWAYI 发表于 2022-3-19 16:13
江苏男孩 发表于 2022-3-19 16:52
没基础还是看不懂
 楼主| PrimerBlack 发表于 2022-3-19 16:59

建议先学一下语法基础,其实这段代码里面只是简单的for循环和字符串的一个内置方法加字符串拼接
smile4009 发表于 2022-3-19 17:22
今天学了凯撒加密马上就来看了欸嘿
kof888 发表于 2022-3-19 18:00
如果算最后的那个密码,需要多久跑完?
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
老哥的实现是不是有点问题啊
Snipaste_2022-03-19_19-26-48.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表