换位加密算法

换位加密

不是把字符替换成其他字符,而是搞乱消息符号的顺序,使原来的消息不可读。

算法大意

明文为:Common sense is not so common.
一行为8个格子,写入字符,超出则下一行。(空白字符以 ( ) 表示)

12345678
Commons
enseis
notsoc
ommon.

忽略 ‘.’ 右边两个空 数据
从左往右,从上往下则可以形成
密文: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.|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值