Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

openssl rsa –in enc.key -out dec.key в CriptoAPI Delphi   Найти похожие ветки 

 
sniknik ©   (2012-09-18 20:56) [0]

Что делает вот эта команда?
openssl rsa –in enc.key -out dec.key
Enter pass phrase for enc.key:      -> Enter passphrase and hit return
writing RSA key

В смысле, понимаю, что она раскодирует файл приватного ключа - enc.key сохраняя в dec.key без пароля... но нужно то же самое повторить на CriptoAPI и желательно на Delhi (автоматизировать процесс).

На PHP делается просто в одну функцию openssl_private_decrypt, на дельфи/api (нагуглил) вроде тоже - CryptDecrypt, но в предварительных действиях что-то запутался (да и пишут везде про сессионный ключ а не приватный)... получаемый файл прога "не жрет", ошибка типа "неправильный последовательность SHA1" (завтра могу точнее, если "вдруг").

В общем нужно повторить сабж на дельфи.
Статьи не приветствуются... много прочел (например http://www.rsdn.ru/article/crypto/usingcryptoapi.xml#E6NAC ), понял мало. Если только с конкретным примером, по конкретному действию. Мало толку от описаний если логика/что за чем следует не понятна...


 
Eraser ©   (2012-09-18 21:09) [1]


> sniknik ©   (18.09.12 20:56) 

в MS Crypto API вообще не принято взаимодействовать напрямую с закрытым ключом. Да и вообще все операции с открытым/закрытым ключами сводятся к импорту/экспорту сессионного ключа, далее работа уже идет с ним.


 
Медвежонок Пятачок ©   (2012-09-18 21:23) [2]

в криптоапи приват ключ в чистом виде не получить насколько я помню.
можно экспортировать в транспортный контейнер. но он тоже обязательно шифруется. и это причем не сам ключ а именно контейнер ключа.


 
sniknik ©   (2012-09-18 21:24) [3]

> далее работа уже идет с ним.
Мне не нужна "работа", мне нужна получить файл со "снятым паролем" (пароль естественно известен).
Также(? в принципе не важно)/в том же виде, что после "openssl rsa –in enc.key -out dec.key", он то как то делает...
Если не "MS Crypto API" то чем-то другим, в принципе тоже не важно, главное программно (вызовом openssl не пойдет... есть причины, не будем заострять на них внимание).


 
sniknik ©   (2012-09-18 21:30) [4]

> в криптоапи приват ключ в чистом виде не получить насколько я помню.
Может поэтому все мои "переводы" с С++ криво работают?

Хотя вот, пишут, можно (по PHP-шной функции сужу, там оно парами) -
http://pumka.net/2009/12/16/rsa-encryption-cplusplus-delphi-cryptoapi-php-openssl-2/
Decrypting
To decrypt data you need first to split it into chunks of ByteLength bytes, decrypt each chunk and then concatenate decrypted chunks.
C++/CryptioAPI:


 
Eraser ©   (2012-09-18 22:53) [5]


> sniknik ©   (18.09.12 21:24) [3]

я просто не в курсе, как оно там в openssl сделано и какую роль играет в данном случае пароль. Но судя по всему, шифрование файла ключа не имеет отношение непосредственно к RSA и обмену открытыми и секретным ключами. просто как доп. защита.

поясни какова задача и что находится в enc.key и должно находиться в dec.key. просто каким боком пароль имеет отношение к RSA, там обычно случайные ключи, пароли не фигурируют.


 
sniknik ©   (2012-09-18 23:25) [6]

> Но судя по всему, шифрование файла ключа не имеет отношение непосредственно к RSA и обмену открытыми и секретным ключами. просто как доп. защита.
Не согласен, по моему как раз паролем он и "шифруется", а после заворачивается в base64. Иначе зачем openssl  просит ввести пароль? И кстати работает это в отрыве от всего, от машины где его генерировали, от сертификата, там его просто нет, т.е. есть только файл приватного ключа, утилита и введенный пароль... Т.е. явно не дополнительная "навеска". Но да ладно, не суть.

> поясни какова задача и что находится в enc.key
Моя задача получить dec.key... дальнейшее не ко мне, но для информации, этот dec.key после вместе с сертификатом "скармливают"  одной проге и она работает, и пароля не просит (и не умеет).
А находится, для наглядности, пример "as is" -
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,178EDC55173B627D

uBUyfcEJukNIZOPCHNLVts0q/nRfvI3NTzfTEGZi1nWk9pT2sJwM1jwSQfXd6NaI
6dSlZ9ekNkVTvKmkVHFqhitL3mKhr90MmNes+jYC5FykZrbe0ssQ6ZAK1iCCpWtI
65zXpGtTj+iugdk/8vFSD6k+KXN6SXkJTTM6QR0O9C1C9ajuCpsJiSq+3+BerlMj
A7OoSRqp8GRw6EJ5cKmgQawaDnX9+6w37RwT61Vc2j0395jPL/2hflETa2P5kbMs
6GH9lCETkzYcCbfXEMMzkvJoxYEIVPbjMnMf4Upq8l/8mc7yLwxfSqF5eKQ5IBoZ
1Ne6957Zcqtc19nFmNGPCNdVPl3wZ0vMCYnz7BYUYwGmqKKFiZddUbPJJRA38hmz
9hpyM8RV46CyczVdCQ9qaxdPRDIYQrCYHnBuFlHfwpSgrO6627d7pXtsfIC/+bGw
aTymNaUD4otS5/abId883VR2mPSH4jOs294SV0nubRSqQLFcTNEtyslBu0kXBU+g
Nk5UUCScfqzk2/s5/uIxr7qc2qFJ/aJmwKcg6bSxiJA/jLHzlVRXLVVDsgbyK7er
JhlYHv8ltLZh6Xo3GS0YWhFkUxu3TJ5sz/+MQtdzIgU0SatEnbwKOBXoah0aYm0S
QJSG0tXs7IXO5ue+703nOr96uf1T9GHVvW+Tc/HntLf4Dbxs2G1yvG6cyCsIKX07
IHzXVCP0uyL76dhzGj964zaEFXHteRhCuUI1nEVR3trHp/sXEPQ57alX48ehbm/A
1JspiyaTsuS5jD0GXKR9PV041RkKDRmiqt3LgcbbhiLcDQeIpaqKWQ==
-----END RSA PRIVATE KEY-----


 
sniknik ©   (2012-09-18 23:27) [7]

+
> Proc-Type: 4,ENCRYPTED
> DEK-Info: DES-EDE3-CBC,178EDC55173B627D
Этого иногда не бывает, и это ни на что не влияет, т.е. важен только блок base64.


 
Eraser ©   (2012-09-18 23:47) [8]


> sniknik ©   (18.09.12 23:25) [6]


> Не согласен, по моему как раз паролем он и "шифруется",
> а после заворачивается в base64. Иначе зачем openssl  просит
> ввести пароль? И кстати работает это в отрыве от всего,
> от машины где его генерировали, от сертификата, там его
> просто нет, т.е. есть только файл приватного ключа, утилита
> и введенный пароль... Т.е. явно не дополнительная "навеска".
>  Но да ладно, не суть.

вот допустим зашли на любой сайт с https - там что, просят ввести пароль что-ли? шифрование ключа паролем это уже довес к RSA. тогда вопрос такой - откуда берется enc.key? какова процедура его получения?


 
Eraser ©   (2012-09-18 23:59) [9]

Т.е. задача напрямую к RSA отношения не имеет.
Нужно просто расшифровать ключ.
Для этого не обязательно использовать CryptoAPI даже, думаю хватит компонентов LockBox (компонент TLb3DES). Для работы с base64 лучше всего Indy.


 
sniknik ©   (2012-09-19 00:10) [10]

> какова процедура его получения?
Меня это не интересует. Опять таки, чисто для информации, приходит по почте... (и не надо про безопасность и т.д., и про https тоже не надо, это "отвлечения внимания" т.к. нет там https, и безопасности как таковой нет... сертификат используется для подписи и идентификации данных, идентификации клиента, внутри локальной сети, а получают его клиенты у себя, и посылают нам, вместе с паролем).

Вообще, можешь вон выше из [6] скопировать текстом, переименовать в enc.key, и считать, что тоже "получил"... а после выполнить утилиту (если нету/не знаешь где скачать могу выслать) с приведенными параметрами, получишь нужный мне результат, файл - dec.key. Ну, естественно если будешь знать супер секретный пароль, вот этот - 12345.


 
Eraser ©   (2012-09-19 00:18) [11]


> sniknik ©   (19.09.12 00:10) [10]

еще глянь в сторону http://msdn.microsoft.com/en-us/library/windows/desktop/aa382046(v=vs.85).aspx

по ключу позже отпишусь.


 
sniknik ©   (2012-09-19 00:31) [12]

> думаю хватит компонентов LockBox (компонент TLb3DES).
Скачал версию для D7 (LB 2.07 13-Sep-2012 SourceOnly.zip) вроде...
Не ставил, но код просмотрел, ключ используется
 TKey128 = array [0..15] of Byte;

 TLb3DES = class(TLbSymmetricCipher)
 protected {private}
   FKey : TKey128;
 public {methods}

16 байт... а бывают и больше. Т.е. вряд ли хватит.


 
Eraser ©   (2012-09-19 00:31) [13]


> sniknik ©   (19.09.12 00:10) [10]

скинь plz расшифрованный файлик, т.е. dec.key, чтобы было с чем сравнить.


 
Eraser ©   (2012-09-19 00:32) [14]


> sniknik ©   (19.09.12 00:31) [12]

пароль это другое, это не ключ.


 
sniknik ©   (2012-09-19 00:34) [15]

> еще глянь в сторону http://msdn.microsoft.com/en-us/library/windows/desktop/aa382046(v=vs.85).aspx
OоOо... такого я уже "вагон" просмотрел. И тут кстати даже не упоминается "волшебной" функции CryptDecrypt... на которую у меня самые большие надежды. :)


 
sniknik ©   (2012-09-19 00:38) [16]

> скинь plz расшифрованный файлик, т.е. dec.key, чтобы было с чем сравнить.
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCrvx7LHNqT7oZMPtz+BZi1p/1w1FCvAsyeYf26LkHphGpLqbiF
uf3URfGRs+yXa5Qfu99uu8yRycz9l7dQq/J1UO5cHdBUK/GEYDEkRdWV+vkLR+TJ
67VpPnmSCDO0loGLpwbPXi5jJ4qhI5f0Kixcjc813AXrogWNHEuwFyaG+wIDAQAB
AoGAYpZPIuDpR8nAJbxgNyEXTA+mmEIIHq5IrxIpB9rN0zJDojNGzNy7LEMKLE1Q
HouOd7jsxS/gej+RAHE6tYA+qM/LcEG8A6rV5z/EbHCtswBcONPRUkmbeqWYfuma
zzMfoYdh7nJaHN+bB6KeNqgw1xSfdOIja9HFK3qVxJoY2yECQQDjV6GWhKYHpm1l
igconG9MXpLnX9cxZlw8k9inpYMQdyFjRp9lz7YH8A9y2Yk91zbGclADWVKJ9A6l
4AFE8hXdAkEAwWVoC5SzZyk93U/0jKw80yMoppFfiBqY07YrCCJz9BHzUmYGE82n
277+ec1aP5nF5sjCO3qp/UAV3AXVM50etwJBAN6H6p3BHhui5rZbk4JHDhK9CCL/
B09NmL+bIJmJQ2+cjMv2VxR7avz+GMEc+l/UB8PcJUIB7u8mPChVyihIpukCQDpd
IhMsox+k4JijgofZitmlKKVsBcqLTEfIGCByVU/5AteBFqBvVhMJBr83a975xzGo
sIVGtXpKFs65q+fRqO0CQBm0KuLXRoXJB3CZMOFLTfMZfSs3SyIXHl2k/YPYMiIx
lBzMsOW2h8Ha+9SAJaZy7PmdlPK+Vc2FjrtpbdzS+Yk=
-----END RSA PRIVATE KEY-----

> пароль это другое, это не ключ.
Ну, типа я не в курсе... но к примеру прямо сегодня был пароль 18 символов, набирать устанешь. В "твой" компонент не влезет, не говоря про ключ 1024 байта вроде? Ну +-.


 
sniknik ©   (2012-09-19 00:43) [17]

> В "твой" компонент не влезет
В нем FKey : TKey128; это судя по всему пароль, не смотря на название
procedure TLb3DES.SetKey(const Key : TKey128);
begin
 FKey := Key;
end;

function TLb3DES.DecryptString(const InString : string) : string;
begin
 case CipherMode of
   cmECB : Result := TripleDESEncryptStringEx(InString, FKey, False);
   cmCBC : Result := TripleDESEncryptStringCBCEx(InString, FKey, False);
 end;
end;


 
Eraser ©   (2012-09-19 00:54) [18]


> sniknik ©   (19.09.12 00:43) [17]

не, пароль это вот
procedure TLb3DES.GenerateKey(const Passphrase : AnsiString);

вот алгоритм генерации ключа по паролю вызывает вопросы. такой ли он как в исходном примере...


 
Eraser ©   (2012-09-19 01:30) [19]

вот нарыл алгоритм формирования [0] на php

отсюда http://phpseclib.sourceforge.net/rsa/examples.html

кое что прояснилось, в частности алгоритм формирования пароля/ключа.

           default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1
               $components = array();
               foreach ($raw as $name => $value) {
                   $components[$name] = pack("Ca*a*", CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value);
               }

               $RSAPrivateKey = implode("", $components);

               if ($num_primes > 2) {
                   $OtherPrimeInfos = "";
                   for ($i = 3; $i <= $num_primes; $i++) {
                       // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
                       //
                       // OtherPrimeInfo ::= SEQUENCE {
                       //     prime             INTEGER,  -- ri
                       //     exponent          INTEGER,  -- di
                       //     coefficient       INTEGER   -- ti
                       // }
                       $OtherPrimeInfo = pack("Ca*a*", CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true));
                       $OtherPrimeInfo.= pack("Ca*a*", CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true));
                       $OtherPrimeInfo.= pack("Ca*a*", CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true));
                       $OtherPrimeInfos.= pack("Ca*a*", CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo);
                   }
                   $RSAPrivateKey.= pack("Ca*a*", CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos);
               }

               $RSAPrivateKey = pack("Ca*a*", CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);

               if (!empty($this->password)) {
                   $iv = $this->_random(8);
                   $symkey = pack("H*", md5($this->password . $iv)); // symkey is short for symmetric key
                   $symkey.= substr(pack("H*", md5($symkey . $this->password . $iv)), 0, 8);
                   if (!class_exists("Crypt_TripleDES")) {
                       require_once("Crypt/TripleDES.php");
                   }
                   $des = new Crypt_TripleDES();
                   $des->setKey($symkey);
                   $des->setIV($iv);
                   $iv = strtoupper(bin2hex($iv));
                   $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
                                    "Proc-Type: 4,ENCRYPTED\r\n" .
                                    "DEK-Info: DES-EDE3-CBC,$iv\r\n" .
                                    "\r\n" .
                                    chunk_split(base64_encode($des->encrypt($RSAPrivateKey))) .
                                    "-----END RSA PRIVATE KEY-----";
               } else {
                   $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
                                    chunk_split(base64_encode($RSAPrivateKey)) .
                                    "-----END RSA PRIVATE KEY-----";
               }

               return $RSAPrivateKey;
       }


 
sniknik ©   (2012-09-19 08:10) [20]

> "DEK-Info: DES-EDE3-CBC,$iv\r\n"
хм. Похоже эта часть тоже важна, раз участвует в шифрации, то по логике и для обратного действия должна использоваться, а там - sniknik ©   (18.09.12 23:27) [7] значит ошибался... Т.е. получается если нет заголовка то "обратная расшифровка" попросту ничего не делает. А в найденных примерах насколько помню ее "режут" (используется функция CryptStringToBinary с параметром CRYPT_STRING_BASE64HEADER).


 
Дмитрий С ©   (2012-09-19 12:23) [21]

А таскать с собой DDL-ку openssl-а не хочешь?


 
sniknik ©   (2012-09-19 14:36) [22]

Не особо, но как крайний вариант пойдет. Можешь сконвертировать на libeay32?


 
DVM ©   (2012-09-19 15:11) [23]


> sniknik ©

Посмотри вот тут:
http://pumka.net/2009/12/19/reading-writing-and-converting-rsa-keys-in-pem-der-publickeyblob-and-privatekeyblob-formats/

тут:
http://stackoverflow.com/questions/1231178/load-an-x509-pem-file-into-windows-cryptoapi

и вообще ищи по словосочетанию
pem file decrypt CryptAPI

Твой файл имеет формат PEM несмотря на неверное расширение


 
DVM ©   (2012-09-19 15:32) [24]


> Твой файл имеет формат PEM несмотря на неверное расширение

Хотя нет, у CryptoAPI есть отдельно key файлы, вот тут еще про них
http://en-us.sysadmins.lv/Lists/Posts/Post.aspx?List=332991f0-bfed-4143-9eea-f521167d287c&ID=46


 
sniknik ©   (2012-09-19 15:42) [25]

> и вообще ищи по словосочетанию
> pem file decrypt CryptAPI
Как только не искал... ссылок "выше головы", могу сам их распространять... к примеру
http://stackoverflow.com/questions/7573754/how-to-use-cryptoapi-and-cryptimportkey-with-a-asn-1-pem-openssl-public-key

Только вот перевод этого(как и другого) не работает.
И кстати функция CryptStringToBinaryA (если переводить по приведенной ссылке) в JwaWinCrypt неправильно описана (а wcrypt2 практически весь "кривой" :))


 
sniknik ©   (2012-09-19 15:57) [26]

> Посмотри вот тут:
> http://pumka.net/2009/12/19/reading-writing-and-converting-rsa-keys-in-pem-der-publickeyblob-and-privatekeyblob-formats/
Кстати вот это работает... НО!!! Тут работают с
-----BEGIN RSA PRIVATE KEY-----
MIIBOwI...

"чистым", не зашифрованным ключем, т.е. как раз тем - sniknik ©   (19.09.12 00:38) [16] который мне нужно получить (префикс как показатель, можно сравнить...)
Если же дать исходный файл, то - "System Error.  Code: -2146881269."#$D#$A"Встречено неверное значение тега ASN1". И т.д. примеры в основном такие, "для готового".


 
DVM ©   (2012-09-19 15:58) [27]


> sniknik ©   (19.09.12 15:42) [25]

Я так понял тебе надо найти реализацию алгоритма шифрования (точнее дешифрования) с названием DES-EDE3-CBC (именно так, а не, скажем  DES-CBC) и с его помощью расшифровать результат работы функции CryptStringToBinaryA.


 
DVM ©   (2012-09-19 16:01) [28]


> sniknik ©

OpenSSL поддерживает еще такие методы шифрования DES:

des
des-cbc
des-cfb
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-ofb
des-ofb
des3
desx

и теоретически там может быть любой из них. И не только DES.


 
DVM ©   (2012-09-19 16:23) [29]


> DES-EDE3-CBC

DES-EDE3 - это фактически 3DES, самый распространенный вариант его,
CBC - это его режим (про режимы тут http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

CryptoApi вроде бы умеет с этим типом шифрования работать.


 
sniknik ©   (2012-09-19 17:02) [30]

> с названием DES-EDE3-CBC (именно так, а не, скажем  DES-CBC) и с его помощью расшифровать результат работы функции CryptStringToBinaryA.
Только результат того как по идее эта функция должна возвращать...
А возвращает она по факту только первые 3 байта... почему то. это для файла с Proc-Type: 4,ENCRYPTED ... неважно какие параметры задавать - CRYPT_STRING_ANY(*CRYPT_STRING_BASE64HEADER*) и т.д. а вот если читать "чистый"(второй приведенный) то все ок.

Т.е. нужно самому выделить и перегнать в бинарные base64 часть. Дальше ее обработать используя введенный пароль + часть из DEK-Info: DES-EDE3-CBC,178EDC55173B627D, сняв таким образом пароль... завернуть получившееся опять в base64 и сохранить.

++
> А таскать с собой DDL-ку openssl-а не хочешь?
> Не особо, но как крайний вариант пойдет. Можешь сконвертировать на libeay32?
Уже не нужно, решил на компоненте SecureBlackbox... очень просто ;), даже не понятно почему в инете не нашел такого решения.
Но решение на CriptoApi не помешало бы...

Решение:  
function LoadBinaryFromCert(const FileName, Passw: string): string;
var
 Stream: TFileStream;
 sHeader, Buf1, Buf2: string;
 Size1, Size2: integer;
begin
 Stream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
 try
   Stream.Position:= 0;
   Size1:= Stream.Size;
   SetLength(Buf1, Size1);
   Stream.ReadBuffer(Buf1[1], Size1);

   Size2:= Size1;
   SetLength(Buf2, Size2);

   if SBPEM.Decode(@Buf1[1], Size1, @Buf2[1], Passw, Size2, sHeader) <> 0 then
     raise Exception.Create("Неверный файл. Не удается декодировать ""+FileName+ """);

   result:= Copy(Buf2, 1, Size2);
 finally
   Stream.Free;
 end;
end;

Результат функции завернуть в base64 (EncdDecd.EncodeString()) и сохранить "бутербродом" между
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
в файл... готово.

Кстати странность, 3 байт с начала последовательности отличается от того что делает openssl... но тем не менее работает!!!

p.s. Чем не понятнее, тем безопаснее! ...


 
Eraser ©   (2012-09-19 18:05) [31]


> DVM ©   (19.09.12 15:11) [23]
>
> > sniknik ©
>
> Посмотри вот тут:
> http://pumka.net/2009/12/19/reading-writing-and-converting-
> rsa-keys-in-pem-der-publickeyblob-and-privatekeyblob-formats/

эх, как бы пригодилось мне эта ссылка, когда нужно было подружить ключи MS Crypto API с Java )

> sniknik ©   (19.09.12 17:02) [30]

хм, никогда не слышал об этих компонентах, тоже спасибо за ссылку, когда нибудь пригодится., ибо ручной парсинг всяких этих PKCS дело уж очень муторное, особенно по причине отсутствия вменяемой документации и примеров, в RFC там черт ногу сломит.


 
Eraser ©   (2012-09-19 18:06) [32]


> sniknik ©   (19.09.12 17:02) [30]


> Но решение на CriptoApi не помешало бы...

ну если там исходник есть, то думаю не сложно заменить операцию шифрования 3Des"ом и хэширование на APIшные, только вот зачем.


 
sniknik ©   (2012-09-19 18:26) [33]

> ну если там исходник есть
Исходник есть... не установленный (с рутрекера), установлена ограниченная версия, только dcu. Перебивать установкой "левой" не хочу, но код смотрел/могу привести... завтра.

> только вот зачем.
Например "из спортивного интереса"... там с функциями хеша тоже какая то хрень...  как и с CryptStringToBinaryA, Оно вроде работает, даже возвращает что-то, но как то не так как ожидалось.
(например там структура для расшифровки 24 байта, а хеш возвращает размер 192... в MSDN написано, что структура считается в битах (т.е. 192 / 8 = 24), ок... но если дать буфер ровно 24 байта вылетает AV. если 192 байта, не бита, то заполняется вся... спрашивается почему? в общем дело ясное что дело темное, так до сих пор ничего и не понятно. ;(, все естественно по переведенным примерам из инета, и там оно вроде работает??? чтобы писать самому все таки знаний по теме не достаточно)


 
Eraser ©   (2012-09-19 18:35) [34]


> sniknik ©   (19.09.12 18:26) [33]


> Исходник есть... не установленный (с рутрекера), установлена
> ограниченная версия, только dcu. Перебивать установкой "левой"
> не хочу, но код смотрел/могу привести... завтра.

я бы сделал так - посмотрел как реализован разбор PKCS в этом исходнике и переписал, например, на бесплатных LockBox или даже лучше на http://www.cityinthesky.co.uk/opensource/DCPcrypt

вчера глянул по [19] - сходу не вышло, уж больно это мудреная запись

                  $symkey = pack("H*", md5($this->password . $iv)); // symkey is short for symmetric key
                  $symkey.= substr(pack("H*", md5($symkey . $this->password . $iv)), 0, 8);


особенно pack, а разбираться лезть - это уж нужен спортивный интерес )
исходник на делфи сильно упростит задачу.


>  MSDN написано

да, с CryptoAPI главная проблема - это их форматы хранения и представления ключей, хэшей и т.п. Все рассчитано на работу с условными BLOB"ами в их формате и дескрипторами.


 
sniknik ©   (2012-09-19 20:24) [35]

> исходник на делфи
Брал здесь
http://rutracker.org/forum/viewtopic.php?t=647901
SBPEM.Decode
это имя модуля. Не дружишь с торентами, могу кинуть на почту (если только исходники модулей не так много будет).  

> сильно упростит задачу.
Не думаю, то что там сделано, все по своему, со своими константами/параметрами, могло бы упростить если бы была цель написать также... а вот когда понимаешь, что вот тут нужен хеш мд5 в 8 байт 3 раза, а API-шная функция принимает(и по примерам) это за раз, и вроде как должно сконвертить, а вместо этого дает неопределенный результат... как то мало помогает.


 
Eraser ©   (2012-09-19 23:08) [36]


> sniknik ©   (19.09.12 20:24) [35]

ога, спасиб, с торрентами ой как дружу )



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.072 c
10-1183115528
vir
2007-06-29 15:12
2013.03.22
TWebBrowser и TThread


2-1335519491
leklerk
2012-04-27 13:38
2013.03.22
Как получить доступ к текущей записи в ADODataSet?


6-1260461403
bob
2009-12-10 19:10
2013.03.22
Сетевая обработка данных


3-1285141692
Сергей
2010-09-22 11:48
2013.03.22
Подсказка в DBGrid


2-1331452366
Alex_C
2012-03-11 11:52
2013.03.22
Работа с БД в отдельном треде.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский