用 Haskell 做了一个简单的 Vigenre 加密
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
核心算法如下:
- module Vigenre (encrypt, decrypt)
- where
- import Data.List
- import Char
- -----------------------------------------------------------------
- -- helper functions
- alphaString :: String
- alphaString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- line :: Int -> String
- line n = b ++ a
- where
- (a, b) = splitAt n alphaString
- indexOfElement :: Char -> Int -> Int
- indexOfElement e n = i
- where
- (Just i) = elemIndex e (line n)
- offset :: Char -> Int
- offset x = ord x - ord 'A'
- adjustKey :: String -> String -> String
- adjustKey m k = map toUpper ((concat $ replicate quotient k)
- ++ take remainder k)
- where
- quotient = length m `div` length k
- remainder = length m `mod` length k
- -----------------------------------------------------------------
- encrypt :: String -> String -> String
- encrypt msgString keyString = zipWith encrypt' msgString' keyString'
- where
- encrypt' m k = (line $ offset k) !! (offset m)
- keyString' = map toUpper (adjustKey msgString keyString)
- msgString' = map toUpper msgString
- decrypt :: String -> String -> String
- decrypt msgString keyString = zipWith decrypt' msgString' keyString'
- where
- decrypt' m k = chr (indexOfElement m (offset k) + ord 'A')
- keyString' = map toUpper (adjustKey msgString keyString)
- msgString' = map toUpper msgString
复制代码
[ 本帖最后由 swordfish.cn 于 2008-9-12 10:23 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
只要将源文件的编码设置为 UTF-8 即可。
最开始那个窗口是你调用 panel 的时候产生的。至于说怎么去掉,方法肯定是有的,只不过我不知道
Hi,高兴点嘛
问题是,我现在不用 Windows 不行。
我可以实验下 Linux 下的情况,Windows 没环境。。。
MMMIX 能否帮我看一下那两个问题怎么解决?多谢。
很简单的,我也是现炒现卖而已。
take it easy
望洋兴叹中,我什么时候才能到这样的水平呀?。。。。
努力学习中。。。
Pretty good.