2013-07-22 77 views
1

作爲個人的挑戰,我試圖在Ruby中實現SIMON塊密碼。我遇到了一些發現處理數據的最佳方式的問題。與此問題相關的完整代碼位於:https://github.com/Rami114/Personal/blob/master/Simon/Simon.rbString到BigNum並返回(在Ruby中)以允許循環移位

SIMON需要XOR,移位和循環移位操作,最後一個是迫使我使用BigNums,因此我可以用數學執行左循環移位而不是字節數組上更復雜/更慢的雙循環。

有沒有更好的方法將字符串轉換爲BigNum並返回。

字符串 - > BIGNUM(其中N是64和Pt是明文的字符串)

pt = pt.chars.each_slice(N/8).map {|x| x.join.unpack('b*')[0].to_i(2)}.to_a 

所以我打破串爲單個字符,切成N大小的陣列(在SIMON字長)並將每個集合解壓縮爲BigNum。這似乎工作正常,我可以將其轉換回來。

現在我的SIMON代碼已經被破壞,但這更多的是我認爲/希望的數學而不是代碼。轉換回爲(其中C t是表示密文大數的陣列):

ct.map { |x| [x.to_s(2).rjust(128,'0')].pack('b*') }.join 

我似乎不得不右對齊墊字符串作爲大數是不確定的寬度,所以我沒有前導零。不幸的是,該包需要定義的具有合理的輸出。

這是一種有效的轉換方法嗎?有沒有更好的辦法?我無法確定是否有人希望有人能幫忙。

E:對於@torimus,我使用(從上面的鏈接)

def self.lcs (bytes, block_size, shift) 
    ((bytes << shift) | (bytes >> (block_size - shift))) & ((1<< block_size)-1) 
end 
+0

這應該是第二個列表中的'.rjust(64,'0')',或者是帶有額外空值的填充(我在兩行代碼中運行64個字符串)部分密碼算法? –

+0

關於[SO回答](http://stackoverflow.com/a/3477091/2352780)中的位旋轉操作可能會派上用場。 – Torimus

+0

@NeilSlater rjust在128位上,因爲SIMON輪一起處理2個N大小的字,形成一個128位的塊。 –

回答

0

循環移位實現如果你也同樣樂意與unpack('B*')與MSB第一二進制數字(你很可能是,如果所有的處理是圓形的),那麼你也可以使用.unpack('Q>'),而不是.unpack('B*')[0].to_i(2)產生pt

pt = "[email protected]" 

# Your version (with 'B' == msb first) for comparison: 
pt_nums = pt.chars.each_slice(N/8).map {|x| x.join.unpack('B*')[0].to_i(2)}.to_a 
=> [8176115190769218921, 8030025283835160424, 7668342063789995618, 7957105551900562521, 
    6145530372635706438, 5136437062280042563, 6215616529169527604, 3834312847369707840] 

# unpack to 64-bit unsigned integers directly 
pt_nums = pt.unpack('Q>8') 
=> [8176115190769218921, 8030025283835160424, 7668342063789995618, 7957105551900562521, 
    6145530372635706438, 5136437062280042563, 6215616529169527604, 3834312847369707840] 

有沒有本地128位包/解壓縮在另一個方向返回,但你可以使用Fixnum解決這個太:

split128 = 1 << 64 
ct = pt # Just to show round-trip 
ct.map { |x| [ x/split128, x % split128 ].pack('Q>2') }.join 

=> "\x00\x00\x00\x00\x00\x00\x00\x00qwertyui . . . " # truncated 

這避免了很多你的代碼臨時階段,但使用不同的字節編碼的代價 - 我不知道有足夠的瞭解SIMON是否對此有何評論適應您的需求。

+0

請注意,在第一個版本中存在一個錯誤,分割點是最初編寫的「1 << 64」而不是65。 –