Криптография с открытым исходным кодом для Delphi

  • Автор темы dmitry.yanko
  • 5618
  • Обновлено
  • 23, Apr 2015
  • #2
SecureBlackbox - в сети можно найти бесплатно 12.0.258 - от 15.08.2014: он много платформенный, при желании можно взять нужный *.pas и переделать для своих нужд как нативку. Из бесплатных есть: Fundamentals Library, dcpcrypt2, а также от Synapse. IPWorks ни когда не использовал и не хочу.
 

alexp25


Рег
16 Apr, 2015

Тем
0

Постов
6

Баллов
6
  • 27, May 2015
  • #3
Я думаю что идеального компонента просто не существует, чтобы везде работало.

Fundamentals Library, dcpcrypt2 пробовал, но в PHP к примеру расшифровать нельзя то что ими зашифровано.

Равно как и данные из PHP ими не обработать.

Спрашивал у знатоков - сказали что реализация алгоритмов шифрование должна быть идентична везде, от компонента делфи до скрипта/кода на PHP, Java, C# и прочее.

Тогда будет работать. Я тупо забил на это и для передачи данных решил использовать SSL TCP соединение, вместо шифрования передаваемых данных какими-либо библиотеками.
 

sofiamay


Рег
15 Jan, 2013

Тем
0

Постов
6

Баллов
6
  • 01, Jul 2015
  • #4
AlexSuv, post: 761970:
LockBox3 классная штука, К тому же опенсорс.
Совместим только сам с собой, т.е. несовместим с OpenSSL и прочими.
 

guzumba84


Рег
01 Jul, 2015

Тем
0

Постов
2

Баллов
2
  • 19, Jul 2015
  • #5
DEC 5.2 ещё есть
Есть в наличии nSoftware IPWorks Encrypt 9.0 Delphi Edition Full Source x86-x64 XE2-XE5:
nSoftware IPWorks Encrypt 9.0 Delphi Edition Full Source x86-x64 XE2-XE5
Предлагаю рассмотреть другие варианты.
Не такой уж он фулл сорс, там вся прелесть зашита в ipworksencrypt9.dll а сорс код это тупо песни и пляски вокруг этой dll
 

turboJ


Рег
16 Jul, 2015

Тем
0

Постов
4

Баллов
4
  • 30, Jul 2015
  • #6
Зависит от того, конкретно что нужно сделать. Для базовых вещей, я использовал Synapse: Synacrypt: Implemented are DES and 3DES encryption/decryption by ECB, CBC, CFB-8bit, CFB-block, OFB and CTR methods.
http://synapse.ararat.cz/doku.php
 

immodesty


Рег
31 Aug, 2011

Тем
0

Постов
2

Баллов
2
  • 07, Aug 2015
  • #7
Я думаю что идеального компонента просто не существует, чтобы везде работало.

Fundamentals Library, dcpcrypt2 пробовал, но в PHP к примеру расшифровать нельзя то что ими зашифровано.

Равно как и данные из PHP ими не обработать.

Спрашивал у знатоков - сказали что реализация алгоритмов шифрование должна быть идентична везде, от компонента делфи до скрипта/кода на PHP, Java, C# и прочее.

Тогда будет работать.
Очень кретично "перевод строки" он может идти как #10#13, так и #13. Некотырые либлы могут учитывать #10 как знак в хеше. У меня были проблемы с Indy & OpenSSL и https сервисами.
 

lfar


Рег
02 Feb, 2011

Тем
0

Постов
4

Баллов
4
  • 11, Aug 2015
  • #8
eflc, post: 761977:
А что такое "знак в хеше"?
Если правильно понял - перевод строки В windows #13#10 в unix помоему #13 Погуглишь короче
 

LeshaRB


Рег
11 Jun, 2007

Тем
5

Постов
110

Баллов
160
  • 12, Oct 2015
  • #9
Есть кроссплатформенная константа sLineBreak. P.S.: Если не ошибаюсь, LockBox 3 теперь поддерживает шифрование с помощью OpenSSL.
 

begemottio


Рег
20 Dec, 2010

Тем
0

Постов
6

Баллов
6
  • 09, Dec 2015
  • #10
Я тупо забил на это и для передачи данных решил использовать SSL TCP соединение, вместо шифрования передаваемых данных какими-либо библиотеками.
Сертификат SSL можно подменить. Шифрование все же надежнее
 

pprometey


Рег
23 Sep, 2010

Тем
0

Постов
16

Баллов
16
  • 07, Jul 2016
  • #12
в clever internet есть очень хорошый модуль криптографии но нужно его немножко напильником допиливать.
 

Pashaaaa


Рег
22 Feb, 2007

Тем
1

Постов
17

Баллов
27
  • 05, Sep 2016
  • #14
Я много лет пользуюсь библиотекой Win NTL

. На её основании писал коммерческие реализации алгоритмов.
 

Keoda


Рег
19 Nov, 2014

Тем
1

Постов
18

Баллов
28
  • 16, Sep 2016
  • #15
Книгу Б.Шнайера "Прикладная криптография" можно почитать. Взять его исходники, скомпилировать в либу кроссплатформенно и использовать ее на разных языках. Правда, обертки самому писать придется, но...
Скачать книгу можно, например, здесь: http://www.proklondike.com/books/crypto/crypto_brus_snaer_prikladnaya_cripto.html
 

Sapsan777


Рег
12 Jan, 2009

Тем
0

Постов
5

Баллов
5
  • 02, Oct 2016
  • #16
Keoda, post: 761986:
Я много лет пользуюсь библиотекой Win NTL

. На её основании писал коммерческие реализации алгоритмов.
Там много подводных камней но да она самая лучшая, в плане скорости и надежности.
 

Pashaaaa


Рег
22 Feb, 2007

Тем
1

Постов
17

Баллов
27
  • 14, Oct 2016
  • #17
Зачем использовать компоненты. Полно юнитов с криптографией, подключаете и пользуетесь. Причем анализируете что происходит, а не просто в слепую
 

Rabbano


Рег
22 Jun, 2009

Тем
0

Постов
14

Баллов
14
  • 22, Nov 2016
  • #19
arendaplus, post: 761993:
А ГОСТа под Pascal не будет?
Увы. Но C++ bUilder совместим с Delphi, и перевести будет не сложно, кода немного. Замена операторов следующим образом:
http://wiki.freepascal.org/Pascal_for_C_users

И еще в C++ допустимо сокращать код используя хитрое написание операторов a вместо a = a+ b; часто пишут a += b; аналогично и для других операторов Код
 

/*

* The GOST 28147-89 cipher

*

* This is based on the 25 Movember 1993 draft translation

* by Aleksandr Malchik, with Whitfield Diffie, of the Government

* Standard of the U.S.S.R. GOST 28149-89, "Cryptographic Transformation

* Algorithm", effective 1 July 1990. ([email protected])

*

* That is a draft, and may contain errors, which will be faithfully

* reflected here, along with possible exciting new bugs.

*

* Some details have been cleared up by the paper "Soviet Encryption

* Algorithm" by Josef Pieprzyk and Leonid Tombak of the University

* of Wollongong, New South Wales. (josef/[email protected])

*

* The standard is written by A. Zabotin (project leader), G.P. Glazkov,

* and V.B. Isaeva. It was accepted and introduced into use by the

* action of the State Standards Committee of the USSR on 2 June 89 as

* No. 1409. It was to be reviewed in 1993, but whether anyone wishes

* to take on this obligation from the USSR is questionable.

*

* This code is placed in the public domain.

*

* The standard does not specify the contents of the 8 4 bit->4 bit

* substitution boxes, saying they're a parameter of the network

* being set up.

*

* Obviously, a careful look at the cryptographic properties of the cipher

* must be undertaken before "production" substitution boxes are defined.

*

* The standard also does not specify a standard bit-string representation

* for the contents of these blocks.

*/

// Говорят, что эти блоки использует Центробанк РФ....

static unsigned char const k8[16] = {1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12 };

static unsigned char const k7[16] = {13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12 };

static unsigned char const k6[16] = {4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14 };

static unsigned char const k5[16] = {6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2 };

static unsigned char const k4[16] = {7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3 };

static unsigned char const k3[16] = {5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11 };

static unsigned char const k2[16] = {14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9 };

static unsigned char const k1[16] = {4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3};

/* Byte-at-a-time substitution boxes */

static unsigned char k87[256];

static unsigned char k65[256];

static unsigned char k43[256];

static unsigned char k21[256];

static bool bInited = false;

/*

* Build byte-at-a-time subtitution tables.

* This must be called once for global setup.

*/

void kboxinit(void)

{

int i;

for (i = 0; i < 256; i++) {

k87[i] = k8[i >> 4] << 4 | k7[i & 15];

k65[i] = k6[i >> 4] << 4 | k5[i & 15];

k43[i] = k4[i >> 4] << 4 | k3[i & 15];

k21[i] = k2[i >> 4] << 4 | k1[i & 15];

}

bInited = true;

}

/*

* Do the substitution and rotation that are the core of the operation,

* like the expansion, substitution and permutation of the DES.

* It would be possible to perform DES-like optimisations and store

* the table entries as 32-bit words, already rotated, but the

* efficiency gain is questionable.

*

* This should be inlined for maximum speed

*/

static word32 f(word32 x)

{

/* Do substitutions */

/* This is annoyingly slow */

/*

x = k8[x>>28 & 15] << 28 | k7[x>>24 & 15] << 24 |

k6[x>>20 & 15] << 20 | k5[x>>16 & 15] << 16 |

k4[x>>12 & 15] << 12 | k3[x>> 8 & 15] << 8 |

k2[x>> 4 & 15] << 4 | k1[x & 15];

*/

/* This is faster */

x = k87[x>>24 & 255] << 24 | k65[x>>16 & 255] << 16 |

k43[x>> 8 & 255] << 8 | k21[x & 255];

/* Rotate left 11 bits */

return x<<11 | x>>(32-11);

}

/*

* The GOST standard defines the input in terms of bits 1..64, with

* bit 1 being the lsb of in[0] and bit 64 being the msb of in[1].

*

* The keys are defined similarly, with bit 256 being the msb of key[7].

*/

void gostcrypt(word32 const in[2], word32 out[2], word32 const key[8])

{

register word32 n1, n2; /* As named in the GOST */

if(!bInited) kboxinit();

n1 = in[0];

n2 = in[1];

/* Instead of swapping halves, swap names each round */

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[7]);

n1 ^= f(n2+key[6]);

n2 ^= f(n1+key[5]);

n1 ^= f(n2+key[4]);

n2 ^= f(n1+key[3]);

n1 ^= f(n2+key[2]);

n2 ^= f(n1+key[1]);

n1 ^= f(n2+key[0]);

/* There is no swap after the last round */

out[0] = n2;

out[1] = n1;

}

/*

* The key schedule is somewhat different for decryption.

* (The key table is used once forward and three times backward.)

* You could define an expanded key, or just write the code twice,

* as done here.

*/

void gostdecrypt(word32 const in[2], word32 out[2], word32 const key[8])

{

register word32 n1, n2; /* As named in the GOST */

if(!bInited) kboxinit();

n1 = in[0];

n2 = in[1];

n2 ^= f(n1+key[0]);

n1 ^= f(n2+key[1]);

n2 ^= f(n1+key[2]);

n1 ^= f(n2+key[3]);

n2 ^= f(n1+key[4]);

n1 ^= f(n2+key[5]);

n2 ^= f(n1+key[6]);

n1 ^= f(n2+key[7]);

n2 ^= f(n1+key[7]);

n1 ^= f(n2+key[6]);

n2 ^= f(n1+key[5]);

n1 ^= f(n2+key[4]);

n2 ^= f(n1+key[3]);

n1 ^= f(n2+key[2]);

n2 ^= f(n1+key[1]);

n1 ^= f(n2+key[0]);

n2 ^= f(n1+key[7]);

n1 ^= f(n2+key[6]);

n2 ^= f(n1+key[5]);

n1 ^= f(n2+key[4]);

n2 ^= f(n1+key[3]);

n1 ^= f(n2+key[2]);

n2 ^= f(n1+key[1]);

n1 ^= f(n2+key[0]);

n2 ^= f(n1+key[7]);

n1 ^= f(n2+key[6]);

n2 ^= f(n1+key[5]);

n1 ^= f(n2+key[4]);

n2 ^= f(n1+key[3]);

n1 ^= f(n2+key[2]);

n2 ^= f(n1+key[1]);

n1 ^= f(n2+key[0]);

out[0] = n2;

out[1] = n1;

}

 

DJ VK


Рег
05 Aug, 2011

Тем
0

Постов
8

Баллов
8
  • 04, Dec 2016
  • #20
alexp25, post: 761969:
SecureBlackbox - в сети можно найти бесплатно 12.0.258 - от 15.08.2014: он много платформенный, при желании можно взять нужный *.pas и переделать для своих нужд как нативку.
Из бесплатных есть: Fundamentals Library, dcpcrypt2, а также от Synapse.
IPWorks ни когда не использовал и не хочу.
Тыкните носом на SecureBlackbox для XE08 - в Indy 10 совсем гибло с работой с хранилищем сертификатов Windows ...
 

nonamegsm


Рег
29 Jun, 2012

Тем
0

Постов
2

Баллов
2
  • 01, Jan 2017
  • #21
draior2, post: 761989:
Any idea how to sign XML with X509 signature. Any suggestion. I try Openssl but in not good documented and can't found right code.
What you meant under "sign XML" ? Sign file, sign array, or sign SOAP message? Different ways for different purposes...
 

dimonak90


Рег
14 Jul, 2009

Тем
0

Постов
4

Баллов
4
Тем
49554
Комментарии
57426
Опыт
552966

Интересно