You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

改进加密算法技术问询:实现逐字符动态密钥的困境

动态密钥加密算法改进及解密问题求解

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)

问题分析

先梳理下现有加密流程:

  1. 反转输入文本
  2. 拆分文本为前后半段,交换位置并切换字符大小写
  3. 用固定密钥对每个字符进行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:41