简单py解密笔记
原文及思路
import base64
# Base64编码
# base64是一种用64个字符来表示任意二进制数据的方法。(因为2的6次方为64)
# base64编码要求把3个8位字节(3*8=24)转化为4个6位字节(4*6=24),之后在6位字节的前面补两个0,形成新的8位字节。
# 如果剩下的字符不足3个字节,则用0填充,输出字符试用‘=’,因此编码后输出带文本末尾可能会出现一个或两个‘=’。
def encryption(str, n):
cipher = []
for i in range(len(str)):
if str[i].islower():
if ord(str[i]) < 123-n:
c = chr(ord(str[i]) + n)
cipher.append(c)
else:
c = chr(ord(str[i]) + n - 26)
cipher.append(c)
elif str[i].isupper():
if ord(str[i]) < 91-n:
c = chr(ord(str[i]) + n)
cipher.append(c)
else:
c = chr(ord(str[i]) + n - 26)
cipher.append(c)
else:
c = str[i]
cipher.append(c)
cipherstr = ('').join(cipher)
return cipherstr
# 凯撒密码
# 每一个英文字符循环替换为字母表序列中该字符后面的第n个字符
def rot13(s, OffSet=13):
def encodeCh(ch):
f = lambda x: chr((ord(ch) - x + OffSet) % 26 + x)
return f(97) if ch.islower() else (f(65) if ch.isupper() else ch)
return ''.join(encodeCh(c) for c in s)
# ROT13加密
# rot13是一种简易的置换,将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
# 密文:N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
flag = "ABC012"
print(flag)
for i in range(0,len(flag)):
d = (ord(flag[i]))+1
flag+=(chr(d))
print(len(flag))
print(i,end = ",")
print(flag[i])
print(ord(flag[i]))
print(d)
print(chr(d))
print(flag)
print(flag[0:6:1])
j = (rot13(flag[::-1]))
print(flag[::-1])
print(rot13(flag[::-1]))
# j用凯撒密码加密
flag = encryption(j,4)
print(flag)
# 编码格式转换为UTF-8
flag = flag.encode('utf-8')
print(flag)
# UTF-8解码
print(flag.decode('utf-8'))
# 采用base64进行加密
# str() 函数将对象转化为适于人阅读的形式
miwen = str(base64.b64encode(flag))
print(base64.b64encode(flag))
print(miwen)
# 解密时使用
# print(base64.b64encode(miwen))得到flag
# # reverse( )用于列表中数据的反转
# # join()函数
# # 语法: 'sep'.join(seq)
# # sep:分隔符。可以为空
# # seq:要连接的元素序列、字符串、元组、字典
# # 上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
# # 返回值:返回一个以分隔符sep连接各个元素后生成的字符串
print(''.join(reversed(miwen)))
print(''.join(reversed(''.join(reversed(miwen)))))
已知密文推导最初字符串
#密文==AcvBna6JGdyNnY0J3Yzpme4J3Y3FHcxtWYjV3c0NWdzRGdrFWezRGe'
import base64
def encryption(str, n):
cipher = []
for i in range(len(str)):
if str[i].islower():
if ord(str[i]) < 123-n:
c = chr(ord(str[i]) + n)
cipher.append(c)
else:
c = chr(ord(str[i]) + n - 26)
cipher.append(c)
elif str[i].isupper():
if ord(str[i]) < 91-n:
c = chr(ord(str[i]) + n)
cipher.append(c)
else:
c = chr(ord(str[i]) + n - 26)
cipher.append(c)
else:
c = str[i]
cipher.append(c)
cipherstr = ('').join(cipher)
return cipherstr
def rot13(s, OffSet=13):
def encodeCh(ch):
f = lambda x: chr((ord(ch) - x + OffSet) % 26 + x)
return f(97) if ch.islower() else (f(65) if ch.isupper() else ch)
return ''.join(encodeCh(c) for c in s)
# base64解码
miwen = b'==AcvBna6JGdyNnY0J3Yzpme4J3Y3FHcxtWYjV3c0NWdzRGdrFWezRGe'
print(base64.b64encode(miwen))
# UTF-8解码
print(base64.b64encode(miwen).decode('utf-8'))
i = 'PT1BY3ZCbmE2SkdkeU5uWTBKM1l6cG1lNEozWTNGSGN4dFdZalYzYzBOV2R6UkdkckZXZXpSR2U='
print(i)
# 凯撒密码解密
j = encryption(i,22) #使用凯撒加密时,每个英文替换为该字母后面的第4个字符,解密时把每个英文替换为该字母后面的第22个字符
print(j)
# ROT13解密
k = j[::-1]
print(k)
print(rot13(k))
print(len(k))
print(k[0:38:1])