python实现栅栏密码
时间: 2023-10-23 10:11:00 浏览: 70
栅栏密码是一种简单的加密方法,将明文按照一定的规律分成若干组,然后将每组中的字符重新排列组成密文。
以下是一个简单的 Python 实现:
```python
def fence_cipher(text, n):
# 将明文按照栏数分组
groups = [''] * n
for i in range(len(text)):
groups[i % n] += text[i]
# 将每组字符重新排列组成密文
cipher_text = ''.join(groups)
return cipher_text
# 测试
text = 'hello world'
cipher_text = fence_cipher(text, 3)
print(cipher_text) # 'hlwlodreo l'
```
解释:
`fence_cipher` 函数接受两个参数:明文字符串 `text` 和栏数 `n`。函数首先将明文字符串按照栏数分成 `n` 个组,将每个字符依次放入这些组中。然后,将每组中的字符重新排列组成密文字符串 `cipher_text`,最后返回密文字符串。
在测试中,输入明文字符串 `'hello world'` 和栏数 `3`,输出密文字符串 `'hlwlodreo l'`。
相关问题
用python实现栅栏密码的加密和解密
栅栏密码是一种简单的替换密码,其基本思想是将明文中的字符沿着一个规定的路径排列,然后从上到下,从左到右依次读取。举个例子,如果明文是"HELLO WORLD",路径是3,那么加密后的密文就是"HOLWRLELD O"。
加密过程:
1. 将明文按照规定的路径排列成矩阵。
2. 按照行优先的顺序读取矩阵中的字符,得到密文。
解密过程:
1. 根据密文长度和路径计算出矩阵的行数和列数。
2. 将密文按照列优先的顺序排列成矩阵。
3. 按照行优先的顺序读取矩阵中的字符,得到明文。
下面是用Python实现栅栏密码的加密和解密:
```python
def encrypt(plain_text, path):
# 将明文按照路径排列成矩阵
rows = len(plain_text) // path
if len(plain_text) % path != 0:
rows += 1
matrix = [[''] * path for i in range(rows)]
index = 0
for i in range(rows):
for j in range(path):
if index < len(plain_text):
matrix[i][j] = plain_text[index]
index += 1
else:
break
# 按行优先顺序读取矩阵中的字符,得到密文
cipher_text = ''
for j in range(path):
for i in range(rows):
cipher_text += matrix[i][j]
return cipher_text
def decrypt(cipher_text, path):
# 根据密文长度和路径计算出矩阵的行数和列数
rows = len(cipher_text) // path
if len(cipher_text) % path != 0:
rows += 1
# 将密文按照列优先的顺序排列成矩阵
matrix = [[''] * rows for i in range(path)]
index = 0
for j in range(path):
for i in range(rows):
if index < len(cipher_text):
matrix[j][i] = cipher_text[index]
index += 1
else:
break
# 按照行优先的顺序读取矩阵中的字符,得到明文
plain_text = ''
for i in range(rows):
for j in range(path):
plain_text += matrix[j][i]
return plain_text
```
下面是一个示例:
```python
plain_text = 'HELLO WORLD'
path = 3
cipher_text = encrypt(plain_text, path)
print(cipher_text)
plain_text2 = decrypt(cipher_text, path)
print(plain_text2)
```
输出结果:
```
HOLWRLELD O
HELLO WORLD
```
python 凯撒密码栅栏密码
Python可以使用以下方式实现凯撒密码和栅栏密码:
凯撒密码是一种简单的密码转换方法,通过对原文中的每个字母进行移位来加密和解密。在Python中,可以使用ord()和chr()函数来实现字母的ASCII码和字符之间的转换。
例如,我们要将明文字符串"HELLO"使用凯撒密码进行加密,假设移位值为3:
```python
def caesar_cipher_encrypt(plaintext, shift):
ciphertext = ""
for char in plaintext:
if char.isalpha(): # 只对字母进行加密
ascii_value = ord(char.upper()) # 转换为大写字母的ASCII码
shifted_ascii_value = (ascii_value - 65 + shift) % 26 + 65 # 字母移位
ciphertext += chr(shifted_ascii_value) # 转换为加密后的字符
else:
ciphertext += char # 非字母字符直接添加到密文中
return ciphertext
plaintext = "HELLO"
shift = 3
ciphertext = caesar_cipher_encrypt(plaintext, shift)
print(ciphertext) # 输出:KHOOR
```
栅栏密码是一种换位密码,通过将明文的字母按照一定的规则重新排列来加密和解密。在Python中,可以使用循环和切片操作来实现栅栏密码。
例如,我们要将明文字符串"HELLO"使用栅栏密码进行加密,假设栏数为2:
```python
def rail_fence_cipher_encrypt(plaintext, num_rails):
rails = [[] for _ in range(num_rails)] # 创建栅栏列表
current_rail = 0
direction = 1 # 标识方向
for char in plaintext:
rails[current_rail].append(char) # 根据当前栏添加字符
if current_rail == num_rails - 1: # 到达最后一栏时改变方向
direction = -1
elif current_rail == 0: # 回到第一栏时改变方向
direction = 1
current_rail += direction # 改变当前栏
ciphertext = ""
for rail in rails:
ciphertext += "".join(rail) # 将栏内字符拼接成密文
return ciphertext
plaintext = "HELLO"
num_rails = 2
ciphertext = rail_fence_cipher_encrypt(plaintext, num_rails)
print(ciphertext) # 输出:HLOEL
```
以上就是使用Python实现凯撒密码和栅栏密码的简单示例,这些代码可以作为基础来进一步扩展和优化。