栅栏密码——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栅栏密码
1. 原理介绍
栅栏密码按照排列的顺序将明⽂(去掉空格)写⼊ m ⾏ n 列的数组,按照⾏的顺序将字符重新组合得到密⽂,这种⽅法称为 m 栏栅栏密码。

⽐较常见的是 2 栏栅栏密码。

⼀般来说,是给定 m,然后通过加密⽂本的长度确定 n。

以⽂本 ILoveYou,YouLoveMe,⾏数 m=4 为例:
1.1 加密
(1) ⾸先将⽂本按如下⽅式排列,按列将⽂本排列成 m ⾏的栅栏
I e,L M
L Y Y o e
o o o v
v u u e
(2) 将⽂本按⾏取出,得到密⽂ Ie,LMLYYoeooovvuue
事实上,加密过程就是把明⽂按 m 个分组,先取每组第 1 个,再取每组第 2 个,空缺的部分跳过,直⾄全部取完为⽌
1.2 解密
(1) ⾸先通过密⽂的长度 len = 18 和栅栏的栏数 m = 4 确定栅栏的列数 n;
计算 len / m 得到商 q 和余数 r,如果余数 r = 0,那么 n = q;否则 n = q + 1;
此处 n = 5
(2) 将密⽂按⾏排列,重新⽣成 m ⾏ n 列的数组
I e,L M
L Y Y o e
o o o v
v u u e
(3) 将上述数组由上⾄下,由左⾄右读取,恢复明⽂ ILoveYou,YouLoveMe
事实上,解密过程就是先计算出 n 和 r 后,将密⽂分成 m 组,前 m - r 组按 n 为单位分组,后 r 组按 n - 1 为单位分组,按照类似加密的⽅式执⾏,还原出明⽂
(1) 计算出 n = 5,r = 2,mid = (m - r) · n = 10, Len = 18
(2) 前 mid 个密⽂以 5 为单位分组,后 Len - mid = 8 个密⽂以 n - 1 = 4 为单位分组,得到
I L o v
e Y o u
,Y o u
L o v e
M e
(3) 按照加密的⽅式读取分组,得到明⽂
2. 具体实现(python)
2.1 加密
def encrypt(plaintext: str, m: int):
"""
:param plaintext: 明⽂
:param m: 栏数
:return: 密⽂
"""
ciphertext, length = [], len(plaintext)
for i in range(m): # 取出每个分组第 i 个元素
for j in range(i, length, m):
ciphertext.append(plaintext[j])
return ''.join(ciphertext)
2.2 解密
def decrypt(ciphertext: str, m: int):
"""
:param ciphertext: 密⽂
:param m: 栏数
:return: 明⽂
"""
plaintext, length = [], len(ciphertext)
q, r = divmod(length, m)
n = (q + 1) if r else q # 计算 n
mid = n * (m - r)
for i in range(n - 1):
# 前 m-r 个分组
for j in range(i, mid, n):
plaintext.append(ciphertext[j])
# 后 r 个分组
for j in range(mid + i, length, n - 1):
plaintext.append(ciphertext[j])
# 前 m-r 个分组最后⼀个元素
for j in range(n - 1, mid, n):
plaintext.append(ciphertext[j])
return ''.join(plaintext)
2.3 测试样例及结果
# 样例⼀
plaintext = "whateverisworthdoingisworthdoingwell"
m = 3 # 栅栏⾏数
ciphertext = "wtesrdnsrdneherwtogwtoglaviohiiohiwl"
# 样例⼆
plaintext = "healthismoreimportantthanwealth"
m = 2
ciphertext = "hatimriprathnelhelhsoemotntawat"
3. 其它
栅栏密码除了上述的⽅式,还有⼀种为 W型栅栏,此处不作介绍参考资料:《密码学实验教程》。

相关文档
最新文档