Python换位密码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python换位密码相关的知识,希望对你有一定的参考价值。
换位密码加密
为使得原文变得不可读取,换位密码将原始信息用一定的顺序进行重新排列,而不是用其他字符替换字符。包括空格和标点符号,这个消息有30个字符。我们将使用数字8作为密钥。
第一步是画出一些与密钥相等的盒子。我们将画8个,因为我们这个例子的密钥是8:
# |
# |
# |
# |
# |
# |
# |
# |
---|---|---|---|---|---|---|---|
# |
# |
# |
# |
# |
# |
# |
# |
第二步是开始将要加密的消息写入到框中,每个框都有一个字符。记住,空格是一个字符#
,以指示一个空格,所以它看起来不像一个空盒子)。
C | o | m | m | o | n | # |
s |
---|---|---|---|---|---|---|---|
# |
# |
# |
# |
# |
# |
# |
# |
我们只有8个盒子,但里面有30个字符。当用完盒子时,在第一行下画8个盒子的另一行。在创建完整消息之前,继续创建新行:
1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th |
---|---|---|---|---|---|---|---|
C | o | m | m | o | n | # |
s |
e | n | s | e | # |
i | s | # |
n | o | t | # |
s | o | # |
c |
o | m | m | o | n | . | # |
# |
我们在最后一排的两个箱子里放上阴影,提醒我们忽略它们。密文是从左上角往下读的列的字母。“C”、“e”、“n”和“o”来自第一列。当您到达列的最后一行时,移动到右下一列的顶部行。下一个字符是“O”、“n”、“O”、“m”。忽略阴影框。
密文是“Cenoonommstmme oo snnio. s s c”这样已经足够保密了到看不出明文了
加密的步骤:
1.计算明文的字符数和密钥
2.在一行中画一些与密钥相等的盒子。(例如,12的密钥的话就画12个盒子。)
3.开始填写框从左到右,每盒一个字符。
4.当你用完盒还有剩余字符,添加另一排盒子。
5.在最后一排的未使用的箱子盖上阴影。
6.从左上走下来,写出来的字。当您到达该列的底部,移动到右下一列。跳过任何阴影框。这将是密文。
换位密码加密的实现:
import pyperclip
def main():
myMessage = 'Common sense is not so common.'
myKey = 8
ciphertext = encryptMessage(myKey, myMessage)
## 用|区分末尾的空格
print(ciphertext + '|')
## 将生成的密文复制到粘贴板中
pyperclip.copy(ciphertext)
def encryptMessage(key, message):
ciphertext = [''] * key
for col in range(key):
pointer = col
while pointer < len(message):
ciphertext[col] += message[pointer]
## 移动指针一个密钥的长度
pointer += key
print ciphertext
return ''.join(ciphertext)
if __name__ == '__main__':
main()
运行结果:
Cenoonommstmme oo snnio. s s c|
更加优雅的方法:
import numpy as np
import math
from functools import reduce
s = list('Common sense is not so common.')s += (8 - len(s) % 8) * ['']
c = np.array(s)c.shape = -1, 8
print reduce(lambda x, y: x + y, [''.join(c[:, i]) for i in range(8)])
换位密码解密
假设已知密文为 “Cenoonommstmme oo snnio. s s c”。解密密文的第一步是计算需要绘制多少个盒子。若要找到此量,需要将密文消息的长度除以密钥的长度并且向上取整。密文长度为30个字符(与明文完全相同),密钥为8个字符。所以计算30除以8得到3.75。
这意味着我们要绘制一个网格的框有4列(我们刚刚计算的数量)和8行(关键)。它看起来像这样:
# |
# |
# |
# |
---|---|---|---|
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
# |
然后开始在框中填充一个字符的密文每箱。从左上角开始,然后向右走,就像我们在加密时一样。密文是“Cenoonommstmme oo snnio. s s c”。所以“Ceno”在第一行,然后“onom”排在第二,等等。在我们完成后,盒子将看起来像((s)代表一个空格 ):
C | e | n | o |
---|---|---|---|
o | n | o | m |
m | s | t | m |
m | e | # |
o |
o | # |
s | n |
n | i | o | . |
# |
s | # |
# |
s | # |
c | # |
解密的步骤
1.用密文的长度除以密钥并向上取整,将得到的结果作为盒子的列数,密钥作为行数
2.画出盒子,再将密文按行的方式对盒子的格子进行填充,密文不足时,对格子置空。
3.从左到右,从上到下,依次再从盒子抽取字符,即可得到明文
换位码解密的实现:
## encoding:utf-8
import numpy as np
import math
from functools import reduce
def DecryptT(ciphertext, key):
ciphertext = list(ciphertext)
for i in range(key - len(ciphertext) % key):
k = math.ceil(len(ciphertext) / key) * (key - i) - 1
ciphertext.insert(k, '')
c = np.array(ciphertext)
c.shape = key, -1
return reduce(lambda x, y: x + y, [''.join(c[:, i]) for i in range(int(math.ceil(len(ciphertext) / key)))])
if __name__ == "__main__":
print(DecryptT('Cenoonommstmme oo snnio. s s c', 8))
运行结果:
Common sense is not so common.
[Finished in 0.3s]
以上是关于Python换位密码的主要内容,如果未能解决你的问题,请参考以下文章
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段