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
相关产品推荐
相关产品推荐

