Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Как зашифровать данные заданным ключом 3DES через CryptoAPI

Автор: FractalizeR
Дата сообщения: 20.12.2004 14:09
Добрый день!

Начал недавно разбираться с Microsoft CryptoAPI. Читал, читал и никак не могу понять. Вот есть у меня поток данных, которые я хочу зашифровать, алгоритм 3DES, режим ECB, дан 24-байтовый ключ. Как мне зашифровать данные именно этим ключом? Мне не нужно генерировать ключ или видоизменять его. Мне нужно зашифровать данные именно этим ключом.

Дело в том, что я пишу библиотеку для реализации протокола обмена с CyberFlex смарткартами. там сенсовые ключи вычисляются как раз путем шифрования некоторых данных ключом по 3DES в ECB режиме.

Что-то я справку излазил, но кроме CryptImportKey я не вижу возможности использовать жестко заданный ключ. Да то, сам механизм вызова этой функции для получения нужного мне результата непонятен для меня.

Мне вообще-то можно шифровать и через любой Дельфи-компонент, но вот беда, DCPCrypt и DEC используют нестандартное шифрование. Видимо, не реализованы начальная и конечная перестановки. Поэтому, я не могу подписывать данные в CyberFlex. Нужна реализация 3DES точно соответсвующая стандарту....
Автор: Guderian
Дата сообщения: 20.12.2004 20:42
А в чем проблема с CryptImportKey? Сгенерировал пару публичный/приватный ключ, публичный через CryptoExportPublicKey сохранил. Его через CryptoImportPublicKey импортируешь, шифруешь, приватным расшифровываешь.
Автор: MoKC0DeR
Дата сообщения: 20.12.2004 21:35
Guderian
Ты хоть вопрос прочитал ?
Цитата:
Сгенерировал пару публичный/приватный ключ

Это для 3DES ?!!! Для симметричного криптоалгоритма ?!
Автор: FractalizeR
Дата сообщения: 21.12.2004 00:09
Вот именно!

Так все таки, кто-нибудь знает ответ на мой вопрос?
Автор: MoKC0DeR
Дата сообщения: 21.12.2004 09:51
FractalizeR
ИМХО придется тебе внимательно читать про CryptImportKey. Главное правильно заполнить все поля для BLOB. Примера к сожелению дать не могу - читай MSDN.
И вот еще http://www.rsdn.ru/article/crypto/cryptoapi.xml. См. "Симметричные шифры DES и 3DES" и пример encfile.
P.S. гугл как всегда рулит! Кажется вот что тебе надо -http://support.microsoft.com/kb/q228786/
Автор: FractalizeR
Дата сообщения: 21.12.2004 11:23
Спасибо за советы. Но к сожалению, в документации по CryptImportKey - нет ответа на мой вопрос.... Во всяком случае прямого. BLOB-контейнеры там предназначены для хранения public/private ключей для асимметричного шифрования....

Тот пример о котором вы говорите, на rsdn, не содержит примеров шифрования заданным ключом, я его разумеется, уже излазил.... Там опять же генерация ключа из пароля.

Гугл конечно рулит, я им рулю уже третий день и ничего не могу найти. А так статья на Майкрософте опять же про экспорт публичных ключей для асимметричного шифрования....

Есть еще предложения?
Автор: redp
Дата сообщения: 21.12.2004 11:36
хм, а самому реализовать 3des нельзя ?
или готовые реализации взять, например тут:
http://www.crypteon.co.uk/des-source-code-toolkit/
Автор: FractalizeR
Дата сообщения: 21.12.2004 11:46
Конечно можно )) Просто возиться не охота. Я сейчас дальше проект пишу, к DES потом вернусь. Просто подумал, чего изобретать велосипед, если кто-то уже все написал? Готовых алгоритмов в том числе и на Дельфи полно. Но вот беда, большая часть из них не полностью реализует стандарт.... Придется разбираться в коде и дописывать его самому.
Автор: Guderian
Дата сообщения: 21.12.2004 17:15
Тьфу, прошу пардону. Просто давеча ломал в соседнем форуме sourcegear vault с rsa и как клин вбило Попробую исправиться. Упомянутый хак от мелкомягких, не смотря на наличие там пары публичный/приватный (используемых лишь для шифровки искомого ключа сессии) имхо как раз и должен помочь. С небольшой добавкой для ECB в виде:

Код:
dwMode = CRYPT_MODE_ECB;
CryptSetKeyParam(hSessionKey,KP_MODE,(PBYTE)&dwMode,0));
Автор: FractalizeR
Дата сообщения: 03.02.2005 12:05
В общем, обошелся я использованием Дельфи-компонента DCPCrypt2.
Автор: HANDLE
Дата сообщения: 14.08.2006 13:47
А в чем, собственно говоря, трудности? Импортируй ключ, и вперед.

{
// ...
HCRYPTPROV hProv; // инициализировать
BYTE pData[0x24]; // инициализировать
DWORD dwDataLen = 0x24; // размер pData

CryptImportKey(hProv, pData, dwDataLen, 0, CRYPT_EXPORTABLE, &hKey);

// ...
}

pData представляют из себя
{
BLOBHEADER hdr;
DWORD cbKeySize;
BYTE rgbKeyData [];
};

typedef struct _PUBLICKEYSTRUC {
BYTE bType;
BYTE bVersion;
WORD reserved;
ALG_ID aiKeyAlg;
} BLOBHEADER, PUBLICKEYSTRUC;

Для определения параметров заголовка можно сначала сгенерировать ключ нужного типа, экспортировать его, и посмотреть параметры

{
// получение размера cbKeyBlob
DWORD cbKeyBlob = 0;
CryptExportKey(hKey, 0, PLAINTEXTKEYBLOB, 0, 0, &cbKeyBlob);

// выделение памяти
PBYTE pKeyBlob = (PBYTE)LocalAlloc(LPTR, cbKeyBlob);

// экспорт
CryptExportKey(hKey, 0, PLAINTEXTKEYBLOB, 0, pKeyBlob, &cbKeyBlob);

// удаление
CryptDestroyKey(hKey);
LocalFree(pKeyBlob);
}
Автор: Pinocchio
Дата сообщения: 24.08.2006 11:28
Тут нужно выбирать - либо стандарт, либо симметричный алгоритм.

Страницы: 1

Предыдущая тема: Нужен кряк к Рарус конфигурации Альфа-Авто:Запчасти+Сервис р


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.