换位加密
不是把字符替换成其他字符,而是搞乱消息符号的顺序,使原来的消息不可读。
算法大意
明文为:Common sense is not so common.
一行为8个格子,写入字符,超出则下一行。(空白字符以 ( ) 表示)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
C | o | m | m | o | n | s | |
e | n | s | e | i | s | ||
n | o | t | s | o | c | ||
o | m | m | o | n | . | 空 | 空 |
忽略 ‘.’ 右边两个空 数据
从左往右,从上往下则可以形成
密文:Cenoonommstmme oo snnio. s s c
代码实例
import math
# 换位加密算法
def encryptMessage(key,message):
# 申请二维数组存放密文数组
ciphertxt = [''] * key
for col in range(key):
# 初始化指针位置 并且初始化密文数组位置
pointer = col
while pointer < len(message):
#每隔相同间隔提取一个数据组成一个数组
ciphertxt[col] += message[pointer]
# 指针指向下一个数据间隔为key
pointer += key
# 将二维数组组成一串字符串
return ''.join(ciphertxt)
# 换位解密算法
def decryptMessage(key,message):
# 通过密钥获得列数
numOfColumns = math.ceil(len(message)/key)
# 密钥及行数
numOfRows = key
# 计算多余的空数据个数
numOfShadeBoxes = (numOfColumns * numOfRows) - len(message)
# 由于解密数据依然是从上到下,从左至右读取,所以二维数组申请为 1*列数
plaintext = [''] * numOfColumns
col = 0
row = 0
for symol in message:
plaintext[col] += symol
col += 1
# 横坐标到了范围外或者纵坐标到最后一列且行数到了下一个是空数据时
if(col == numOfColumns) or (col == numOfColumns -1 and row >= numOfRows - numOfShadeBoxes):
col = 0
row += 1
return ''.join(plaintext)
def main_e():
myMessage = 'Common sense is not so common.'
myKey = 8
ciphertxt = encryptMessage(myKey,myMessage)
print(ciphertxt + '|')
def main_d():
myMessage = 'Cenoonommstmme oo snnio. s s c'
myKey = 8
plaintext = decryptMessage(myKey,myMessage)
print(plaintext + '|')
if __name__ == "__main__":
main_e()
main_d()
运行结果
Cenoonommstmme oo snnio. s s c|
Common sense is not so common.|