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 == '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 != 'b':
    key = getKey()
print('你要翻译的信息是:')
if mode != '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,t),CODE_TABLE.items()))
            msg += UNCODE
    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
又由题得出分八段
8842101220480224404014224202480122
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


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

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

感觉,一般人看不懂……例如我。
页: [1] 2
查看完整版本: 关于常用密码的加密与解密