Haskell加密程序

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)

如果你调用它两次它会返回原始字符串.

Dan*_*her 5

这个

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)

  • 确实如此,这就是xor的工作原理. (4认同)