什么是置换密码?
置换密码是一种通过变换矩阵大小选出的顺序组合,而密钥仅仅是便于记忆,因此,置换密码比较简单,经不起穷举攻击(穷举攻击无视顺序),但可以把此种方法与其他密码结合可以得到相对安全且高效的密码。 --百度百科
置换密码的表示
基于python实现的置换算法:
实现文件的读写(生成随机数并存入到文件中):
def Create_file():
thislist1 = []
thislist2 = []
num1 = random.randint(5, 50)
num2 = random.randint(num1,2 * num1)
for i in range(0, num1):
random_num1 = random.randint(0, 50)
random_hex = hex(random_num1)[2:]
thislist1.append(random_hex)
for i in range(0, num2):
thislist2.append(i)
random.shuffle(thislist2)
with open("ReplaceData.txt", "w") as f:
f.write("Plaintext:")
for i in thislist1:
f.write("{} ".format(i))
f.write("\n")
with open("ReplaceData.txt", "a") as f:
f.write("Keys:")
for j in thislist2:
f.write("{},".format(j))
加密过程:
def replace(plaintext, keys) -> list:
thislist = []
for i in keys:
thislist.append(plaintext[i])
return thislist
解密过程:
def decrypt_cipher(cipher, k) -> list:
m = [None] * len(cipher)
for i in range(len(cipher)):
m[k[i]] = cipher[i]
return m
完整代码:
import random
def Create_file():
thislist1 = []
thislist2 = []
num1 = random.randint(5, 50)
num2 = random.randint(num1,2 * num1)
for i in range(0, num1):
random_num1 = random.randint(0, 50)
random_hex = hex(random_num1)[2:]
thislist1.append(random_hex)
for i in range(0, num2):
thislist2.append(i)
random.shuffle(thislist2)
with open("ReplaceData.txt", "w") as f:
f.write("Plaintext:")
for i in thislist1:
f.write("{} ".format(i))
f.write("\n")
with open("ReplaceData.txt", "a") as f:
f.write("Keys:")
for j in thislist2:
f.write("{},".format(j))
def replace(plaintext, keys) -> list:
thislist = []
for i in keys:
thislist.append(plaintext[i])
return thislist
def GUI_front(plainttext, keys):
print("相当于置换:")
print("| ", end="")
for i in plainttext:
print("{} ".format(i), end="")
print("|")
print("| ", end="")
for i in keys:
print("{} ".format(i), end="")
print("|")
def decrypt_cipher(cipher, k) -> list:
m = [None] * len(cipher)
for i in range(len(cipher)):
m[k[i]] = cipher[i]
return m
if __name__ == '__main__':
Create_file()
plaintext = []
keys = []
list_tmp = []
keys_tmp = []
with open("ReplaceData.txt", "r") as file:
for line1 in file:
if "Plaintext:" in line1:
list_tmp = line1.split("Plaintext:")[1].strip()
list_tmp = list_tmp.split(" ")
with open("ReplaceData.txt", "r") as file:
for line2 in file:
if "Keys:" in line2:
keys_tmp = line2.split("Keys:")[1].strip()
keys_tmp = keys_tmp.split(",")[:-1]
#去掉文件结尾的逗号,不知道还有什么解决办法
# print(type(keys_tmp))
# print(keys_tmp)
for i in keys_tmp:
i = int(i)
keys.append(i)
print(len(keys))
if keys.__len__() >= list_tmp.__len__():
for i in range(0, len(keys)):
plaintext.append(list_tmp[i % len(list_tmp)])
if len(keys) > len(plaintext):
keys = keys[:len(plaintext)]
elif len(keys) < len(plaintext):
# Extend keys to match the length of plaintext
keys_extension = keys * (len(plaintext) // len(keys)) + keys[:len(plaintext) % len(keys)]
keys = keys_extension
GUI_front(plaintext, keys)
print("加密后的序列为:", end="")
encrypted = replace(plaintext, keys)
for i in encrypted:
print("{} ".format(i),end="")
print("\n解密后的序列为:", end="")
decrypted = decrypt_cipher(encrypted, keys)
for i in decrypted:
print("{} ".format(i),end="")
GUI函数那里只是方便查看输出!
结果演示:
文件演示: