Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.057 c
4-1259064819
Leonid Troyanovsky
2009-11-24 15:13
2013.03.22
Как заставить GUI thread создать нужное мне окно?


15-1336336205
Юрий
2012-05-07 00:30
2013.03.22
С днем рождения ! 7 мая 2012 понедельник


15-1345778325
Думкин
2012-08-24 07:18
2013.03.22
Теперь то Микрософт всех покорит


15-1350904692
Newersim
2012-10-22 15:18
2013.03.22
Помогите перевести пару строк на с++


15-1352061269
Rouse_
2012-11-05 00:34
2013.03.22
Винлокер