📜  python npr 置换计算 - Python (1)

📅  最后修改于: 2023-12-03 15:04:06.613000             🧑  作者: Mango

Python NPR 置换计算

在密码学中,一种重要的技术叫做置换密码。它们是通过按照某种顺序重新排列一组数据来实现的。在这个过程中,原版本的数据被替换为分散的新数据。置换密码也被称为「Permutation Cipher」或「Transposition Cipher」。

在这篇文章中,我们将讨论如何使用 Python 实现 NPR 置换计算。

置换密码

置换密码中,每个字符是按照某种方式重新排列的。这个过程只是重新排列字母,不会进行任何加密。因此,置换密码可以很容易地被攻击。但是,与普通的单字母替换密码相比,它们更加复杂和安全。

NPR(Rail Fence)置换是一种被广泛使用的置换密码。在 NPR 置换中,明文被写成一条蛇形曲线,并沿蛇形线路读取数据。每一行都是按照顺序排列的,然后将它们合并到一起。在这个过程中,结构中的每个字符被重新排列,并最终形成密文。

我们现在将展示一个 Python 程序,用于计算 NPR 置换。

Python 程序
def encryptRailFence(text, key):
    rail = [['\n' for i in range(len(text))]
                  for j in range(key)]
    dir_down = False
    row, col = 0, 0
     
    for i in range(len(text)):
       
        if (row == 0) or (row == key - 1):
            dir_down = not dir_down
     
        rail[row][col] = text[i]
        col += 1
         
        if dir_down:
            row += 1
        else:
            row -= 1
     
    result = []
    for i in range(key):
        for j in range(len(text)):
            if rail[i][j] != '\n':
                result.append(rail[i][j])
    return("" . join(result))
     
def decryptRailFence(cipher, key):
    rail = [['\n' for i in range(len(cipher))]
                  for j in range(key)]
      
    dir_down = None
    row, col = 0, 0
     
    for i in range(len(cipher)):
        if row == 0:
            dir_down = True
        if row == key - 1:
            dir_down = False
           
        rail[row][col] = '*'
        col += 1
         
        if dir_down:
            row += 1
        else:
            row -= 1
    index = 0
    for i in range(key):
        for j in range(len(cipher)):
            if ((rail[i][j] == '*') and
               (index < len(cipher))):
                rail[i][j] = cipher[index]
                index += 1
     
    result = []
    row, col = 0, 0
    for i in range(len(cipher)):
       
        if row == 0:
            dir_down = True
        if row == key-1:
            dir_down = False
             
        if (rail[row][col] != '*'):
            result.append(rail[row][col])
            col += 1
        if dir_down:
            row += 1
        else:
            row -= 1
    return("".join(result))

上述 Python 程序实现了 NPR 置换。我们可以通过以下方式使用该程序:

# 加密
text = "HELLO WORLD"
key = 2
print(encryptRailFence(text, key))

# 解密
text = "HLOOLELWRD"
key = 2
print(decryptRailFence(text, key))

输出:

HLOWRDEELLO 
HELLO WORLD  
总结

NPR 置换是一种常用的密码技术,它可以有效地保护数据不被第三方访问,但并不是十分安全。在实际应用中,可以将 NPR 置换和其它加密技术结合起来使用,实现更安全的加密方案。