Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей * в SDK нет примера? пример из SDK только как выяснилось он почему-то подписывает а не шифрует Отредактировано пользователем 28 декабря 2017 г. 13:41:05(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: po_saa Автор: Андрей * в SDK нет примера? пример из SDK только как выяснилось он почему-то подписывает а не шифрует Какой пример (название папки\файла) "подписывает, а не шифрует"? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей * Автор: po_saa Автор: Андрей * в SDK нет примера? пример из SDK только как выяснилось он почему-то подписывает а не шифрует Какой пример (название папки\файла) "подписывает, а не шифрует"? netsdk-x64-eng.msi -> C:\....\Крипто Про NET SDK\Examples\Simple\CMS\cs StreamSign.cs -> public void Encode(X509Certificate2 cert, FileStream inFile, FileStream outFile, bool detached)StreamVerify.cs StreamHelper.cs и нужно, чтобы процедура только шифровала, но не подписывала Отредактировано пользователем 28 декабря 2017 г. 14:41:23(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: po_saa Автор: Андрей * Автор: po_saa Автор: Андрей * в SDK нет примера? пример из SDK только как выяснилось он почему-то подписывает а не шифрует Какой пример (название папки\файла) "подписывает, а не шифрует"? netsdk-x64-eng.msi -> C:\....\Крипто Про NET SDK\Examples\Simple\CMS\cs StreamSign.cs -> public void Encode(X509Certificate2 cert, FileStream inFile, FileStream outFile, bool detached)StreamVerify.cs StreamHelper.cs и нужно, чтобы процедура только шифровала, но не подписывала fajjl zashifrovannyjj v potokovom rezhime.p7e.zip (24kb) загружен 6 раз(а). soourki_01.01.2017.zip.enc (299kb) загружен 3 раз(а).приложил два файла: soourki_01.01.2017.zip.enc - тот что получился из примера файл зашифрованный в потоковом режиме.p7e.zip - файл, который правильно воспринимается КриптоАРМ подскажите пожалуйста, что может быть в структуре не так и что надо изменить в примере, чтобы было одинаково?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
В указанном файле - пример для подписания. Для шифрования - необходимо "написать код".
вместо CMSWin32.CMSG_SIGNED - использовать ENVELOPED вместо SignedInfo использовать EnvelopedEncodeInfo (структура с информацией: алгоритм шифрования, сертификаты получателей..)
соответственно вызов будет с другими параметрами: CryptMsgOpenToEncode ( .. CMSG_ENVELOPED .. CMSG_ENVELOPED_ENCODE_INFO ) |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей * В указанном файле - пример для подписания. Для шифрования - необходимо "написать код".
вместо CMSWin32.CMSG_SIGNED - использовать ENVELOPED вместо SignedInfo использовать EnvelopedEncodeInfo (структура с информацией: алгоритм шифрования, сертификаты получателей..)
соответственно вызов будет с другими параметрами: CryptMsgOpenToEncode ( .. CMSG_ENVELOPED .. CMSG_ENVELOPED_ENCODE_INFO ) Спасибо за ответ. Нужен очень и срочно.структура ENVELOPED получилась у меня такая: Код: [StructLayout(LayoutKind.Sequential)]
public struct CMSG_ENVELOPED_ENCODE_INFO
{
public int cbSize;
public IntPtr hCryptProv;
public CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
public IntPtr pvEncryptionAuxInfo;
public int cRecipients;
public IntPtr rgpRecipients;
public IntPtr rgCmsRecipients;
public int cCertEncoded;
public IntPtr rgCertEncoded;
public int cCrlEncoded;
public IntPtr rgCrlEncoded;
public int cAttrCertEncoded;
public IntPtr rgAttrCertEncoded;
public int cUnprotectedAttr;
public IntPtr rgUnprotectedAttr;
}
CryptMsgOpenToEncode не принимает ссылку на структуру ENVELOPED - только SIGNED про ЭТО спросил глупость - надо было ещё переопределить вызов CryptMsgOpenToEncode - вот так: public static extern IntPtr CryptMsgOpenToEncode( int dwMsgEncodingType, int dwFlags, int dwMsgType, ref CMSG_ENVELOPED_ENCODE_INFO pvMsgEncodeInfo,
String pszInnerContentObjID, ref CMSG_STREAM_INFO pStreamInfo ); Код:
Int32 flags = 0;
flags = CMSWin32.CMSG_CONTENTS_OCTETS_FLAG;
hMsg = CMSWin32.CryptMsgOpenToEncode(
CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
ref StreamInfo);
насколько я понимаю, в структуре CMSWin32.CMSG_ENVELOPED_ENCODE_INFO нужен только параметр cRecipients,куда по идее надо поместить выбранные сертификаты с открытыми ключами (или/и) свой сертификат с закрытым ключом, чтобы те в свою очередь могли их расшифровать Зачем тогда там EnvelopedEncodeInfo.rgCertEncoded ? я заполнил массив CertBlobs по количеству сертификатов и указатель на него что делать с EnvelopedEncodeInfo.cRecipients ? (понятно, что здесь размер BLOBа)Код:
// заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
// заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
EnvelopedEncodeInfo = new CMSWin32.CMSG_ENVELOPED_ENCODE_INFO();
EnvelopedEncodeInfo.cbSize = Marshal.SizeOf(EnvelopedEncodeInfo);
//распределяем память под структуру
EnvelopedEncodeInfoPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(EnvelopedEncodeInfo));
Marshal.StructureToPtr(EnvelopedEncodeInfo, EnvelopedEncodeInfoPtr, false);
//сертификат(ы) с публичным ключом, на котором (на которых) шифруем
EnvelopedEncodeInfo.cCertEncoded = CertBlobs.Length;
CertBlobsPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(CertBlobs[0]) * CertBlobs.Length);
for (int i = 0; i < CertBlobs.Length; i++)
{
Marshal.StructureToPtr(CertBlobs[i], new IntPtr(
CertBlobsPtr.ToInt64() +
(Marshal.SizeOf(CertBlobs[i]) * i)), false);
}
//это сертификаты получателя?!
EnvelopedEncodeInfo.rgCertEncoded = CertBlobsPtr;
//а тогда это что?
EnvelopedEncodeInfo.cRecipients = ????????;
EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;
и ещё вопрос куда воткнуть Алгоритм?... наверное так?: EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;
ещё в CryptMsgOpenToEncode есть параметр flags: Код: hMsg = CMSWin32.CryptMsgOpenToEncode(
CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
ref StreamInfo);
определил его так:
flags = CMSWin32.CMSG_CONTENTS_OCTETS_FLAG;Отредактировано пользователем 10 января 2018 г. 21:38:49(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
>cRecipients
количество сертификатов
> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;
Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').
>flags = 0
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей * >cRecipients
количество сертификатов
> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;
Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').
>flags = 0
получилось так: Код:
public void Encode(X509Certificate2 cert, FileStream inFile,
FileStream outFile, bool detached = false)
{
CMSWin32.CMSG_STREAM_INFO StreamInfo;
CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
CMSWin32.CERT_CONTEXT[] CertContexts = null;
CMSWin32.BLOB[] CertBlobs;
X509Chain chain = null;
X509ChainElement[] chainElements = null;
X509Certificate2[] certs = null;
AsymmetricAlgorithm key = null;
ICspAsymmetricAlgorithm ikey = null;
GCHandle gchandle = new GCHandle();
IntPtr hProv = IntPtr.Zero;
IntPtr SignerInfoPtr = IntPtr.Zero;
IntPtr EnvelopedEncodeInfoPtr = IntPtr.Zero;
IntPtr CertBlobsPtr = IntPtr.Zero;
IntPtr hMsg = IntPtr.Zero;
IntPtr pbPtr = IntPtr.Zero;
Byte[] pbData;
long dwFileSize;
long dwRemaining;
int dwSize;
Boolean bResult = false;
try
{
// Размер файла.
dwFileSize = inFile.Length;
// Блок кодирования
pbData = new byte[BlockSize];
// поток закодированных данных
m_callbackFile = outFile;
if (cert != null) //если сертификат
{
// Строим цепочку сертификатов.
chain = new X509Chain(true);
chain.Build(cert);
chainElements = new X509ChainElement[
chain.ChainElements.Count];
chain.ChainElements.CopyTo(chainElements, 0);
// Сворачиваем цепочку в массив
certs = new X509Certificate2[chainElements.Length/* !! */]; //=====================================================
for (int i = 0; i < chainElements.Length /* !! */; i++)
{
certs[i] = chainElements[i].Certificate;
}
}
else
{
//пользоваться commonX509Certificale2Collection
certs = new X509Certificate2[commonX509Certificate2Collection.Count];
commonX509Certificate2Collection.CopyTo(certs, 0);
}
// Получаем Win32 контексты сертификатов
CertContexts = new CMSWin32.CERT_CONTEXT[certs.Length];
for (int i = 0; i < certs.Length; i++)
{
CertContexts[i] = (CMSWin32.CERT_CONTEXT)
Marshal.PtrToStructure(certs[i].Handle,
typeof(CMSWin32.CERT_CONTEXT));
}
// Получаем все сертификаты в виде BLOB
CertBlobs = new CMSWin32.BLOB[CertContexts.Length];
for (int i = 0; i < CertContexts.Length; i++)
{
CertBlobs[i].cbData = CertContexts[i].cbCertEncoded;
CertBlobs[i].pbData = CertContexts[i].pbCertEncoded;
}
// заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
EnvelopedEncodeInfo = new CMSWin32.CMSG_ENVELOPED_ENCODE_INFO();
EnvelopedEncodeInfo.cbSize = Marshal.SizeOf(EnvelopedEncodeInfo);
//распределяем память под структуру
EnvelopedEncodeInfoPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(EnvelopedEncodeInfo));
Marshal.StructureToPtr(EnvelopedEncodeInfo, EnvelopedEncodeInfoPtr, false);
//сертификат(ы) с публичным ключом, на котором (на которых) шифруем
EnvelopedEncodeInfo.cCertEncoded = CertBlobs.Length;
CertBlobsPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(CertBlobs[0]) * CertBlobs.Length);
for (int i = 0; i < CertBlobs.Length; i++)
{
Marshal.StructureToPtr(CertBlobs[i], new IntPtr(
CertBlobsPtr.ToInt64() +
(Marshal.SizeOf(CertBlobs[i]) * i)), false);
}
//это сертификаты получателя
EnvelopedEncodeInfo.rgCertEncoded = CertBlobsPtr;
//это количество сертификатов
EnvelopedEncodeInfo.cRecipients = CertBlobs.Length;
EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = "1.2.643.2.2.21";
// Заполняем структуру StreamInfo
StreamInfo = new CMSWin32.CMSG_STREAM_INFO();
if( dwFileSize > Int32.MaxValue )
StreamInfo.cbContent = -1; // Используем BER
else
StreamInfo.cbContent = (int)dwFileSize; // Используем DER
StreamInfo.pfnStreamOutput = new
CMSWin32.StreamOutputCallbackDelegate(StreamOutputCallback);
// Открываем сообщение для кодирования
Int32 flags = 0; //должен быть 0!
hMsg = CMSWin32.CryptMsgOpenToEncode(
CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
ref StreamInfo);
if (hMsg.Equals(IntPtr.Zero))
{
throw new CryptographicException(
"CryptMsgOpenToEncode error #" +
Marshal.GetLastWin32Error().ToString(),
new Win32Exception(Marshal.GetLastWin32Error()));
}
// Поблочная обработка сообщения
gchandle = GCHandle.Alloc(pbData, GCHandleType.Pinned);
pbPtr = gchandle.AddrOfPinnedObject();
dwRemaining = dwFileSize;
if (dwFileSize < BlockSize)
dwSize = (int)dwFileSize;
else
dwSize = BlockSize;
while (dwRemaining > 0)
{
inFile.Read(pbData, 0, dwSize);
// Вызываем обработку блока
bResult = CMSWin32.CryptMsgUpdate(
hMsg,
pbPtr,
dwSize,
(dwRemaining <= dwSize) ? true : false );
if (!bResult)
{
throw new CryptographicException(
"CryptMsgUpdate error #" +
Marshal.GetLastWin32Error().ToString(),
new Win32Exception(Marshal.GetLastWin32Error()));
}
// Переходим к следующему блоку
dwRemaining -= dwSize;
if (dwRemaining < dwSize)
{
dwSize = (int)dwRemaining;
}
if (progress != null)
progress(dwFileSize, dwRemaining);
}
}
finally
{
// Чистим
if (gchandle.IsAllocated)
{
gchandle.Free();
}
if (!CertBlobsPtr.Equals(IntPtr.Zero))
{
Marshal.FreeHGlobal(CertBlobsPtr);
}
if (!EnvelopedEncodeInfoPtr.Equals(IntPtr.Zero))
{
Marshal.FreeHGlobal(EnvelopedEncodeInfoPtr);
}
if (!hProv.Equals(IntPtr.Zero))
{
CMSWin32.CryptReleaseContext(hProv, 0);
}
if (!hMsg.Equals(IntPtr.Zero))
{
CMSWin32.CryptMsgClose(hMsg);
}
}
}
собирается попробую завтра сранья... ах, да! почистить забыл Код:
if (!EnvelopedEncodeInfoPtr.Equals(IntPtr.Zero))
{
Marshal.FreeHGlobal(EnvelopedEncodeInfoPtr);
}
Отредактировано пользователем 10 января 2018 г. 22:41:20(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.08.2015(UTC) Сообщений: 90 Откуда: Москва Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей * >cRecipients
количество сертификатов
> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;
Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').
>flags = 0
Код: hMsg = CMSWin32.CryptMsgOpenToEncode(
CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
ref StreamInfo);
выдаёт ошибку 1008 {System.ComponentModel.Win32Exception (0x80004005): Попытка ссылки на несуществующий токен} Ошибка -2147024809 нашел примерчик: https://www.cryptopro.ru....aspx?g=posts&t=6714тут заполняется-таки Recipient Отредактировано пользователем 11 января 2018 г. 9:49:01(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close