改进加密算法技术问询:实现逐字符动态密钥的困境
动态密钥加密算法改进及解密问题求解
Hey there! 我一开始只是为了完成学校作业才捣鼓这个加密算法,现在打算把它做成一个独立项目推进,所以来这儿请教各位大佬,寻求算法改进的建议。我的核心需求是实现密钥随每个字符动态变化来提升加密安全性,但折腾了一阵后遇到了麻烦——加密后的密文没法正常解密。下面是我目前的加密器和解密器代码:
现有加密器代码
text = input('Enter A Word : ') ##用于获取用户输入的文本、整数等 encrypt = '' ##用于存储加密结果的空值 temp = '' ##加密迭代过程中会被替换的临时空值 temp2 =0 ##加密迭代过程中会被替换的临时空值 temp_val=0 temp_char='' rtext= text[::-1] key=int(input('Enter your key (Your Encrypted Sentence Will Further be Encrypted Later) : '))##用于字母移位的密钥 for a in range (0,len(rtext)): if len(rtext) % 2==0: hlength=len(rtext)/2 else: hlength=(len(rtext)+1)/2 print(hlength) for i in range(int(hlength),len(rtext)): ##重新排列文本并切换大小写 if str.islower(rtext[i])==True: temp=temp+str.upper(rtext[i]) elif str.isupper(rtext[i])==True: temp=temp+str.lower(rtext[i]) else: temp=temp+rtext[i] for b in range(0,int(hlength)): ##重新排列文本并切换大小写 if str.islower(rtext[b])==True: temp=temp+str.upper(rtext[b]) elif str.isupper(rtext[b])==True: temp=temp+str.lower(rtext[b]) else: temp=temp+rtext[b] for j in range(0,len(temp)): temp_val=0 temp2=0 temp_val=ord(temp[j]) temp2=temp2+temp_val+int(key) temp_char=temp_char+chr(temp2) encrypt=temp_char print(encrypt) print(temp) print(temp2)
现有解密器代码
text = input('Enter A Word : ') ##用于获取用户输入的文本、整数等 decrypt = '' ##用于存储解密结果的空值 order=0 characters='' temp='' rtext=text[::-1] key=int(input('Enter your key (decryption) : '))##用于字母移位的密钥 for i in range (0,len(rtext)): order=0 order=order+ord(rtext[i])-int(key) characters=characters+chr(order) for a in range (0,len(rtext)): if len(rtext) % 2==0: hlength=len(rtext)/2 else: hlength=(len(rtext)+1)/2 for j in range (int(hlength),len(characters)): if str.islower(characters[j])==True: temp=temp+str.upper(characters[j]) elif str.isupper(characters[j])==True: temp=temp+str.lower(characters[j]) else: temp=temp+characters[j] for b in range (0,int(hlength)): if str.islower(characters[b])==True: temp=temp+str.upper(characters[b]) elif str.isupper(characters[b])==True: temp=temp+str.lower(characters[b]) else: temp=temp+characters[b] print(temp)
问题分析
先梳理下现有加密流程:
- 反转输入文本
- 拆分文本为前后半段,交换位置并切换字符大小写
- 用固定密钥对每个字符进行ASCII移位加密
解密流程则是反向操作,但问题在于如果要实现动态密钥,核心是解密时必须能完全复现加密时每一步的密钥值——如果加密时密钥变化没有可追溯的规则,解密时就无法还原出正确的明文。
动态密钥实现方案
我提供两个可行的动态密钥实现思路,从简单到进阶,你可以按需选择:
方案1:基于初始密钥+字符索引(简单易验证)
这个方案的逻辑很直观:每个字符的加密密钥是初始密钥 + 当前字符的位置索引,解密时用同样的索引生成密钥即可,规则清晰且容易复现。
修改后的加密器代码
text = input('Enter A Word : ') encrypt = '' temp = '' rtext = text[::-1] # 获取初始密钥 initial_key = int(input('Enter your initial key: ')) # 第一步:反转文本后拆分前后半段交换+大小写转换 if len(rtext) % 2 == 0: hlength = len(rtext) // 2 else: hlength = (len(rtext) + 1) // 2 # 拼接交换后的文本并切换大小写 for i in range(hlength, len(rtext)): if rtext[i].islower(): temp += rtext[i].upper() elif rtext[i].isupper(): temp += rtext[i].lower() else: temp += rtext[i] for b in range(0, hlength): if rtext[b].islower(): temp += rtext[b].upper() elif rtext[b].isupper(): temp += rtext[b].lower() else: temp += rtext[b] # 第二步:动态密钥移位加密 for idx, char in enumerate(temp): # 动态密钥 = 初始密钥 + 当前字符的索引(从0开始) dynamic_key = initial_key + idx encrypted_ascii = ord(char) + dynamic_key encrypt += chr(encrypted_ascii) print("Encrypted text:", encrypt)
修改后的解密器代码
encrypted_text = input('Enter Encrypted Text : ') decrypt = '' characters = '' initial_key = int(input('Enter your initial key: ')) # 第一步:动态密钥移位解密 for idx, char in enumerate(encrypted_text): # 解密密钥和加密时完全一致 dynamic_key = initial_key + idx decrypted_ascii = ord(char) - dynamic_key characters += chr(decrypted_ascii) # 第二步:还原交换半段+大小写转换 if len(characters) % 2 == 0: hlength = len(characters) // 2 else: hlength = (len(characters) + 1) // 2 # 加密时temp是「原rtext后半段转换后 + 原rtext前半段转换后」,解密时要拆成两部分交换 part1 = characters[:len(characters)-hlength] # 对应加密时的后半段转换内容 part2 = characters[len(characters)-hlength:] # 对应加密时的前半段转换内容 # 先拼接part2再拼接part1,同时还原大小写 for char in part2: if char.islower(): decrypt += char.upper() elif char.isupper(): decrypt += char.lower() else: decrypt += char for char in part1: if char.islower(): decrypt += char.upper() elif char.isupper(): decrypt += char.lower() else: decrypt += char # 最后反转文本,还原最开始的反转操作 decrypt = decrypt[::-1] print("Decrypted text:", decrypt)
方案2:基于初始密钥+前字符ASCII(进阶更安全)
如果想要更高的安全性,可以让密钥基于前一个字符的加密结果动态更新,这样密钥的变化更复杂,但解密时只要遵循同样的规则就能还原。
进阶加密器代码
text = input('Enter A Word : ') encrypt = '' temp = '' rtext = text[::-1] initial_key = int(input('Enter your initial key: ')) # 第一步:反转+交换半段+大小写转换(同方案1) if len(rtext) % 2 == 0: hlength = len(rtext) // 2 else: hlength = (len(rtext) + 1) // 2 for i in range(hlength, len(rtext)): if rtext[i].islower(): temp += rtext[i].upper() elif rtext[i].isupper(): temp += rtext[i].lower() else: temp += rtext[i] for b in range(0, hlength): if rtext[b].islower(): temp += rtext[b].upper() elif rtext[b].isupper(): temp += rtext[b].lower() else: temp += rtext[b] # 第二步:动态密钥加密(结合前字符ASCII) current_key = initial_key for idx, char in enumerate(temp): encrypted_ascii = ord(char) + current_key encrypt += chr(encrypted_ascii) # 更新密钥为当前加密字符的ASCII值(取模128保持在合理范围) current_key = encrypted_ascii % 128 print("Encrypted text:", encrypt)
进阶解密器代码
encrypted_text = input('Enter Encrypted Text : ') decrypt = '' characters = '' initial_key = int(input('Enter your initial key: ')) # 第一步:动态密钥解密(结合前字符ASCII) current_key = initial_key for idx, char in enumerate(encrypted_text): decrypted_ascii = ord(char) - current_key characters += chr(decrypted_ascii) # 密钥更新规则和加密时完全一致 current_key = ord(char) % 128 # 第二步:还原交换半段+大小写转换(同方案1) if len(characters) % 2 == 0: hlength = len(characters) // 2 else: hlength = (len(characters) + 1) // 2 part1 = characters[:len(characters)-hlength] part2 = characters[len(characters)-hlength:] for char in part2: if char.islower(): decrypt += char.upper() elif char.isupper(): decrypt += char.lower() else: decrypt += char for char in part1: if char.islower(): decrypt += char.upper() elif char.isupper(): decrypt += char.lower() else: decrypt += char # 最后反转文本 decrypt = decrypt[::-1] print("Decrypted text:", decrypt)
内容的提问来源于stack exchange,提问作者PythGeek
相关产品推荐
相关产品推荐

