Haskell 语言 RSA非对称加密签名实战

Haskell阿木 发布于 2025-06-24 9 次阅读


Haskell 语言 RSA 非对称加密签名实战

RSA(Rivest-Shamir-Adleman)算法是一种广泛使用的非对称加密算法,它基于大整数的因式分解的难度。在Haskell中实现RSA算法,不仅可以加深我们对加密原理的理解,还可以提升编程能力。本文将围绕Haskell语言,详细介绍RSA非对称加密签名的实战过程。

RSA算法概述

RSA算法是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥用于加密信息,私钥用于解密信息。RSA算法的安全性基于大整数的因式分解的难度。

RSA算法步骤

1. 选择两个大质数 ( p ) 和 ( q )。

2. 计算 ( n = p times q ) 和 ( phi(n) = (p-1) times (q-1) )。

3. 选择一个整数 ( e ),满足 ( 1 < e < phi(n) ) 且 ( e ) 与 ( phi(n) ) 互质。

4. 计算 ( d ),满足 ( d times e equiv 1 mod phi(n) )。

5. 公钥为 ( (n, e) ),私钥为 ( (n, d) )。

Haskell环境搭建

在开始编写RSA算法之前,我们需要搭建一个Haskell开发环境。以下是搭建Haskell环境的步骤:

1. 下载并安装Haskell平台(Haskell Platform)。

2. 打开终端,输入 `cabal update` 更新包列表。

3. 创建一个新的Haskell项目,例如 `rsa-encryption`。

RSA算法实现

下面是使用Haskell语言实现的RSA算法的核心部分。

haskell

import Control.Exception (bracket)


import Crypto.Random (getRandomBytes)


import Data.Bits (shiftL, (.&.))


import Data.Word (Word64)


import Numeric (showHex)


import Text.Printf (printf)

-- 生成随机质数


generatePrime :: Int -> IO Word64


generatePrime bits = do


bytes <- getRandomBytes (bits `div` 8 + 1)


let num = foldl (acc b -> acc 256 + fromIntegral b) 0 bytes


return $ num `shiftL` (64 - bits)

-- 判断是否为质数


isPrime :: Word64 -> IO Bool


isPrime n = do


let limit = floor $ sqrt $ fromIntegral n


return $ all (x -> n `mod` x /= 0) [2..limit]

-- 生成质数


generatePrimeNumber :: Int -> IO Word64


generatePrimeNumber bits = do


prime <- generatePrime bits


if isPrime prime


then return prime


else generatePrimeNumber bits

-- 计算最大公约数


gcd :: Integer -> Integer -> Integer


gcd a b = if b == 0 then a else gcd b (a `mod` b)

-- 判断互质


coprime :: Integer -> Integer -> Bool


coprime a b = gcd a b == 1

-- 求模逆


modInverse :: Integer -> Integer -> Integer


modInverse a b = let (q, r) = gcdExt a b in if r == 1 then q else error "modInverse: a and b are not coprime"

-- 欧几里得扩展算法


gcdExt :: Integer -> Integer -> (Integer, Integer, Integer)


gcdExt a b = let (q, r, s, t) = egcd a b in (s, t, r, q)

-- 欧几里得扩展算法的辅助函数


egcd :: Integer -> Integer -> (Integer, Integer, Integer)


egcd a b = if b == 0 then (1, 0, a) else let (q, r, s, t) = egcd b (a `mod` b) in (t, s - q t, r)

-- 生成RSA密钥对


generateRSAKeys :: Int -> IO ((Word64, Word64), (Word64, Word64))


generateRSAKeys bits = do


p <- generatePrimeNumber bits


q <- generatePrimeNumber bits


let n = p q


phi = (p - 1) (q - 1)


e <- generatePrime (bits `div` 2)


if coprime e phi


then do


d <- return $ modInverse e phi


return ((n, e), (n, d))


else generateRSAKeys bits

-- 加密


encrypt :: (Word64, Word64) -> Word64 -> Word64


encrypt (n, e) m = let c = mod (shiftL m e) n in c

-- 解密


decrypt :: (Word64, Word64) -> Word64 -> Word64


decrypt (n, d) c = let m = mod (shiftL c d) n in m

-- 签名


sign :: (Word64, Word64) -> Word64 -> Word64


sign (n, d) m = let s = mod (shiftL m d) n in s

-- 验证签名


verify :: (Word64, Word64) -> Word64 -> Word64 -> Bool


verify (n, e) m s = sign (n, e) m == s


实战案例

下面是一个使用Haskell语言实现RSA非对称加密签名的实战案例。

haskell

main :: IO ()


main = do


-- 生成密钥对


((n, e), (n, d)) <- generateRSAKeys 256


-- 待加密信息


message <- return 123456789


-- 加密信息


encrypted <- return $ encrypt (n, e) message


-- 签名


signature <- return $ sign (n, d) encrypted


-- 验证签名


let verified = verify (n, e) encrypted signature


-- 输出结果


printf "Original message: %d" message


printf "Encrypted message: %016x" encrypted


printf "Signature: %016x" signature


printf "Verification: %s" (if verified then "Success" else "Failure")


总结

本文介绍了使用Haskell语言实现RSA非对称加密签名的实战过程。通过学习RSA算法的原理和Haskell编程,我们可以更好地理解加密技术,并提升编程能力。在实际应用中,RSA算法广泛应用于数字签名、安全通信等领域,具有重要的应用价值。