由于David Kahn的书
The Codebreakers,古老的密码学是我的爱好之一,我正在尝试使用Ruby类来处理旧密码,例如
Nihilist cipher和
ADFGVX.对于这些,一个有用的项目是
Straddling checkboard.我在Ruby中有以下实现并欢迎任何进步.
class Key是基类(如果需要,可以是虚拟类). Key#condensed是一种从给定单词中删除重复字母的方法.
class SKey < Key attr_reader :full_key attr_reader :alpha,:ralpha def initialize(key) super(key) @alpha = Hash.new @ralpha = Hash.new @full_key = checkboard() gen_rings() end # === checkboard # # Shuffle the alphabet a bit to avoid sequential allocation of the # code numbers # # Regular rectangle # ----------------- # Key is araBESQUE condensed into ARBESQU (len = 7) (height = 4) # Let word be ARBESQUCDFGHIJKLMnopTVWXYZ/- # # First passes will generate # # A RBESQUCDFGHIJKLMnopTVWXYZ/- c=0 0 x 6 # AC RBESQUDFGHIJKLMnopTVWXYZ/- c=6 1 x 6 # ACK RBESQUDFGHIJLMnopTVWXYZ/- c=12 2 x 6 # ACKV RBESQUDFGHIJLMnopTWXYZ/- c=18 3 x 6 # ACKVR BESQUDFGHIJLMnopTWXYZ/- c=0 0 x 5 # ACKVRD BESQUFGHIJLMnopTWXYZ/- c=5 1 x 5 # ... # ACKVRDLwbfmxeGNYSHOZQIP/UJT- # # Irregular rectangle # ------------------- # Key is SUBWAY condensed info SUBWAY (len = 6) (height = 5) # # S UBWAYCDEFGHIJKLMnopQRTVXZ/- c=0 0 x 5 # SC UBWAYDEFGHIJKLMnopQRTVXZ/- c=5 1 x 5 # SCI UBWAYDEFGHJKLMnopQRTVXZ/- c=10 2 x 5 # SCIO UBWAYDEFGHJKLMNPQRTVXZ/- c=15 3 x 5 # SCIOX UBWAYDEFGHJKLMNPQRTVZ/- c=20 4 x 5 # SCIOXU BWAYDEFGHJKLMNPQRTVZ/- c=0 0 x 4 # ... # SCIOXUDJPZBEKQ/WFLR-AG YHMNTV c=1 1 x 1 # SCIOXUDJPZBEKQ/WFLR-AGM YHNTV c=2 2 x 1 # SCIOXUDJPZBEKQ/WFLR-AGMT YHNV c=3 3 x 1 # SCIOXUDJPZBEKQ/WFLR-AGMTYHNV # def checkboard word = (@key + BASE).condensed.dup len = @key.condensed.length height = BASE.length / len # Odd rectangle # if (BASE.length % len) != 0 height = height + 1 end print "\ncheckboard size is #{len} x #{height}\n" res = "" (len - 1).downto(0) do |i| 0.upto(height - 1) do |j| if word.length <= (height - 1) then return res + word else c = word.slice!(i * j) if not c.nil? then res = res + c.chr end end end end return res end # == gen_rings # # Assign a code number for each letter. Each code number is # sequentially allocated from two pools,one with 0..7 and # the other with 80..99. # # Allocation is made on the following criterias # - if letter is one of ESANTIRU assign a single code number # - else assign of of the two letters ones # # Generate both the encoding and decoding rings. # # XXX FIXME Use of 80-99 is hardcoded # def gen_rings ind_u = 0 ind_d = 80 word = @full_key.dup word.scan(/./) do |c| if c =~ /[ESANTIRU]/ @alpha[c] = ind_u @ralpha[ind_u] = c ind_u = ind_u + 1 else @alpha[c] = ind_d @ralpha[ind_d] = c ind_d = ind_d + 1 end end end # -- gen_rings
Ruby / Python / Perl或伪代码对我来说很好.谢谢你的想法.
解决方法
也许你应该尝试
Refactor :my => code而不是?那里有很多乐于助人的人.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。