吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2152|回复: 11
收起左侧

[学习记录] 关于常用密码的加密与解密

[复制链接]
Lucifer2002 发表于 2022-4-4 16:21
因为很多线下比赛不能用工具加密或解密,只能自己写脚本,所以就自己捣鼓了一些出来
下面是我写的python脚本,有什么不足还请大佬们指导一下

#凯撒密码
MAX_KEY_SIZE = 26

def getMode():
        while True:
                print('请选择加密或解密模式,或者选择暴力破解')
                print('加密:encrypt(e)')
                print('解密:decrypt(d)')
                print('暴力破解:brute(b)')
                mode = input().lower()
                if mode in 'encrypt e decrypt d brute b'.split():
                        return mode
                else:
                        print('请输入"encrypt"或"e"或"decrypt"或"d"或"brute"或"b"!')
               
def getMessage():
        print('请输入你的信息:')
        return input()
       
def getKey():
        key = 0
        while True:
                print('请输入密钥数字(1-%s)'%(MAX_KEY_SIZE))
                key = int(input())
                if (key >= 1 and key <= MAX_KEY_SIZE):
                        return key
                       
def getTranslatedMessage(mode,message,key):
        if mode[0] == 'd':
                key = -key
        translated = ''
        for symbol in message:
                if symbol.isalpha():
                        num = ord(symbol)
                        num += key
                        if symbol.isupper():
                                if num > ord('Z'):
                                        num -= 26
                                elif num < ord('A'):
                                        num += 26
                        elif symbol.islower():
                                if num > ord('z'):
                                        num -= 26
                                elif num < ord('a'):
                                        num += 26
                    
                        translated += chr(num)
                else:
                        translated += symbol
        return translated
   
mode = getMode()
message = getMessage()
if mode[0] != 'b':
    key = getKey()
print('你要翻译的信息是:')
if mode[0] != 'b':
    print(getTranslatedMessage(mode,message,key))
else:
    for key in range(1,MAX_KEY_SIZE + 1):
        print(key,getTranslatedMessage('decrypt',message,key))


#摩斯密码
CODE_TABLE = {
    # 26 个英文字符
    'A': '.-', 'B': '-...', 'C': '-.-.',
    'D': '-..', 'E': '.', 'F': '..-.',
    'G': '--.', 'H': '....', 'I': '..',
    'J': '.---', 'K': '-.-', 'L': '.-..',
    'M': '--', 'N': '-.', 'O': '---',
    'P': '.--.', 'Q': '--.-', 'R': '.-.',
    'S': '...', 'T': '-', 'U': '..-',
    'V': '...-', 'W': '.--', 'X': '-..-',
    'Y': '-.--', 'Z': '--..',

    # 10 个数字
    '0': '-----', '1': '.----', '2': '..---',
    '3': '...--', '4': '....-', '5': '.....',
    '6': '-....', '7': '--...', '8': '---..',
    '9': '----.',

    # 16 个特殊字符
    ',': '--..--', '.': '.-.-.-', ':': '---...', ';': '-.-.-.',
    '?': '..--..', '=': '-...-', "'": '.----.', '/': '-..-.',
    '!': '-.-.--', '-': '-....-', '_': '..--.-', '(': '-.--.',
    ')': '-.--.-', '$': '...-..-', '&': '. . . .', '@': '.--.-.'

}

def morsedecode(morse):
    msg =''
    codes = morse.split(' ')
    for code in codes:
        if code =='':
            msg += ' '
        else:
            UNCODE =dict(map(lambda t:(t[1],t[0]),CODE_TABLE.items()))
            msg += UNCODE[code]
    return msg

c = "11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110" #你得到的密码

c = c.replace('1','-')
c = c.replace('0','.')

FLAG = morsedecode(c)
#转换为小写
flag = FLAG.lower()
flag = 'cyberpeace{'+flag+'}'
print(flag)


#培根密码
import re

alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]

second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]

def encode():
    string = input("请输入字符串编码:\n")
    e_string1 = ""
    e_string2 = ""
    for index in string:
        for i in range(0,26):
            if index == alphabet:
                e_string1 += first_cipher
                e_string2 += second_cipher
                break
    print("第一个编码方法的结果是:\n"+e_string1)
    print("第二种编码方法的结果为:\n"+e_string2)
    return


def decode():
    e_string = input("请输入要解码的字符串:\n")
    e_array = re.findall(".{5}",e_string)
    d_string1 = ""
    d_string2 = ""
    for index in e_array:
        for i in range(0,26):
            if index == first_cipher:
                d_string1 += alphabet
            if index == second_cipher:
                d_string2 += alphabet
    print("第一解码方法结果为:\n"+d_string1)
    print("第二解码方法结果为:\n"+d_string2)
    return


if __name__ == '__main__':
    while True:
        print("\t*******培根Encode_Decode系统*******")
        print("输入应该是小写,密码只包括'a','b'")
        print("1.encode(加密)\n2.decode(解密)\n3.exit(退出)")
        s_number = input("请输入数字进行选择\n")
        if s_number == "1":
            encode()
            input()
        elif s_number == "2":
            decode()
            input()
        elif s_number == "3":
            break
        else:
            continue


#幂数加密
二进制幂数加密法,由于英文字母只有26个字母。只要2的0、1、2、3、4、5次幂就可以表示31个单元。通过用二进制幂数表示字母序号数来加密。

二进制幂数加密法就是应用这个原理,由于英文字母只有26个字母,由公式可知,只要2的0、1、2、3、4、5次幂就可以表示31个单元。通过用二进制幂数表示字母序号数来加密。例如

明文: d o n o t p u l l a l l y o u r e g g s i n o n e b a s k e t

字母序号:4 15 14 15 20 16 21 12 12 1 12 12 25 15 21 18 5 7 7 19 9 14 15 14 5 2 1 19 11 5 20

由于4=2^2 所以D加密过之后是2;15=2^0+2^1+2^2+2^3所以O加密后是0123。同理得到上述明文的加密后的密文

密文:2 0123/123 0123 24/4 024 23 23/0 23 23/034 0123 024 14/02 012 012 014/03 123 /0123 123 02/1 0 014 013 02 24

例:flag为cyberpeace{你解答出的八位大写字}母}
8842101220480224404014224202480122

可是本题不行,因有8,那么只能  降幂为1
又由题得出分八段
88421  0122  048  02244  04  0142242  0248  0122
23        5       12     12        4    13            14      5
W        E        L       L          D    O             N       E

flag:  cyberpeace{WELLDONE}


#RSA
RSA算法原理:
RSA定理:若P和Q是两个相异质数,另有正整数D和E,其中E的值与(P-1)(Q-1)的值互质(就是两个数互为指数,他们的公因数是1),并使得DE%(P-1)(Q-1)=1,有正整数M,且M<PQ,设:
C=M^E%PQ,B=C^D%PQ,则有M=B。

1、生成公钥和密钥:
随意选择两个大的素数P和Q,且P不等于Q
令N=PQ
令T=(P-1)(Q-1)
选择一个整数E,作为一个密钥,使E与T互质(即E与T的最大公约数为1),且E必须小于T
由公式DE%T=1,计算得到D的值,作为另一密钥
将(N,E)作为公钥,(N,D)作为私钥,当然也可互换。

2、用公钥加密信息:
发送方收到公钥(N,E)后,通过公钥对数据进行加密,操作如下:
明文:M
加密:M^E%N=C
密文:C

3、用私钥解密信息:
接收方收到密文C后,通过私钥(N,D)进行解密,得到明文M,操作如下:
密文:C
解密:C^D%N=M
明文:M



例:
RSA算法模拟

为了计算方便,选取较小素数

1、生成公钥和密钥
取P=11,Q=13
令N=PQ=11*13=143
令T=(P-1)(Q-1)=10*12=120
取E=7
由公式DE%T=1,D*7%120=1得:D=103
(143,103)作为公钥,将(143,7)作为私钥。

2、用公钥加密信息
明文:取M=2
加密:M^E%N=C,2^103%143=63
密文:C=63

3、用私钥解密信息
密文:C=63
解密:C^D%N=M,63^7%143=2
明文:M=2


这些都是简单的加解密,他们也有很多的变形用法,除此之外还有很多有趣又让人头大的密码,在这就直说着一些了,后面再慢慢整理
我也是个刚入门的菜鸡,对这方面有兴趣的朋友们可以一起来学习

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
60235300 + 1 + 1 我很赞同!

查看全部评分

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

xtdong 发表于 2022-4-4 17:17
取模数的算法  楼主是怎么处理的
梦里叹月 发表于 2022-4-4 17:20
这是要用30个密码数字来保护我3位数的资产吗?
烛九阴! 发表于 2022-4-4 17:24
 楼主| Lucifer2002 发表于 2022-4-4 17:33
xtdong 发表于 2022-4-4 17:17
取模数的算法  楼主是怎么处理的

你可以去看一下这篇帖子,应该能解决你的问题
https://blog.csdn.net/shield_sky/article/details/48866201
Zhaofeiyan 发表于 2022-4-4 20:24
大胆的尝试
DNZJZ52PJ 发表于 2022-4-4 21:05
为了让自己的密码更安全,我专门写了一个随机生成密码的iOS的app(passwordlist),有兴趣的可以试试。
as4202 发表于 2022-4-4 21:17
楼主是学数学专业的吧, 我觉得这些算法,挺难的。   平时的需求感觉是知道怎么用就可以了。
hs248613 发表于 2022-4-5 08:54
虽然看不大懂 ,但我大受震撼
gddfcz 发表于 2022-4-5 15:02
感觉,一般人看不懂……例如我。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 13:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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