用 Haskell 做了一个简单的 Vigenre 加密

发布于 2022-08-07 09:28:34 字数 2863 浏览 35 评论 9

Vigenre 加密算法是一个简单替换密码。我的同学大多都用 Java、VB、VC 来实现。
但我想 Haskell 这样的语言去做这样的数学问题应该是很简单的,所以昨天晚上做了一下尝试。
另外还用 wxHaskell 做了一个很简单的界面。

目前算法的情况是,只支持大写字母的加密,小写字母会自动转化成大写字母,还不支持标点。但是要进行改进的话应该也不难。

存在的问题是:
1. 不清楚如何在 Haskell 中使用中文,好像是与编码有关。
2. 运行用 GHC 编译之后的 exe 文件,除了主窗口之外,后面还会出来一个 CMD 一样的窗口,很是难看。
希望知道解决问题方法的前辈们给一下指点。

附件中有两个文件:Vigenre.hs 是算法实现,VigenreFrame.hs 是界面代码。
希望大家多多拍砖。

编译环境是:Windows XP + GHC 6.8.3 + wxHaskell 0.10.3

核心算法如下:

  1. module Vigenre (encrypt, decrypt)
  2.     where
  3. import Data.List
  4. import Char
  5. -----------------------------------------------------------------
  6. -- helper functions
  7. alphaString :: String
  8. alphaString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9. line :: Int -> String
  10. line n = b ++ a
  11.     where
  12.       (a, b) = splitAt n alphaString
  13. indexOfElement :: Char -> Int -> Int
  14. indexOfElement e n = i
  15.     where
  16.       (Just i) = elemIndex e (line n)
  17. offset :: Char -> Int
  18. offset x = ord x - ord 'A'
  19. adjustKey :: String -> String -> String
  20. adjustKey m k = map toUpper ((concat $ replicate quotient k)
  21.                              ++ take remainder k)
  22.     where
  23.       quotient =  length m `div` length k
  24.       remainder = length m `mod` length k
  25. -----------------------------------------------------------------
  26. encrypt :: String -> String -> String
  27. encrypt msgString keyString = zipWith encrypt' msgString' keyString'
  28.     where
  29.       encrypt' m k = (line $ offset k) !! (offset m)
  30.       keyString' = map toUpper (adjustKey msgString keyString)
  31.       msgString' = map toUpper msgString
  32.       
  33. decrypt :: String -> String -> String
  34. decrypt msgString keyString = zipWith decrypt' msgString' keyString'
  35.     where
  36.       decrypt' m k = chr (indexOfElement m (offset k) + ord 'A')
  37.       keyString' = map toUpper (adjustKey msgString keyString)
  38.       msgString' = map toUpper msgString

复制代码

[ 本帖最后由 swordfish.cn 于 2008-9-12 10:23 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

最单纯的乌龟 2022-08-17 12:37:56

原帖由 swordfish.cn 于 2008-9-12 10:15 发表
存在的问题是:
1. 不清楚如何在 Haskell 中使用中文,好像是与编码有关。

只要将源文件的编码设置为 UTF-8 即可。

2. 运行用 GHC 编译之后的 exe 文件,除了主窗口之外,后面还会出来一个 CMD 一样的窗口,很是难看。

最开始那个窗口是你调用 panel 的时候产生的。至于说怎么去掉,方法肯定是有的,只不过我不知道

明月夜 2022-08-17 12:29:18

原帖由 swordfish.cn 于 2008-9-12 17:29 发表
问题是,我现在不用 Windows 不行。

Hi,高兴点嘛

信仰 2022-08-17 12:08:04

问题是,我现在不用 Windows 不行。

梦里的微风 2022-08-17 11:42:36

原帖由 swordfish.cn 于 2008-9-12 17:04 发表
MMMIX 能否帮我看一下那两个问题怎么解决?多谢。

我可以实验下 Linux 下的情况,Windows 没环境。。。

几度春秋 2022-08-17 10:08:12

MMMIX 能否帮我看一下那两个问题怎么解决?多谢。

独闯女儿国 2022-08-17 04:30:18

原帖由 drunkedcat 于 2008-9-12 16:43 发表
望洋兴叹中,我什么时候才能到这样的水平呀?。。。。
努力学习中。。。

很简单的,我也是现炒现卖而已。

一杆小烟枪 2022-08-16 17:30:29

原帖由 drunkedcat 于 2008-9-12 16:43 发表
望洋兴叹中,我什么时候才能到这样的水平呀?。。。。

take it easy

滴情不沾 2022-08-16 03:19:12

望洋兴叹中,我什么时候才能到这样的水平呀?。。。。
努力学习中。。。

杀お生予夺 2022-08-15 14:27:51

Pretty good.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文