- 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.
movaxbx 03.08.2012 23:59 # +3
bormand 04.08.2012 11:25 # 0
Ага. Решение не самое удачное было.
Стоило, наверное, всякие p и a вынести в отдельный класс EllipticField, и добавить всем точкам и координатам ссылочку на поле, в котором они находятся. Тогда можно было бы и обыкновенные операторы запилить...
vistefan 04.08.2012 00:07 # +3
defecate-plusplus 04.08.2012 01:30 # +1
Программа шифорвания по Госту Р 34.10-2001. Написана на C++ Builder
Купить работу за ~80руб. или 3$
guest 04.08.2012 01:34 # +2
Пендосы ставят доллар во главу.
bormand 04.08.2012 11:29 # 0
Там еще был хэш по госту 34.11 и симметричное шифрование по госту 28147-89.
P.S. Классы были названы в стиле Кэпа - Gost28147, Gost3411, Gost3410 ;)
sayidandrtfm 04.08.2012 08:41 # 0
Дата: 3 августа 2012 в 17:12
Прочитали и вспомнили своё?
bormand 04.08.2012 11:21 # 0
sayidandrtfm 04.08.2012 11:29 # +2
TheHamstertamer 04.08.2012 13:22 # +5
Фу бля, фу нахуй.
sayidandrtfm 04.08.2012 13:26 # −2
sayidandrtfm 04.08.2012 13:46 # −3
Кирпичи тяжелы
eth0 04.08.2012 15:33 # +1
rat4 04.08.2012 15:37 # +4
govnomonad 04.08.2012 15:41 # +2
guest 04.08.2012 15:55 # +4
eth0 04.08.2012 17:11 # +3
vercetti 04.08.2012 23:59 # +2
vistefan 05.08.2012 00:13 # +1
bormand 05.08.2012 05:28 # +3
bormand 04.08.2012 19:21 # 0
А вот в ассимметрике - вполне можно лопухнуться, особенно если реализовывать операции над большими числами самостоятельно (как я и делал), и пропустить какой-нибудь крайний случай, который выпадает раз в 100 лет...
eth0 04.08.2012 19:35 # 0
Это если верифицировать заранее известным источником с теми же парами <ключ, плейнтекст>. Если же по принципу "сам зашифровал, сам расшифровал" - тут уже нужно детально исследовать реализацию.
> вполне можно лопухнуться
Вполне. Даже без длинной арифметики. Где-то выбрал "слабое" число, где-то простые числа не такие и всё.
bormand 04.08.2012 19:40 # +1
А где-то простые числа не простые ;) Если тест на простоту криво реализован... А они длинные и хрен проверишь...
И, на самом деле, даже правильная реализация может пострадать от хренового ГПСЧ, типа rand(), который выдает жалкие 4 миллиарда вариантов...
P.S. Я согласен, что не нужно изобретать велосипеды для продакшена. Но для души то можно? ;)
eth0 04.08.2012 21:02 # +1
Последнее, что я делал с криптографией - пытался заюзать в софтине Windows CryptoAPI. Собрал все-все-все возможные грабли из всех возможных и немного ещё.