如何计算仿射密码的模乘乘数

时间:2013-10-30 09:05:31

标签: c# .net math modulo

我正在尝试创建一个使用仿射密码的小软件,这意味着 K1 和字母表中的字母数量(对于此数字使用 m )必须是互质的,即gcd(k1, m) == 1

基本上就是这样:

我有一个明文:

我有K1: 7

我有K2: 5

数字格式的明文是: 8 5 25

8 - 从h(字母表中的位置)和** 5 25 **对于 e y

是相同的

加密: 7 13 18

这是公式:

k1 * 8 + k2 mod 27 = 7

k1 * 5 + k2 mod 27 = 13

k1 * 25 + k2 mod 27 = 18

我有一个隐藏此功能的功能,但我不知道如何解密。

例如我有7个小时。我想再次获得8号,知道7,k1和k2。

你们有什么想法吗?

你输入k1,k2,结果的一些函数(例如7,对于h),它给了我8,但我真的不知道如何扭转它。

加密功能如下:

public List<int> get_crypted_char(string[] strr)
        {
            List<int> l = new List<int>();
            int i;
            for (i = 0; i < strr.Length; i++)
            {
                int ch = int.Parse(strr[i]);
                int numberback = k1 * ch + 5;
                numberback = (numberback % 27);
                l.Add(numberback);
            }
            return l;
        }

其中:string [] strr是包含明文的字符串。 功能示例: get_crypted_char({ “E”, “C”, “B”})

结果将是这样的列表{“5”,“3”,“2”}

更新 这是维基百科关于这种加密的链接,也是解密,但是...我真的不明白“如何” http://en.wikipedia.org/wiki/Affine_cipher

3 个答案:

答案 0 :(得分:0)

这是不可能的(一般情况下,对于仿射密码,请参阅下面的更新)。这就是为什么模块操作在安全算法中经常使用的原因 - 它是不可逆的。但是,我们为什么不尝试?

result = (k1 * input + k2) % 27 (*1)

我们来看第一个字母:

result = (7 * 8 + 5) % 27 = 7

那很酷。现在,因为我们说过:

result = (k1 * input + k2) % 27

以下情况也是如此:

k1 * input + k2 = 27 * div + result (*2)

,其中

div = (k1 * input + k2) / 27 (integral division)

很明显(如果%b = c,那么a = b * n + c,其中n是整数除法a / b的结果)。

你知道k1(即7),k2(5)和结果(7)的值。因此,当我们将这些值放入(* 2)时,我们得到以下结果:

7 * input + 5 = 27 * div + 7 //You need to solve this

正如你所看到的,要解决这个问题是不可能的,因为你还需要知道积分除法的结果 - 将它转换为函数的语言,你需要

的值。
numberback / 27

这是未知的。所以答案是:你不能反转你的函数的结果,只使用输出它返回


**更新**


我过分关注问题的标题,所以上面的答案并不完全正确。不过,我决定不删除它,而是写一个更新。

因此,对于您的特定情况(仿射密码)的答案是:是的,您可以撤消它。

正如您在wiki上看到的,用于以下加密函数的仿射密码的解密函数:

E(input) = a*input + b mod m

定义为:

D(enc) = a^-1 * (enc - b) mod m

这里唯一可能的问题是计算^ -1,这是模乘法逆。

wiki上阅读,我只提供示例。

在你的情况下a = k1 = 7且m = 27.所以:

7^-1 = p mod 27
7p = 1 mod 27

换句话说,你需要找到满足以下条件的p:7p%27 = 1。 p可以使用扩展的欧几里得算法计算,我将其计算为4(4 * 7 = 28,28%27 = 1)。

检查,是否可以现在解密您的输出:

E(8) = 7*8 + 5 mod 27 = 7

D(7) = 4 * (7 - 5) mod 27 = 8

希望有所帮助:)

答案 1 :(得分:0)

请注意,其他答案没有考虑到手头的算法是仿射密码,即手头有一些条件,最重要的一个是k1和{{1}的互质状态}。

在你的情况下,它将是:

m

http://comeoncodeon.wordpress.com/2011/10/09/modular-multiplicative-inverse/获取的ModInverse实现。

答案 2 :(得分:0)

我已经创建了一个程序,它将告诉某些东西的模块化反转。我会让你用它。它发布在下面。

# Cryptomath Module


def gcf(a, b):
    # Return the GCD of a & b using Euclid's Algorithm
    while a != 0:
        a, b = b % a, a
    return b


def findModInverse(a, m):
    # Return the modular inverse of a % m, which is
    # the number x such that a*x % m = 1

    if gcf(a, m) != 1:
        return None # No mode inverese if a & m aren't relatively prime

    # Calculate using the Extended Euclidean Algorithm:
    u1, u2, u3 = 1, 0, a
    v1, v2, v3 = 0, 1, m
    while v3 != 0:
        q = u3 // v3 # // is the integer division operator
        v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q *
v3), v1, v2, v3
    return u1 % m

注意:使用扩展的欧几里德算法找到模块化逆。以下是维基百科的条目:http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm

注意:这需要作为要使用的模块导入。希望它有所帮助。