作爲個人的挑戰,我試圖在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
這應該是第二個列表中的'.rjust(64,'0')',或者是帶有額外空值的填充(我在兩行代碼中運行64個字符串)部分密碼算法? –
關於[SO回答](http://stackoverflow.com/a/3477091/2352780)中的位旋轉操作可能會派上用場。 – Torimus
@NeilSlater rjust在128位上,因爲SIMON輪一起處理2個N大小的字,形成一個128位的塊。 –