Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
4 / 4 / 1
Регистрация: 01.11.2011
Сообщений: 165

QCA + Длинная арифметика

24.02.2015, 23:56. Показов 3244. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поставил криптографическую либу для Qt'а под названием QCA ради класса BigInteger, надеясь, что в нём реализованы операции с длинной арифметикой. Кроме +,-,*,/,% не нашел ни возведение в степень, ни получение обратного элемента, что мягко говоря огорчило.
Собственно вопрос(ы): может я эти операции где-то упустил из виду? или всё же их нету и надо реализовывать их? если да, то как? есть ли либы для Qt для работы с длинной арифметикой?
На сайте покопался, нашел, что возведение в степень реализовывается как https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{b}={e}^{b*lna}. наговнокодил с использованием преобразований Тейлора:
говнокод

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//возведение в степень больших чисел
void MainWindow::_pow(BigInteger x, BigInteger y)
{
    BigInteger tmp;
    tmp = _ln(x);
    tmp *= y;
    qDebug() << _exp(tmp).toString();
}
//возведение в натуральную степень
BigInteger MainWindow::_pow_int(BigInteger b, int i)
{
    if(i==0) return 1;
    BigInteger res(1);
    for(int k(1); k<=i ; k++)
        res *= b;
    return res;
}
//факториал
BigInteger MainWindow::_fact(int a)
{
    BigInteger res(1);
    for ( ; a > 1 ; res*=a--);
    return res;
}
//натуральный логарифм
BigInteger MainWindow::_ln(BigInteger b)
{
    b -= 1;
    qDebug() << "b" << b.toString();
    BigInteger res(0), tmp(0);
    for(int i(1) ; i<=50 ; i++)
    {
        tmp = _pow_int(b,i);
        tmp /= _fact(i);
        tmp *= _pow_int(-1, i+1);
        res += tmp;
        qDebug() << "tmp" << tmp.toString() << "res" << res.toString();
    }
    return res;
}
//экспонента
BigInteger MainWindow::_exp(BigInteger b)
{
    BigInteger sum(1), tmp(0);
    for(int i(1); i<=50 ; ++i)
    {
        tmp += _pow_int(b,i);
        tmp /= _fact(i);
        sum += tmp;
    }
    return sum;
}


Натуральный логарифм вообще криво считает, экспонента с погрешностью. Как быть с плавающей точкой для максимальной точности?
Пасибо...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2015, 23:56
Ответы с готовыми решениями:

Qt QCA работает с тормозами на windows 8
Уважаемые форумчане, столкнулся с такой проблемой: есть программа по шифрованию которая использует в своей работе библиотеку QCA с начало...

QCA (Qt Cryptographic Architecture) + Qt 4.8.6. Установка под Windows
Собственно как это сделать. Туториалы только для Linux. Скачал qca-2.1.0 с их сайта. В INSTALL сказано: cmake . make make install ...

Длинная арифметика
Реализовать все задачи (задача 1 – задача 9) в виде программного модуля по работе с «длинными» числами. Задача 1. Организация...

7
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.02.2015, 19:20
Я gmp использовал для реализации rsa

Использование библиотеки gmp на примере вычисления числа пи
0
4 / 4 / 1
Регистрация: 01.11.2011
Сообщений: 165
25.02.2015, 21:27  [ТС]
подключил уже. Но как сделать взаимодействие типов библиотеки gmp и виджетов Qt? (вывести например полученное значение типа mpf_t в виджете QTextEdit).
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.02.2015, 22:11
Переводя в char* cтроки.

Добавлено через 25 минут
так кажется есть что-то типа sprint.

А вот нашел с проекта выдрал (правда сам проект в C++Builder)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//---------------------- GMP ------------------------------------------------
#include <stdio.h>
#include "gmp.h"
#pragma comment(lib, "gmp-bcb.lib")
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
std::string RSAencrypt(std::string sdata,std::string smod,std::string sexp)
{
    mpz_t data,mod,exp;
    //  init
    mpz_init(data);
    mpz_init(mod);
    mpz_init(exp);
    // set
    mpz_init_set_str(mod,smod.c_str(),16);
    mpz_init_set_str(exp,sexp.c_str(),16);
    //  amount bits in Mod
    size_t bitlength= 4*smod.size();
    size_t keysize = (bitlength+7)>>3;
    //    pkcs1pad2 function
    sdata= pkcs1pad2(sdata,keysize);
    //  data to BigInt
    mpz_init_set_str(data,sdata.c_str(),2);
    //  modPowInt
    mpz_powm(data,data,exp,mod);
    // print to C-string
    char buf[1000]={0};                     //    buf size !!!
    gmp_sprintf(buf,"%Zx\0", data);
  // clear
    mpz_clear(data);
    mpz_clear(mod);
    mpz_clear(exp);
 
return buf;
}


В принципе так документация нормальная, так что смотрите в нее.
1
4 / 4 / 1
Регистрация: 01.11.2011
Сообщений: 165
25.02.2015, 22:51  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
mpz_init_set_str(mod,smod.c_str(),16);
* * mpz_init_set_str(exp,sexp.c_str(),16);
Цитата Сообщение от Avazart Посмотреть сообщение
mpz_init_set_str(data,sdata.c_str(),2);
Почему mod и exp представляются в hex, а data в bin системе исчисления?

Цитата Сообщение от Avazart Посмотреть сообщение
size_t keysize = (bitlength+7)>>3;
Почему именно так размер ключа рассчитывается?

Цитата Сообщение от Avazart Посмотреть сообщение
"%Zx\0"
Не могли бы Вы показать, где почитать про флаги функции gmp_sprintf, не нашел с разбегу сразу.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.02.2015, 23:30
Спросите что нибудь по проще, я давно это писал и там не обычный rsa как я помню.
Цитата Сообщение от magrif Посмотреть сообщение
Не могли бы Вы показать, где почитать про флаги функции gmp_sprintf, не нашел с разбегу сразу.
В документации.

Добавлено через 33 минуты
Кстати есть еще плюсовая обвертка над gmp - mpir она удобнее.
0
4 / 4 / 1
Регистрация: 01.11.2011
Сообщений: 165
26.02.2015, 00:11  [ТС]
а что скажете на счёт crypto++?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.02.2015, 01:41
Ничего, не использовал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2015, 01:41
Помогаю со студенческими работами здесь

Длинная арифметика
http://www.acmp.ru/index.asp?main=task&amp;id_task=103 Как решить эту задачу? С помощью чего, и в чем смысл решения длянной...

Длинная арифметика
Суть проблемы такова, нужно взять exp от большого числа ~1e6 модуль math не помогает, можно привести exp к ввиду kx + b но таже...

Длинная арифметика
Помогите пожалуйста, если не сложно)) Требуется найти сумму чисел в цикле от 10000 до 1000009, используя длинную арифметику))

Длинная арифметика
Дорогие, форумчане! Я пишу код по алгоритму шифрования Эль-Гамаля. Прошу вас помочь мне с расчетом длинных чисел. Скажите хотя бы что...

Длинная арифметика
Как сделать типы длинных чисел, например, знаковое 256-ти битное целое и 256-ти битное вещественное с 224-х битной мантиссой и 32-х битным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru