在Python中的凯撒密码
在本教程中,我们将探讨一种加密方法,称为凯撒密码。它是密码学的一部分。
介绍
在这种技术中,每个字符都被替换为字母,按照字母表中固定的位置向前或向后移动。例如 – 字母B被替换为向下两个位置的字母D。D会变成F,依此类推。这种方法以著名的虚构角色朱利叶斯·凯撒命名,他用它与官员交流。
有一种算法用于实现它。让我们了解以下内容。
凯撒密码算法的特点
这个算法有几个特点,如下:
- 这种技术非常简单,可以应用于加密。
- 每个文本都被固定数量的字母位置向下或向上替换。
- 它是一种简单的替代密码类型。
每个字母的整数值都需要定义,这些字母已经向下移动。这个整数值也被称为位移。
我们可以使用模运算来表示这个概念,首先将字母转化为数字,按照模式,A = 0,B = 1,C = 2,D = 3…….. Z = 25。
下面的数学公式可以用于移动n个字母。
如何解密
解密和加密是相同的。我们可以创建一个函数,在相反的路径中实现移动以解密原始文本。不过,我们可以利用模运算下的密码周期性属性。
密码(n) = 解码(26-n)
解密可以使用相同的函数。相反,我们将修改位移值,使其等于 26 – 位移。
让我们来理解下面的示例 –
示例
def encypt_func(txt, s):
result = ""
# transverse the plain txt
for i in range(len(txt)):
char = txt[i]
# encypt_func uppercase characters in plain txt
if (char.isupper()):
result += chr((ord(char) + s - 64) % 26 + 65)
# encypt_func lowercase characters in plain txt
else:
result += chr((ord(char) + s - 96) % 26 + 97)
return result
# check the above function
txt = "CEASER CIPHER EXAMPLE"
s = 4
print("Plain txt : " + txt)
print("Shift pattern : " + str(s))
print("Cipher: " + encypt_func(txt, s))
输出:
Plain txt : CEASER CIPHER EXAMPLE
Shift pattern : 4
Cipher: HJFXJWsHNUMJWsJCFRUQJ
以上代码一次遍历了一个字符。根据文本加密和解密的过程的规则,它将每个字符转移了。
我们定义了几个特定位置的集合,生成了密文。
凯撒密码算法的漏洞
我们可以用多种方式来破解密文。其中一种方式是 穷举法 ,它涉及尝试每个可能的解密密钥。这种技术并不难,也不需要太多的努力。
让我们通过下面的示例来理解。
示例
msg = 'rGMTLIVrHIQSGIEWIVGIEWIV' #encrypted msg
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for k in range(len(LETTERS)):
transformation = ''
for s in msg:
if s in LETTERS:
n = LETTERS.find(s)
n = n - k
if n < 0:
n = n + len(LETTERS)
transformation = transformation + LETTERS[n]
else:
transformation = transformation + s
print('Hacking k #%s: %s' % (k, transformation))
输出:
Hacking k #25: rHNUMJWrIJRTHJFXJWHJFXJW
位移密码
位移密码算法是一种技术,其中明文中的字母顺序被重新排列以形成密文。该算法不支持实际的明文字母。
让我们通过一个示例来理解这个算法。
示例
我们将采用简单的列置换密码的示例,其中我们将每个字符水平地写在明文中,指定字母宽度。垂直书写的文本是密文,它创建了一个完全不同的密文。
让我们采用一个明文,并将简单的列置换技术应用如下。
我们把纯文本水平放置,密文以垂直格式创建为: hotnejpt.lao.lvi. 接收者必须使用相同的表格来解密密文为纯文本。
代码 –
让我们理解以下示例。
def split_len(sequence, length):
return [sequence[i:i + length] for i in range(0, len(sequence), length)]
def encode(k, plaintxt):
order = {
int(val): n for n, val in enumerate(k)
}
ciphertext = ''
for index in sorted(order.ks()):
for part in split_len(plaintxt, len(k)):
try:ciphertext += part[order[index]]
except IndexError:
continue
return ciphertext
print(encode('3214', 'HELLO'))
解释 –
在上面的代码中,我们创建了一个名为 split_len() 的函数,该函数将以列格式或行格式拆分明文字符。
encode() 方法使用指定的列数创建了密码文本,我们通过读取每一列打印了每个密码文本。
注意 – 排列技术旨在显著提高密码安全性。密码分析师观察到,使用相同的排列密码重新加密密码文本可以提供更好的安全性。