Des*_*oyz -2 encryption haskell xor
我正在尝试编写一个名为encrypt的程序,它通过加扰每个字符来转换文本文件.这是通过提供一个密钥(字符串)作为命令行参数来实现的,该参数用于对输入进行编码.从而:
cat txtfile.txt | ./encrypt XXAYSAAZZ 将通过无限地匹配文本和密钥来加密文本.
The..
XXA..
The World...
XXAYSAAZZ etc..
The World is Not Enough etc...
XXAYSAAZZXXAYSAAZZXXAYS etc...
Run Code Online (Sandbox Code Playgroud)
和"exclusively-or-ing"相应的人物.但是由于XOR的性质,我应该能够通过这样做来保留原始文本:
cat txtfile.txt | ./encrypt XXAYSAAZZ | ./scramble XXAYSAAZZ
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有这个:
module Main where
import System
import Data.Char
main = do arg1 <- getArgs
txt <- getContents
putStr((snd (unzip (zip (txt) (cycle(head arg1))))))
Run Code Online (Sandbox Code Playgroud)
该XOR函数位于Data.Bits.
我尝试过多次使用xor,但我不确定如何解密文本.
请提出一些想法.
所以如果文字是:
cat txtfile.txt | ./encrypt XXAYSAAZZ
Run Code Online (Sandbox Code Playgroud)
"Hello World, Goodbye World"它应该(XXAYSAAZZ)无限地用KEY替换文本
"XXAYSAAZZXXAYSAAZZXXAYSAAZ"并 cat txtfile.txt | ./encrypt XXAYSAAZZ | ./encrypt XXAYSAAZZ应该回馈:
"Hello World, Goodbye World"
Run Code Online (Sandbox Code Playgroud)
如果你调用它两次它会返回原始字符串.
这个
putStr((snd (unzip (zip (txt) (cycle(head arg1))))))
Run Code Online (Sandbox Code Playgroud)
只需用循环密钥的等长部分替换文本.从那里检索文本是不可能的,因为除了它的长度之外的所有信息都已丢失.
似乎加密是针对xor具有配对键字符的每个文本字符(循环键以获得足够的长度).
对于这样的方案,该zipWith功能是有意的,
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
Run Code Online (Sandbox Code Playgroud)
这里,
let cypher = zipWith xor text (cycle key)
Run Code Online (Sandbox Code Playgroud)
但是你应该检查密钥是否为空,否则它将无效.但是,你必须解决另一个问题,没有
instance Bits Char where
Run Code Online (Sandbox Code Playgroud)
定义(并且因为到目前为止Bits有一个超类约束Num- 预定被删除 - 不可能).因此,您需要将键和明文转换为具有Bits实例的类型,最简单的方法是使用Enum实例Char
main = do
(key:_) <- getArgs
if null key
then error "encryption key must be nonempty"
else do
let xkey = map fromEnum (cycle key)
plain <- getContents
let cypher = map toEnum (zipWith xor xkey $ map fromEnum plain)
putStr cypher
Run Code Online (Sandbox Code Playgroud)