Ruby加密算法解密时出现ZeroDivisionError问题求助
解决Ruby解密算法中的ZeroDivisionError问题
嘿,我看你在写Ruby加密算法的时候,加密正常但解密卡在了第67行的ZeroDivisionError(除以零)上,这确实挺头疼的。结合你给的代码片段,我来帮你捋捋可能的问题和解决思路:
核心问题定位
这个错误说明在第67行的除法操作里,除数变成了0。从你处理对称密钥的代码来看,问题大概率出在密钥转换后的数值有效性上。
可能的原因及修复方案
密钥转换覆盖不全:你现在只把
a/b/c替换成了1/2/3,但如果用户输入的密钥里有其他字符(比如d到z、符号、空格),这些字符没被替换,后续转成数值的时候可能会变成0或者空值,直接导致除法失败。
推荐你换个更全面的转换方式,比如用字母的ASCII码来映射:# 把每个字母转成1-26的数字(不区分大小写) symetricKey = symetricKey.chars.map do |c| c.downcase.ord - 96 # 'a'的ASCII是97,减完就是1,以此类推 end.join这样不管输入哪个字母,都能得到有效的非零数字,避免出现0值。
解密逻辑未做除数校验:假设第67行的代码是类似
result = some_value / key_digit的写法,如果key_digit是0,肯定会炸。你可以在除法前加个校验:divisor = key_part.to_i if divisor == 0 puts "密钥里包含无效字符,请检查输入!" exit # 或者做其他错误处理 end result = some_value / divisor输入未做有效性校验:如果用户输入的密钥是空的,或者全是没被替换的字符(比如
xyz),转换后可能变成空字符串,转成整数就是0。所以在处理密钥前先加个检查:print "> " symetricKey = gets.chomp.strip if symetricKey.empty? puts "密钥不能为空哦!" exit end # 转换后检查是否还有非数字字符 symetricKey.gsub!('a', '1').gsub!('b', '2').gsub!('c', '3') if symetricKey.match?(/\D/) puts "密钥只能包含a、b、c或者数字1、2、3哦!" exit end
小提示
如果能把第67行的具体代码贴出来,就能更精准地定位问题啦!不过从目前的信息来看,核心就是除数变成了0,从密钥转换和输入校验这两块入手,应该能搞定这个问题。
内容的提问来源于stack exchange,提问作者huw
相关产品推荐
相关产品推荐

