Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

5 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Афанасьев  
#11 Оставлено : 7 июня 2012 г. 16:04:04(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Пример на c++ я сделал такой (CSP в.я. 3.6.5359 KC1, в.п. 3.6.6497):
Код:

....
#include "WinCryptEx.h"
....
HCERTSTORE hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM_A,
      0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, "MY");

PCCERT_CONTEXT pSignerCert = NULL;

pSignerCert = CertFindCertificateInStore(hStoreHandle, 
        MY_TYPE, 0, CERT_FIND_SUBJECT_STR_A, "<cert>", NULL);

HCRYPTPROV hProv = NULL;
DWORD dwKeySpec = 0;
BOOL fCallerFreeProv = false;
HCRYPTHASH hHash = NULL;
BYTE * pbSignature = NULL;
DWORD dwSigLen = 0;

CryptAcquireCertificatePrivateKey(pSignerCert,
       CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProv, &dwKeySpec, &fCallerFreeProv);

CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash);

const char * cucText = "Hello, world!";
const unsigned int cuiLength = strlen(cucText);

const BYTE * pbMessage = (BYTE *)cucText;
const DWORD  cbMessage = cuiLength;

CryptHashData(hHash, pbMessage, cbMessage, 0);

CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen);

pbSignature = new BYTE[dwSigLen];

CryptSignHash(hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen);

// Прямая подпись.
std::ofstream off("C:\\sig.out", std::ios::out | std::ios::binary);
off.write((char *)pbSignature, dwSigLen);
off.close();

// Развернутая подпись.
std::ofstream off_rev("C:\\sig_reverse.out", std::ios::out | std::ios::binary);
std::reverse(pbSignature, pbSignature + dwSigLen);
off_rev.write((char *)pbSignature, dwSigLen);
off_rev.close();

delete pbSignature;
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG);



<cert> - CN имя сертификата, далее - имя файла с сертификатом.
Получаем 2 подписи в файлы. Данные "Hello, world!" (без кавычек) - задаются в строке и в файле in.dat (см. далее).

Проверяем в java:
1) программно - прямую подпись sig.out:

Код:

X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X.509")
 .generateCertificate(new FileInputStream("C:\\<cert>.cer"));

String text = "Hello, world!";
byte[] signature = Array.readFile("C:\\sig.out");

Signature sig = Signature.getInstance("CryptoProSignature");

sig.initVerify(certificate.getPublicKey());

sig.update(text.getBytes());
System.out.println("Verified: " + sig.verify(signature));


2) используя samples.jar - развернутую подпись sig_reverse.out:
Код:

"...\java.exe" -cp samples.jar ComLine.SignatureVerif -alias <alias> -keypass <pass> -filepath "C:\in.dat" -signpath "C:\sig_reverse.out"

alias - имя контейнера с сертификатом <cert>, <pass> - пароль для доступа к контейнеру.
Тут используем развернутую подпись, т.к. по умолчанию в примере samples.jar стоит алгоритм не CryptoProSignature, а GOST3411withGOST3410EL.

Отредактировано пользователем 7 июня 2012 г. 16:23:27(UTC)  | Причина: Не указана

Offline aburlutskiy  
#12 Оставлено : 7 июня 2012 г. 18:24:15(UTC)
aburlutskiy

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2012(UTC)
Сообщений: 3

Так же не можем отладиться для нормальной работы проверки в JCP подписи из CSP.
Ребят, отпишите в чем была суть проблемы если у вас получиться.
Offline aburlutskiy  
#13 Оставлено : 7 июня 2012 г. 18:30:07(UTC)
aburlutskiy

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2012(UTC)
Сообщений: 3

Кстати, не получилось добавить этот вендор в JVM под линуксом.
OS: CentOS 6
JVM: java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

Подскажите куда копать. При вызове MessageDigest.getInstance("GOST3411"); получаю NoSuchAlgorithmException
Offline aburlutskiy  
#14 Оставлено : 7 июня 2012 г. 18:39:20(UTC)
aburlutskiy

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2012(UTC)
Сообщений: 3

Ответ java ru.CryptoPro.JCP.tools.Check -all:
Код:

Jun 7, 2012 3:24:49 PM ru.CryptoPro.JCP.tools.z a
INFO: Loading JCP 1.0.52
Jun 7, 2012 3:24:49 PM ru.CryptoPro.JCP.tools.z a
INFO: JCP loaded.
Jun 7, 2012 3:24:49 PM ru.CryptoPro.JCP.tools.Check all
INFO: Supported charsets:
Big5
Big5-HKSCS
COMPOUND_TEXT
EUC-JP
EUC-KR
GB18030
GB2312
GBK
IBM-Thai
IBM00858
IBM01140
IBM01141
IBM01142
IBM01143
IBM01144
IBM01145
IBM01146
IBM01147
IBM01148
IBM01149
IBM037
IBM1026
IBM1047
IBM273
IBM277
IBM278
IBM280
IBM284
IBM285
IBM297
IBM420
IBM424
IBM437
IBM500
IBM775
IBM850
IBM852
IBM855
IBM857
IBM860
IBM861
IBM862
IBM863
IBM864
IBM865
IBM866
IBM868
IBM869
IBM870
IBM871
IBM918
ISO-2022-CN
ISO-2022-JP
ISO-2022-JP-2
ISO-2022-KR
ISO-8859-1
ISO-8859-13
ISO-8859-15
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
JIS_X0201
JIS_X0212-1990
KOI8-R
KOI8-U
Shift_JIS
TIS-620
US-ASCII
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF-8
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
windows-31j
x-Big5-HKSCS-2001
x-Big5-Solaris
x-euc-jp-linux
x-EUC-TW
x-eucJP-Open
x-IBM1006
x-IBM1025
x-IBM1046
x-IBM1097
x-IBM1098
x-IBM1112
x-IBM1122
x-IBM1123
x-IBM1124
x-IBM1381
x-IBM1383
x-IBM33722
x-IBM737
x-IBM833
x-IBM834
x-IBM856
x-IBM874
x-IBM875
x-IBM921
x-IBM922
x-IBM930
x-IBM933
x-IBM935
x-IBM937
x-IBM939
x-IBM942
x-IBM942C
x-IBM943
x-IBM943C
x-IBM948
x-IBM949
x-IBM949C
x-IBM950
x-IBM964
x-IBM970
x-ISCII91
x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB
x-iso-8859-11
x-JIS0208
x-JISAutoDetect
x-Johab
x-MacArabic
x-MacCentralEurope
x-MacCroatian
x-MacCyrillic
x-MacDingbat
x-MacGreek
x-MacHebrew
x-MacIceland
x-MacRoman
x-MacRomania
x-MacSymbol
x-MacThai
x-MacTurkish
x-MacUkraine
x-MS932_0213
x-MS950-HKSCS
x-MS950-HKSCS-XP
x-mswin-936
x-PCK
x-SJIS_0213
x-UTF-16LE-BOM
X-UTF-32BE-BOM
X-UTF-32LE-BOM
x-windows-50220
x-windows-50221
x-windows-874
x-windows-949
x-windows-950
x-windows-iso2022jp

Linux; unknown; 2.6.18-238.el5
2 proc.; amd64

Java(TM) SE Runtime Environment; 1.6.0_31-b04
1.6.0_31; Sun Microsystems Inc.; http://java.sun.com/
Java Virtual Machine Specification; 1.0; Sun Microsystems Inc.
Java HotSpot(TM) 64-Bit Server VM; 20.6-b01; mixed mode; Sun Microsystems Inc.
Java Platform API Specification; 1.6; Sun Microsystems Inc.
Java class format version number: 50.0
JIT: null

System Preferences - ok
User Preferences - ok


-SYSTEM PROPERTIES-
java.runtime.name                 Java(TM) SE Runtime Environment
sun.boot.library.path             /usr/local/lib/jdk1.6.0_31/jre/lib/amd64
java.vm.version                   20.6-b01
java.vm.vendor                    Sun Microsystems Inc.
java.vendor.url                   http://java.sun.com/
path.separator                    :
java.vm.name                      Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg                 sun.io
sun.java.launcher                 SUN_STANDARD
user.country                      US
sun.os.patch.level                unknown
java.vm.specification.name        Java Virtual Machine Specification
user.dir                          /root
java.runtime.version              1.6.0_31-b04
java.awt.graphicsenv              sun.awt.X11GraphicsEnvironment
java.endorsed.dirs                /usr/local/lib/jdk1.6.0_31/jre/lib/endorsed
os.arch                           amd64
java.io.tmpdir                    /tmp
line.separator                    

java.vm.specification.vendor      Sun Microsystems Inc.
os.name                           Linux
sun.jnu.encoding                  UTF-8
java.library.path                 /usr/local/lib/jdk1.6.0_31/jre/lib/amd64/server:/usr/local/lib/jdk1.6.0_31/jre/lib/amd64:/usr/local/lib/jdk1.6.0_31/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name           Java Platform API Specification
java.class.version                50.0
sun.management.compiler           HotSpot 64-Bit Tiered Compilers
os.version                        2.6.18-238.el5
user.home                         /root
user.timezone                     
java.awt.printerjob               sun.print.PSPrinterJob
file.encoding                     UTF-8
java.specification.version        1.6
java.class.path                   .
user.name                         root
java.vm.specification.version     1.0
sun.java.command                  ru.CryptoPro.JCP.tools.Check -all
java.home                         /usr/local/lib/jdk1.6.0_31/jre
sun.arch.data.model               64
user.language                     en
java.specification.vendor         Sun Microsystems Inc.
java.vm.info                      mixed mode
java.version                      1.6.0_31
java.ext.dirs                     /usr/local/lib/jdk1.6.0_31/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path               /usr/local/lib/jdk1.6.0_31/jre/lib/resources.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/rt.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/sunrsasign.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/jsse.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/jce.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/charsets.jar:/usr/local/lib/jdk1.6.0_31/jre/lib/modules/jdk.boot.jar:/usr/local/lib/jdk1.6.0_31/jre/classes
java.vendor                       Sun Microsystems Inc.
file.separator                    /
java.vendor.url.bug               http://java.sun.com/cgi-bin/bugreport.cgi
sun.io.unicode.encoding           UnicodeLittle
sun.cpu.endian                    little
sun.cpu.isalist                   


-PROVIDERS-
prov[0] = SUN version 1.6
prov[1] = SunRsaSign version 1.5
prov[2] = SunJSSE version 1.6
prov[3] = SunJCE version 1.6
prov[4] = SunJGSS version 1.0
prov[5] = SunSASL version 1.5
prov[6] = XMLDSig version 1.0
prov[7] = SunPCSC version 1.6
prov[8] = JCP version 1.0
prov[9] = Crypto version 1.0
prov[10] = RevCheck version 1.0

-JAR VERSIONS-
asn1rt.jar version: null
AsnLite.jar version: 1.0.2
forms_rt.jar version: null
JCP.jar version: 1.0.3099
JCP_ASN.jar version: 1.0.2
JCPinst.jar version: 1.0.2960
JCPRequest.jar version: 1.0.2959
JCPxml.jar version: 1.0.2958
JCryptoP.jar version: 1.0.3079

-JCP LICENSE-
company: 
type: server; sign and encrypt
end date: Until Sep 4, 2012

-TESTS-
JCP - ok
Crypto - ok
JTLS not installed
Get JCP System Preferences - ok
Get JCP User Preferences - ok
Jun 7, 2012 3:24:49 PM ru.CryptoPro.JCP.tools.Check i
INFO: Jar writing to /root/CryptoProJCPInfo.jar
Offline ah  
#15 Оставлено : 7 июня 2012 г. 18:47:51(UTC)
ah

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.05.2012(UTC)
Сообщений: 33

......


std::string CertName = "RegistratorCert";
std::wstring wCertName;
bool is_forSign = true;
std::string PIN = "12345678";



//---------------------------------------



//открытие хранилища сертификатов
HCERTSTORE hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
0,
CERT_SYSTEM_STORE_CURRENT_USER,
STORE_NAME);

if(!hCertStore)
{
printf("cert storerror");
return -1;
}

std::cout << "certificate store was opened successfully" << std::endl;

std::wstring Certificate(CertName.begin(), CertName.end() );

wCertName = Certificate;

//поиск нужного сертификата
pSignerCert = CertFindCertificateInStore(
hCertStore,
CERT_TYPE,
0,
CERT_FIND_SUBJECT_STR,
wCertName.c_str(),
NULL);

if(!pSignerCert)
{
printf ("signer cert error");
CertCloseStore(hCertStore, 0);
return -1;
}

std::cout << "needed certificate was found successfully" << std::endl;

if(is_forSign) //если нужен закрытый ключ
{
CRYPT_KEY_PROV_INFO *pKeyInfo = NULL;
DWORD dwKeyInfo;
//полчение длины информации о ключе
if(!CertGetCertificateContextProperty(pSignerCert,CERT_KEY_PROV_INFO_PROP_ID, NULL, &dwKeyInfo))
{
DWORD dError = GetLastError();
switch (dError)
{
case CRYPT_E_NOT_FOUND :
{
printf("The certificate does not have the specified property. Underlying error is: %d\n", dError);
break;
}
default:
{
printf("Unexpected error CertGetCertificateContextProperty. Underlying error is: %d\n", dError);
break;
}
}

CertCloseStore(hCertStore, 0);
CertFreeCertificateContext(pSignerCert);
return -1;
}

if(pKeyInfo)
free(pKeyInfo);
if(!(pKeyInfo = (CRYPT_KEY_PROV_INFO*)malloc(dwKeyInfo)))
{
printf("Error in allocation of memory.");
CertCloseStore(hCertStore, 0);
CertFreeCertificateContext(pSignerCert);
return -1;
}
//полчение информации о ключе
if(!CertGetCertificateContextProperty(pSignerCert,CERT_KEY_PROV_INFO_PROP_ID, pKeyInfo, &dwKeyInfo))
{
DWORD dError = GetLastError();
switch (dError)
{
case ERROR_MORE_DATA :
{
printf("The buffer is not large enough to hold the returned data about certificate. Underlying error is: %d\n", dError);
break;
}
default:
{
printf("Unexpected error CertGetCertificateContextProperty. Underlying error is: %d\n", dError);
break;
}
}
CertCloseStore(hCertStore, 0);
CertFreeCertificateContext(pSignerCert);
return -1;
}

//в CSP_WinCrypt.h фукция CryptAcquireContext получает имя контейнера в виде char*
#if defined(__WIN32__) || defined(_WIN32)
wchar_t* wcContainerName = pKeyInfo->pwszContainerName;
#else
char *wcContainerName = static_cast<char*>(malloc(wcslen(pKeyInfo->pwszContainerName) + 1));
ZeroMemory(wcContainerName, wcslen(pKeyInfo->pwszContainerName) + 1);
wcstombs(wcContainerName, pKeyInfo->pwszContainerName, wcslen(pKeyInfo->pwszContainerName));
#endif

//подключение к криптопровайдеру с нужным контейнером
if(!CryptAcquireContext(&hProv, wcContainerName, 0, pKeyInfo->dwProvType, /*CRYPT_SILENT*/0))
{
DWORD dError = GetLastError();
switch (dError)
{
case ERROR_INVALID_PARAMETER :
{
printf("While connect CSP one of the parameters contains a value that is not valid. Underlying error is: %d\n", dError);
break;
}
case NTE_KEYSET_NOT_DEF :
{
printf("The key container does not exist. Underlying error is: %d\n", dError);
break;
}
default:
{
printf("Unexpected error CryptAcquireContext. Underlying error is: %d\n", dError);
break;
}
}
CertCloseStore(hCertStore, 0);
CertFreeCertificateContext(pSignerCert);
return -1;
}

//ввод ПИН кода контейнера
if(!CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, reinterpret_cast<const BYTE*>(PIN.c_str()), 0))
{
DWORD dError = GetLastError();
switch (dError)
{
case ERROR_BUSY:
{
printf("The CSP context is currently being used by another process. Underlying error is: %d\n", dError);
break;
}
default:
{
printf("Unexpected error CryptAcquireContext. Underlying error is: %d\n", dError);
break;
}
}
CertCloseStore(hCertStore, 0);
CertFreeCertificateContext(pSignerCert);
return -1;
}



//CertCloseStore(hCertStore, 0);
//CertFreeCertificateContext(pSignerCert);
delete wcContainerName;


вот начало работы


собственно отличается у нас и параметр функции подписи...в CryptSignHash(.., AT_KEYEXCHANGE, ......) работает только с таким параметром(у вас стоит 0, но у меня не работает и с AT_SIGNATURE), иначе не получается подписать, размер возвращает равный 0... Я так понимаю это несущественно??!! В чем может заключаться ошибка, что может влиять негативно на процесс проверки подписи на стороне получателя???
Offline Евгений Афанасьев  
#16 Оставлено : 7 июня 2012 г. 19:14:56(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
aburlutskiy написал:
При вызове MessageDigest.getInstance("GOST3411"); получаю NoSuchAlgorithmException

Попробуйте указать провайдер - MessageDigest.getInstance("GOST3411", "JCP");
Offline Евгений Афанасьев  
#17 Оставлено : 7 июня 2012 г. 19:18:19(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
ah написал:
собственно отличается у нас и параметр функции подписи...в CryptSignHash(.., AT_KEYEXCHANGE, ......) работает только с таким параметром(у вас стоит 0, но у меня не работает и с AT_SIGNATURE)

У меня инициализируется нулем, но потом заполняется, в зависимости от типа ключа (AT_SIGNATURE или AT_KEYEXCHANGE).
Вы привели действия для проверки подписи?

Отредактировано пользователем 7 июня 2012 г. 19:22:06(UTC)  | Причина: Не указана

Offline ah  
#18 Оставлено : 8 июня 2012 г. 0:44:11(UTC)
ah

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.05.2012(UTC)
Сообщений: 33

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

Вот мне кажется мы что-то именно в совокупности неправильно делаем, то есть каждый по своему правильно, но несовместимо друг с другом..так может быть?)) просто интуиция так подсказывает, замучались уже просто(( что-то возможо свосем элементарное...может что-то есть такое, что может явиться причиной???

P.S> Большое спасибо за оказываемое внимание!!
Offline Евгений Афанасьев  
#19 Оставлено : 8 июня 2012 г. 1:23:25(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
вы пробовали для начала одной утилитой csptest получить подпись и проверить?
Вы ведь формируете подпись длиной 64 байта, не CMS?
Формирование с помощью CSP и проверка в JCP так же не согласуются, не работают?
Или все-таки нужно формировать в JCP и проверять с помощью CSP? Или и то, и другое?

Отредактировано пользователем 8 июня 2012 г. 1:24:51(UTC)  | Причина: Не указана

Offline ah  
#20 Оставлено : 8 июня 2012 г. 1:49:42(UTC)
ah

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.05.2012(UTC)
Сообщений: 33

подпись длино 64 байта, это точно!!

Пошагово :

я формирую хэш
снимаю хэш с фразы "Hello, World!"
подписываю хэш цифровой подписью..что то типа CryptSignHash(хэндл хэша, AT_KEY..., 0, 0, буфер, размер буфера)
сохраняю как у вас потокм ostream в файл..как прямую так и реверсивную..отсылаю 2 файла коллеге..он из командной строки запускает ту команду и чс теми опциями, что вы ему причслали..рез-т false..я ему предварительно скидываю файл установленного мною сертификата, он импортирует из него открытый ключ, и уж не знаю какая там в Java функция для проверки подписи, но точно используя этт импортированный ОК он пытается проверить подпись - рез-т тот же - FALSE//

Где на этих шагах может быть ошибка...т.е. он 2мя способами проверяет и результат 1 и тот же...


Я в командной строке всякими утилитами типа cptest и прочими не пользовался..вот, что делал я -
1) принимал у него файл сертификата -
2) импортировал ключ - как видно из кода(см.выше) - импорт успешен
3)принимал от него подпись, переводил из string в byte и проводил проверку функцией CryptVerifySignature(...)//рез-т False

Вот теперь я перечислил все, что мы на данный момент делали..хотя нет..коллега еще с принятой от меня подписью что только не делал - и инвертировал, и еще что - то)) ну не помогает..вот теперь все

Блин..ошибка сидит наверху, я просто уверен!!!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (5)
5 Страницы<1234>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.