- 论坛徽章:
- 0
|
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 编辑 ] |
|