#首先导入库,其实我只用到了numpy里的函数
import numpy as np
#import re
#import requests
#import matplotlib.pyplot as plt
import numpy as np
#第二步,设置自己的密码映射集(规则自己定,英文+中文+数字)
‘’’
规则:
1.如果是大写,变小写;反之,小写变大写
2.如果是汉字,它的ascii值立方放大
3.如果是数字,它的ascii值立方放大(可以平方放大,随意),此代码采用立方
4.如果是其他的字符,保持原样
思路:
首先用if,elif,else语句把不同种情况下的字符转变为加密后的字符
例如: 1.由 value= ord(‘爱’) 得到爱(中文字符)的ascii值 value=29233,value为 int类型
2.value 进行对应的函数变换,得到新的value_new = 值(假设是立方函数)
3.把 value_new 进行字符串化:‘29233**3’
4. 为了在解码的时候方便知道是什么类型,中文还是英文还是数字,所以考虑在3步骤之后加上独特的一个字符作为暗示,比如|这个字符
5.由上,爱 的对应的 加密后的形式为 ‘24981594792337|’,解码的时候判断如果有‘|’,则调用中文字符解码语句
6.其他数字,字母亦然,我学到的是一个思维,至于函数如何,可以稍作自我发挥
关键: 用列表分隔表示出,加密后的消息,一个字符加密后对应一长串放在列表的相应位置。
例如: 我爱你啊2! 哈哈22*
编码后显示为:15822703032625|24981594792337|8390176768000|10408782121704|125000,! 10223964721664|10223964721664|125000,125000,*
编码后的列表形式 :['15822703032625|', '24981594792337|', '8390176768000|', '10408782121704|', '125000,', '!', ' ', '10223964721664|', '10223964721664|', '125000,', '125000,', '*']
解释:第一个字符 '我' 编码后对应了 列表里的第一个元素 '15822703032625|',以此类推。
然后思考,只要我得到了类似这种加密后的消息,我只要遍历元素找到最后一个字符,然后进行判断字符类型。
然后就可以解码了。
#-------------------------------------------------------------------------------------------------------------------------------
编码 encoding
#-------------------------------------------------------------------------------------------------------------------------------
邀请您输入消息
message = input('请输入>>>>>')
#可以打印观察记住
print(message)
# 开始编码
result=''
result_list=[]
## 遍历消息中的每一个字符
for char in message:
value=ord(char)
## 如果Message中有数字的话,立方
if 47 < value < 57 :
# 并且用','号来暗示,方便解码
result_char = str(value**3)+','
result += result_char
result_list.append(result_char)
# 如果有中文的话,这里我还是用了立方,其实可以用别的
elif 19967 < value < 40917:
#这里用‘|’来作为暗示
result_char=str(value**3)+"|"
result+= result_char
result_list.append(result_char)
# 如果说是大写字母,这里用‘s'标记
elif 64 < value < 91:
result_char=str(value+32)+'s'
result+= result_char
result_list.append(result_char)
#如果是小写字母,这里用'b'作标记
elif 96 < value < 123:
result_char = str(value-32)+'b'
result+= result_char
result_list.append(result_char)
# 如果以上都不是,保持原样
else:
result+= char
result_list.append(char)
# 看看加密后的消息,以及列表形式表示出来
print('加密后为:'+ result)
print('加密后列表形式为',result_list)
#--------------------------------------------------------------------------------------------------------------------------------
开始解码, decoding
注意:result_list[i][0:-1]是选择除了最后一个字符的字符串
'1243124515a'中得到'1243124515'
#--------------------------------------------------------------------------------------------------------------------------------
# 结果的列表形式
result_list_str=[]
#遍历
for i in range(len(result_list)):
#根据 标记,是数字
if ',' in result_list[i]:
result_list_str.append(chr( int( np.cbrt( int( result_list[i][0:-1] ) ) ) ))
# 根据 标记,是中文汉字
elif '|' in result_list[i]:
result_list_str.append(chr( int( np.cbrt( int( result_list[i][0:-1] ) ) ) ) )
# 根据标记,是大写字母
elif 's' in result_list[i]:
result_list_str.append(chr( int( result_list[i][0:-1] )-32 ))
#根据标记,是小写字母
elif 'b' in result_list[i]:
result_list_str.append(chr( int( result_list[i][0:-1] )+32 ))
# 根据标记,是其他字符
else:
result_list_str.append(result_list[i])
print('解码后的列表形式:',result_list_str)
# 得到解码的字符串形式
decode=''
for i in range(len(result_list_str)):
decode+=result_list_str[i]
print('当当当当!!!!解码完毕!您的消息解码后为:',decode)
附上我的知乎的文章的链接:https://zhuanlan.zhihu.com/p/76589317