Дешифровка алгоритмом Рабина

301
07 ноября 2017, 23:21

Работал над криптосистемой Рабина, шифровка далась без проблем, однако при дешифровке возникают проблемы. Вразумительных алгоритмнов и формул в интернетах практически нет, а те что есть работают через раз а именно: алгоритм корректо работает при p и q равных 11 и 19, 19 и 23. При остальныных ни один из 4х возвращаемых варианта не соответствует исходному файлу. Хотелось бы узнать писал ли кто-нибудь Рабина для произвольных файлов или хотя бы какие формулы для дешифровки рабочие. Кусочки кода дешифровки на шарпах прилагаются.

    private byte[] DecryptOneByte(uint c, int p, int q)
{
    int n = p * q;
    int[] m = CalculateM(p, q, c);  // [0] для p, [1] для q
    int[] y = AddFuctions.ExtendedEuclidian(p, q);  // [0] для p, [1] для q
    y[1] = p + y[1];
    int[] result = new int[4];
    result[0] = ((m[0] * q * y[1] + m[1] * p * y[0]) % n);
    result[1] = (-result[0] + n) % n;
    result[2] = ((m[0] * q * y[1] - m[1] * p * y[0]) % n);
    result[3] = (-result[2] + n) % n;
    for (int i = 0; i < result.Length; i++)
    {
        result[i] = Convert(result[i], n);
    }
    return new byte[4] { (byte)result[0], (byte)result[1], (byte)result[2], (byte)result[3] };
}
    private int Convert(int r, int n)
    {
        if (r < 0)
        {
            return n + r;
        }
        else
        {
            return r;
        }
    }
    private int[] CalculateM(int p, int q, uint c)
    {
        int[] m = new int[2];
        m[0] = (int)(Math.Pow((int)c, ((p + 1) / 4)) % p);
        m[1] = (int)(Math.Pow((int)c, ((q + 1) / 4)) % q);
        return m;
    }
}
    public static int[] ExtendedEuclidian(int p, int q)
    {
        int[] y = new int[2] { 0, 0 };
        gcd(p, q, ref y[0], ref y[1]);
        return y;
    }
    private static int gcd(int a, int b, ref int y0, ref int y1)
    {
        if (a == 0)
        {
            y0 = 0;
            y1 = 1;
            return b;
        }
        int x0 = 0;
        int x1 = 0;
        int d = gcd(b % a, a, ref x0, ref x1);
        y0 = x1 - (b / a) * x0;
        y1 = x0;
        return d;
    }
READ ALSO
Как загрузить zip файл с сайта, а затем его распаковать?

Как загрузить zip файл с сайта, а затем его распаковать?

Скачиваю во временную папку архив temppzip

239
C#: инициализация строки с JSON

C#: инициализация строки с JSON

Есть такие классы:

230
Передача объекта по ссылке в другой процесс

Передача объекта по ссылке в другой процесс

Существует ли какой-нибудь механизм передачи объектов именно по ссылке из одного процесса в другой? Чтобы несколько программ могли взаимодействовать...

231
обновление UI в потоке из ViewModel

обновление UI в потоке из ViewModel

При попытке использовать в отдельном потоке вылетает ошибка SystemWindows

431