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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Pokemon  
#1 Оставлено : 29 июля 2020 г. 0:03:22(UTC)
Pokemon

Статус: Участник

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

Hello,

To my project, I am generating signature for input data. If I give data in English, signature is generating correctly. Similarly if i give data in other language like russian, signature generated is not valid. I am using normal UTF-8 encoding for converting data into bytes. I tested this flow and it is working fine.

eg:
byte[] byteByte = "да".getBytes(); --[-48, -76, -48, -80]
String byteString = new String(byteByte); --да

And data is converted into Octet string in below line, Please help me how to use russian text and get valid signature.

cms.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID("1.2.*").value),
new Asn1OctetString(data,getBytes()));

Отредактировано пользователем 29 июля 2020 г. 0:04:01(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 29 июля 2020 г. 12:03:06(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Hello.
I have created a test key container "sign" and got a certificate in Test CryptoPro CA (https://cryptopro.ru/certsrv). So I have the test container with private key and the certificate chain ("sign" -> "CRYPTO-PRO Test Center 2"). Then I used the next code to sign your data:
Код:

    public static void main(String[] args) throws Exception {

        byte[] data = "да".getBytes(StandardCharsets.UTF_8);

        KeyStore keyStore = KeyStore.getInstance("HDImageStore"); // initiating key store
        keyStore.load(null, null);

        PrivateKey privateKey = (PrivateKey) keyStore.getKey("sign", null); // reading the private key
        X509Certificate cert  = (X509Certificate) keyStore.getCertificate("sign"); // reading the public certificate

        byte[] sig = CMSSign.createCMS( // using CMSSign example from samples-sources.jar to sign data (attached)
            data,
            new PrivateKey[] {privateKey},
            new Certificate[] {cert},
            "russian-text.cms", // saving the signature (CMS) to the file "russian-text.cms"
            false
        );

        // using CMSVerify example from samples-sources.jar to verify the signature
        CMSVerify.CMSVerify(sig, new Certificate[] {cert}, data);

    }

The signature has been verified.
Then I used CryptoPro CSP 5.0 for installing the "sign" to My (certmgr) to make it available for some tools and verified the signature "russian-text.cms" with help of CryptoPro CSP (I have 2 certificates with "sign" in their CNs so I selected #1 to specify "CN=sign"):
Код:

C:\Program Files\Crypto Pro\CSP>csptest -sfsign -verify -in russian-text.cms -my "sign"
#0:
Subject: C=RU, O=CryptoPro, CN=YYY
Valid  : 03.12.2013 03:33:17 - 03.12.2023 10:13:17 (UTC)
Issuer : DC=YYY, DC=YYY, CN=YYY
#1:
Subject: CN=sign
Valid  : 29.07.2020 08:23:35 - 29.10.2020 08:33:35 (UTC)
Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2

Enter certificate number:
1
#0:
Subject: C=RU, O=CryptoPro, CN=YYY
Valid  : 03.12.2013 03:33:17 - 03.12.2023 10:13:17 (UTC)
Issuer : DC=YYY, DC=YYY, CN=YYY
#1:
Subject: CN=sign
Valid  : 29.07.2020 08:23:35 - 29.10.2020 08:33:35 (UTC)
Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2

Enter certificate number:
1
Signature was verified OK
Total: SYS: 0,000 sec USR: 0,031 sec UTC: 5,661 sec
[ErrorCode: 0x00000000]

The signature has been verified.

Then I opened very useful link https://lapo.it/asn1js/ and decoded the signature "russian-text.cms" there. The signed data looked like:
Код:

SEQUENCE (2 elem)
        OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
        [0] (1 elem)
          OCTET STRING (4 byte) да


Then I used another CryptoPro software to verify the signature: https://dss.cryptopro.ru/Verify/Verify/ (Digital Signature Server). I opened "Проверить подпись" (verify signsture), passed "russian-text.cms" there, chose "Подпись в формате CMS" (CMS signature format), pressed "Проверить" (verify). The signature has been verified ("Результат проверки - Подпись действительна"). DSS has some features, it requires a siging certificate to be issued by some known CA like Test CryptoPro CA (for successful validation of certificate chain).

If you still have a problem with signing and verifying please create a ticket about the problem here: https://support.cryptopro.ru/

Отредактировано пользователем 29 июля 2020 г. 12:09:32(UTC)  | Причина: Не указана

Offline Pokemon  
#3 Оставлено : 29 июля 2020 г. 13:08:18(UTC)
Pokemon

Статус: Участник

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

Hello,

It is not working for me.

I will give detail information.

public byte[] sign(String message, PrivateKey[] keys, Certificate[] certs) throws Exception {

byte[] data = message.getBytes();

//create CMS
final ContentInfo all = new ContentInfo();
all.contentType = new Asn1ObjectIdentifier(
new OID(STR_CMS_OID_SIGNED).value);

final SignedData cms = new SignedData();
all.content = cms;
cms.version = new CMSVersion(1);

// digest
cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(
new OID(digestOid).value);
a.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = a;


cms.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID(STR_CMS_OID_DATA).value),
new Asn1OctetString(data));

// certificates
final int nCerts = certs.length;
cms.certificates = new CertificateSet(nCerts);
cms.certificates.elements = new CertificateChoices[nCerts];

for (int i = 0; i < cms.certificates.elements.length; i++) {

final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate certificate =
new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(certs[i].getEncoded());
certificate.decode(decodeBuffer);

cms.certificates.elements[i] = new CertificateChoices();
cms.certificates.elements[i].set_certificate(certificate);

} // for

// Signature.getInstance
final Signature signature = Signature.getInstance(signAlgorithm, "JCP");
byte[] sign;

// signer infos
final int nSign = keys.length;
cms.signerInfos = new SignerInfos(nSign);
for (int i = 0; i < cms.signerInfos.elements.length; i++) {

signature.initSign(keys[i]);
signature.update(data);
sign = signature.sign();

cms.signerInfos.elements[i] = new SignerInfo();
cms.signerInfos.elements[i].version = new CMSVersion(1);
cms.signerInfos.elements[i].sid = new SignerIdentifier();

final byte[] encodedName = ((X509Certificate) certs[i])
.getIssuerX500Principal().getEncoded();
final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);

final CertificateSerialNumber num = new CertificateSerialNumber(
((X509Certificate) certs[i]).getSerialNumber());
cms.signerInfos.elements[i].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
cms.signerInfos.elements[i].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID(digestOid).value);
cms.signerInfos.elements[i].digestAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[i].signatureAlgorithm =
new SignatureAlgorithmIdentifier(new OID(signOid).value);
cms.signerInfos.elements[i].signatureAlgorithm.parameters =
new Asn1Null();
cms.signerInfos.elements[i].signature = new SignatureValue(sign);
}
// encode
final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
all.encode(asnBuf, true);
return asnBuf.getMsgCopy();
}

sample data:
message =
ИНН ,Причина вывода,Дата из оборота,Тип первичного документа,Номер документа,Дата первичного ,Наименование первичного документа,Регистрационный ККТ,Версия
123,"Продажа, дистанционный",,,,,,,
Параметры товаров,,,,,,,
КИ,Цена за единицу,Дата из оборота,Номер документа,первичного документа,Наименование документа,
123,00.00,,,,,

Отредактировано пользователем 29 июля 2020 г. 13:28:40(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 29 июля 2020 г. 13:51:11(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Use getBytes(StandardCharsets.UTF_8) because getBytes() uses default charset.
Offline Pokemon  
#5 Оставлено : 29 июля 2020 г. 13:52:45(UTC)
Pokemon

Статус: Участник

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

Yes. I tried. But still it is not working :(
Offline Евгений Афанасьев  
#6 Оставлено : 29 июля 2020 г. 14:10:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
How do you verify signatures?
Offline Pokemon  
#7 Оставлено : 29 июля 2020 г. 15:34:45(UTC)
Pokemon

Статус: Участник

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

Hi,

I am validating by sending a request with this signature in the header. And crpt system throws signature invalid response.

If you have any other options to test signature, please help me with that.
Offline Евгений Афанасьев  
#8 Оставлено : 29 июля 2020 г. 17:20:11(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Could you attach the signature?
Offline Pokemon  
#9 Оставлено : 29 июля 2020 г. 17:45:07(UTC)
Pokemon

Статус: Участник

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

NAN

Отредактировано пользователем 30 июля 2020 г. 13:33:24(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#10 Оставлено : 29 июля 2020 г. 18:57:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
russiansign.txt has base64 format.
I converted it from base64 to binary and saved as russiansign.bin.
Attached signature has been successfuly verified:
1. Java:
Код:

byte[] sig = (new Decoder()).decodeBuffer(new FileInputStream("russiansign.txt")); // decode from base64 to binary
CMSVerify.CMSVerify(sig, null, null);

Output:
Код:

INFO: All signatures are valid: 
sign[0] - Valid signature on cert[2] (CN="ООО \"XXX XXX XX\"", SURNAME=XXX, GIVENNAME=XXX, C=RU, ST=50 Московская область, L=XXX, STREET=XXX, O="ООО \"XXX XXX XX\"", T=XXX, OID.1.2.643.100.1=#120D31303837373436353635313639, OID.1.2.643.100.3=XXX, OID.1.2.643.3.131.1.1=XXX, EMAILADDRESS=XXX, OID.1.2.840.113549.1.9.2=XXX)

I hid some subject's fields.
I modified CMSVerify.CMSVerify example a bit (a piece of code which prints content):
Код:

...
if (cms.encapContentInfo.eContent != null) {
        text = cms.encapContentInfo.eContent.value;
    } // if
    else if (data != null) {
        text = data;
    } // else
    else {
        throw new Exception("No content for verify");
    } // else

    if(CMStools.logger != null) {
        CMStools.logger.info("Source data: " + new String(text, StandardCharsets.UTF_8)); // <-- I added charset
    }
...

and got correct text.
Output:
Код:

INFO: Source data: ИНН участника оборота,Причина вывода из оборота,Дата вывода из оборота,Тип первичного документа,Номер первичного документа,Дата первичного документа,Наименование первичного документа,Регистрационный номер ККТ,Версия
...

2. CSP (csptest):
Output:
Код:

C:\Program Files\Crypto Pro\CSP>csptest -sfsign -verify -in russiansign.bin
e:\trunk\trunk_0\csp\samples\csptest\signtsf.c:696:No user cert specified. Cryptocontext will be opened automaticaly.
Error 0x0: Операция успешно завершена.
Signature was verified OK
Total: SYS: 0,016 sec USR: 0,000 sec UTC: 0,023 sec
[ErrorCode: 0x00000000]

3. DSS (https://dss.cryptopro.ru/Verify/Verify/):
Output:
Код:

Название документа // document
russiansign.bin
Подпись 1 // signature #1
Результат проверки // result
Подпись действительна // the signature is valid

Also DSS can extract signed data from signatures, I pressed "Снять и проверить" (extract signed data and verify), DSS verified the signature and sent me the signed data, I attached it, it is correct.
russiansign.txt (2kb) загружен 2 раз(а).

Отредактировано пользователем 29 июля 2020 г. 20:21:51(UTC)  | Причина: Не указана

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