X-Git-Url: http://nitlanguage.org diff --git a/lib/crypto.nit b/lib/crypto.nit index 73488d8..2abe5d7 100644 --- a/lib/crypto.nit +++ b/lib/crypto.nit @@ -42,7 +42,7 @@ redef class Char end end -redef class String +redef class Text # Performs a Rotation of `x` on each letter of self # # Works by replacing every character in `self` by its @@ -65,7 +65,7 @@ redef class String # # NOTE : Works on letters only # NOTE : This cipher is symmetrically decrypted with an `x` of 26-`x` - fun rot(x: Int): String do + fun rot(x: Int): Text do var rot = x % 26 if rot < 0 then rot += 26 var d = new FlatBuffer.with_capacity(length) @@ -93,7 +93,7 @@ redef class String # Therefore, yielding the ciphertext : "fgounbmtcieehkh" # # assert "fuckingbehemoth".railfence(4) == "fgounbmtcieehkh" - fun railfence(depth: Int): String do + fun railfence(depth: Int): Text do var lines = new Array[FlatBuffer].with_capacity(depth) var up = false for i in [0..depth[ do @@ -127,10 +127,10 @@ redef class String return r.to_s end - # Transforms a rail-fence-encrypted String to its original + # Transforms a rail-fence-encrypted Text to its original # # assert "fgounbmtcieehkh".unrail(4) == "fuckingbehemoth" - fun unrail(depth: Int): String do + fun unrail(depth: Int): Text do var dots = "." * length var arr = new FlatBuffer.from(dots) var start = 0 @@ -154,31 +154,23 @@ redef class String end return arr.to_s end +end + +redef class Bytes # Returns `self` xored with `key` # - # The shortest of the two is cycled through until the longest has been - # completely xored. + # The key is cycled through until the `self` has been completely xored. # - # assert "goodmorning".xor(" ".to_bytes) == "GOODMORNING" - fun xor(key: SequenceRead[Byte]): String do - var xored = new Bytes.empty - var shortest: SequenceRead[Byte] - var longest: SequenceRead[Byte] - - if key.length > self.length then - shortest = self.to_bytes - longest = key - else - shortest = key - longest = self.to_bytes - end + # assert "goodmorning".to_bytes.xorcipher(" ".to_bytes) == "GOODMORNING".bytes + fun xorcipher(key: Bytes): Bytes do + var xored = new Bytes.with_capacity(self.length) - for i in longest.length.times do - xored.add(longest[i] ^ shortest[i % shortest.length]) + for i in self.length.times do + xored.add(self[i] ^ key[i % key.length]) end - return xored.to_s + return xored end end @@ -214,7 +206,7 @@ redef class Int # # In the end, our string is read using the generated array # - # SEE: `String::unrail` for how the array is used + # SEE: `Text::unrail` for how the array is used private fun unrail_paces: Array[Couple[Int, Int]] do var ret = new Array[Couple[Int,Int]].with_capacity(self) var extremes = new Couple[Int, Int]((self - 1) * 2, (self - 1) * 2)