您的位置:

Python 中的凯撒密码

在本教程中,我们将探索一种称为凯撒密码的加密方法。它是密码学的一部分。

介绍

在这种技术中,每个字符被一个字母代替,这个字母位于字母表的后面或前面。例如-字母 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() 方法用指定列数的密钥创建了密文,我们通过通读每一列打印了每一个密文。

注意——换位技术意味着加密安全性的重大改进。密码分析者观察到,使用相同的换位密码对密文进行重新加密显示出更好的安全性。