Haskell RSA 加密
Haskell RSA encryption
对于一项作业,我需要编写两个函数,一个用于 RSA 加密,一个用于解密。
这些函数以密钥对和模作为参数。
rsaencrypt :: (Integer, Integer) -> Integer -> Integer
rsaencrypt (e, m) x = x^e `mod` m
rsadecrypt :: (Integer, Integer) -> Integer -> Integer
rsadecrypt (d, m) x = x^d `mod` m
假设我们有模数为 91 的密钥对 (5, 29)。
如果我们想加密数字 75,我们会得到密文 17,如果我们解密 17,我们会得到 75。到目前为止一切都很好。
但是当我尝试一个不同的数字时,假设是 97。我们得到密文 41,如果我们解密 41,我们得到 6。
为什么我的函数只适用于某些数字?
查看rsadecrypt
的定义:
rsadecrypt (d, m) x = x^d `mod` m
应该清楚的是,所有输出都将在 0
和 m-1
之间(含)。由于解密肯定位于该范围内,因此您无法为该范围之外的任何消息创建恰好 round-trip.
的加密
...并且,为了连接最后两个点,97
超出了0
到91-1
的范围,因此无法正确加密(对于这个定义“正确”)。
对于一项作业,我需要编写两个函数,一个用于 RSA 加密,一个用于解密。 这些函数以密钥对和模作为参数。
rsaencrypt :: (Integer, Integer) -> Integer -> Integer
rsaencrypt (e, m) x = x^e `mod` m
rsadecrypt :: (Integer, Integer) -> Integer -> Integer
rsadecrypt (d, m) x = x^d `mod` m
假设我们有模数为 91 的密钥对 (5, 29)。 如果我们想加密数字 75,我们会得到密文 17,如果我们解密 17,我们会得到 75。到目前为止一切都很好。 但是当我尝试一个不同的数字时,假设是 97。我们得到密文 41,如果我们解密 41,我们得到 6。 为什么我的函数只适用于某些数字?
查看rsadecrypt
的定义:
rsadecrypt (d, m) x = x^d `mod` m
应该清楚的是,所有输出都将在 0
和 m-1
之间(含)。由于解密肯定位于该范围内,因此您无法为该范围之外的任何消息创建恰好 round-trip.
...并且,为了连接最后两个点,97
超出了0
到91-1
的范围,因此无法正确加密(对于这个定义“正确”)。