关于常用密码的加密与解密
因为很多线下比赛不能用工具加密或解密,只能自己写脚本,所以就自己捣鼓了一些出来下面是我写的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
这些都是简单的加解密,他们也有很多的变形用法,除此之外还有很多有趣又让人头大的密码,在这就直说着一些了,后面再慢慢整理
我也是个刚入门的菜鸡,对这方面有兴趣的朋友们可以一起来学习
取模数的算法楼主是怎么处理的 这是要用30个密码数字来保护我3位数的资产吗? 可以试试,感谢 xtdong 发表于 2022-4-4 17:17
取模数的算法楼主是怎么处理的
你可以去看一下这篇帖子,应该能解决你的问题
https://blog.csdn.net/shield_sky/article/details/48866201 大胆的尝试 为了让自己的密码更安全,我专门写了一个随机生成密码的iOS的app(passwordlist),有兴趣的可以试试。 楼主是学数学专业的吧, 我觉得这些算法,挺难的。 平时的需求感觉是知道怎么用就可以了。 虽然看不大懂 ,但我大受震撼 感觉,一般人看不懂……例如我。
页:
[1]
2