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

Python实现切格瓦拉密码遇解密问题:IndexError: string index out of range

解决切格瓦拉密码解密的IndexError问题

嘿,我太懂你这种“加密跑通了,解密卡壳”的烦躁了!别慌,这个IndexError: string index out of range基本是因为解密时没处理好密文长度的奇偶性,导致你访问了字符串不存在的位置。

问题根源分析

切格瓦拉密码的核心逻辑是把明文按奇偶位拆成两行再重组,解密时得反向操作:把密文拆回两行,再交替取字符还原明文。但如果密文长度是奇数,拆分后的第一行长度会比第二行长1;要是你没考虑这个细节,直接把密文硬拆成等长的两部分,后面取第二行字符时就会超出它的实际长度,触发索引越界错误。

修正后的解密代码示例

假设你的加密逻辑是「取明文奇数位(索引0、2、4...)放第一行,偶数位(索引1、3、5...)放第二行,再拼接第一行+第二行得到密文」,那解密代码可以这么写:

def che_guevara_decrypt(ciphertext):
    text_len = len(ciphertext)
    # 根据密文长度奇偶性拆分两行
    if text_len % 2 == 0:
        half = text_len // 2
        row_odd = ciphertext[:half]  # 对应加密时的奇数位行
        row_even = ciphertext[half:] # 对应加密时的偶数位行
    else:
        # 奇数长度时,奇数位行比偶数位行多1个字符
        half = (text_len + 1) // 2
        row_odd = ciphertext[:half]
        row_even = ciphertext[half:]
    
    plaintext = []
    # 先交替拼接两行长度相同的部分
    for i in range(len(row_even)):
        plaintext.append(row_odd[i])
        plaintext.append(row_even[i])
    # 如果奇数位行有剩余字符(密文长度为奇数时),补上最后一个
    if len(row_odd) > len(row_even):
        plaintext.append(row_odd[-1])
    
    return ''.join(plaintext)

# 搭配加密函数测试(和你的加密逻辑对齐即可)
def che_guevara_encrypt(plaintext):
    row_odd = plaintext[::2]  # 取所有奇数索引字符
    row_even = plaintext[1::2] # 取所有偶数索引字符
    return row_odd + row_even

# 测试:加密"hello"得到"hlleo",解密后还原为"hello"
test_cipher = che_guevara_encrypt("hello")
print(che_guevara_decrypt(test_cipher))  # 输出:hello

关键注意点

  • 必须先判断密文长度的奇偶性,拆分两行时保证长度匹配;
  • 交替拼接时,先循环到较短行的长度,再处理长行的剩余字符,避免越界;
  • 解密逻辑要和加密逻辑严格对应:如果加密时是先放偶数位行再放奇数位行,那解密拆分时要调换两行的顺序,别搞反了。

你可以把这段代码和自己的加密逻辑对齐调整,应该就能解决索引越界的问题啦!

内容的提问来源于stack exchange,提问作者Ax_art

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:56:18