- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
void EllipticPoint::Add(const EllipticPoint &b, const EllipticCoord &a, const EllipticCoord &p, EllipticPoint &res) {
if (!x.IsNotZero() && !y.IsNotZero()) {
res = b;
} else if (!b.x.IsNotZero() && !b.y.IsNotZero()) {
res = *this;
} else if (x.Compare(b.x)!=0) {
EllipticCoord tmp1, tmp2, lambda;
b.x.Sub(x,p,tmp1); tmp1.Invert(p,tmp2);
b.y.Sub(y,p,tmp1); tmp1.Mul(tmp2,p,lambda);
lambda.Mul(lambda,p,tmp1);
tmp1.Sub(x,p,tmp2); tmp2.Sub(b.x,p,res.x);
x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp2); tmp2.Sub(y,p,res.y);
} else if (y.Compare(b.y)==0) {
EllipticCoord tmp1, tmp2, tmp3, lambda;
x.Mul(x,p,tmp1); tmp1.Add(tmp1,p,tmp3); tmp1.Add(tmp3,p,tmp2); tmp2.Add(a,p,tmp1);
y.Add(y,p,tmp2); tmp2.Invert(p,tmp3); tmp1.Mul(tmp3,p,lambda);
lambda.Mul(lambda,p,tmp1); tmp1.Sub(x,p,tmp2); tmp2.Sub(x,p,res.x);
x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp3); tmp3.Sub(y,p,res.y);
} else {
res.x.SetZero();
res.y.SetZero();
}
}
Из моего велосипеда четырехлетней давности.
Кусочек реализации ГОСТ Р 34.10-2001.
Ага. Решение не самое удачное было.
Стоило, наверное, всякие p и a вынести в отдельный класс EllipticField, и добавить всем точкам и координатам ссылочку на поле, в котором они находятся. Тогда можно было бы и обыкновенные операторы запилить...
Программа шифорвания по Госту Р 34.10-2001. Написана на C++ Builder
Купить работу за ~80руб. или 3$
Пендосы ставят доллар во главу.
Там еще был хэш по госту 34.11 и симметричное шифрование по госту 28147-89.
P.S. Классы были названы в стиле Кэпа - Gost28147, Gost3411, Gost3410 ;)
Дата: 3 августа 2012 в 17:12
Прочитали и вспомнили своё?
Фу бля, фу нахуй.
Кирпичи тяжелы
А вот в ассимметрике - вполне можно лопухнуться, особенно если реализовывать операции над большими числами самостоятельно (как я и делал), и пропустить какой-нибудь крайний случай, который выпадает раз в 100 лет...
Это если верифицировать заранее известным источником с теми же парами <ключ, плейнтекст>. Если же по принципу "сам зашифровал, сам расшифровал" - тут уже нужно детально исследовать реализацию.
> вполне можно лопухнуться
Вполне. Даже без длинной арифметики. Где-то выбрал "слабое" число, где-то простые числа не такие и всё.
А где-то простые числа не простые ;) Если тест на простоту криво реализован... А они длинные и хрен проверишь...
И, на самом деле, даже правильная реализация может пострадать от хренового ГПСЧ, типа rand(), который выдает жалкие 4 миллиарда вариантов...
P.S. Я согласен, что не нужно изобретать велосипеды для продакшена. Но для души то можно? ;)
Последнее, что я делал с криптографией - пытался заюзать в софтине Windows CryptoAPI. Собрал все-все-все возможные грабли из всех возможных и немного ещё.