Python教程-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()方法使用指定的列数创建了密码文本,并通过读取每一列来打印每个密码文本。