在本教程中,我们将探索一种称为凯撒密码的加密方法。它是密码学的一部分。
介绍
在这种技术中,每个字符被一个字母代替,这个字母位于字母表的后面或前面。例如-字母 B 被向下的两个位置代替。D 会变成 F,以此类推。这种方法是以流行的摩擦人物朱利叶斯·凯撒命名的,他用这种方法与官员交流。
有一个算法用来实现它。下面我们来了解一下。
凯撒密码算法的特点
该算法由下面给出的几个特征组成。
- 这种技术应用加密非常简单。
- 每个文本都被字母表中上下位置的固定数字所代替。
- 这是一种简单的替代密码。
需要一个整数值来定义每一个向下移动的文本。这个整数值也被称为移位。
我们可以用模运算来表示这个概念,首先把字母变成数字,根据图式,A = 0,B = 1,C = 2,D = 3……..Z = 25。
下面的数学公式可以用来移位n
个字母。
如何解密?
解密和加密一样。我们可以创建一个函数,在相反的路径上完成转换来解密原始文本。然而,我们可以在模下利用密码的循环性质。
密码(n) =去密码(26-n)
同样的功能可以用于解密。相反,我们将修改偏移值,使偏移= 26 - shift。
让我们理解下面的例子-
示例-
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() 方法用指定列数的密钥创建了密文,我们通过通读每一列打印了每一个密文。