@landwatersun

Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Верификация сертификата X.509


[+] Верификация сертификата X.509

Сообщений 11 страница 20 из 25

11

landwatersun написал(а):

rozh написал(а):

    ...
    А вот сертификат второго уровня можно проверить при наличии корневого сертификата, т.к. отпечаток корневого сертификата помещается в сертификат второго уровня.

Роман, полагаю, программный код, приведенный тобою, относился к проверке сертификата второго уровня? :)


Да. Там проверка сертификата второго уровня :-)

landwatersun написал(а):

Таким образом, проверить самодписанный сертификат можно так:
RSA_by_public_key(RSA_by_private_key(SHA1(TBS))) == SHA1(TBS).


Вопрос где взять приватный ключ, если на руках только сертификат?

12

Думаю, чтобы ответить исчерпывающе, сначала отвечу, что содержит самоподписанный сертификат? В нашем случае он содержит:
1. Информацию об издателе.
2. Открытый ключ.
3. Подпись.
При этом открытый ключ является парным закрытому ключу. Цифровая подпись получена на основе шифрования алгоритмом RSA (на закрытом ключе размера 1024 бит) значения хэш-функции (SHA1) от части сертификата (TBS).

Вопрос где взять приватный ключ, если на руках только сертификат?

Так как RSA это ассиметричный тип шифрования, чтобы раскрыть цифровую подпись (RSA_by_private_key(SHA1(TBS))) необходимо знать открытый ключ, который содержится в самом сертификате. А закрытый ключ разумеется разглашать нельзя. Подпись на самоподписанном сертификате подтверждает только то, что у издателя есть открытый и секретный ключи.

13

проверяет хэш для sha1 на основе открытых данных.

using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
using Org.BouncyCastle.Crypto.Parameters;

namespace generate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var KeyGenerate = new RsaKeyPairGenerator();
            KeyGenerate.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
            AsymmetricCipherKeyPair kp = KeyGenerate.GenerateKeyPair();
            var gen = new X509V3CertificateGenerator();
            var certName = new X509Name("CN=CA");
            var serialNo = new BigInteger("1", 10);
            gen.SetSerialNumber(serialNo);
            gen.SetSubjectDN(certName);
            gen.SetIssuerDN(certName);
            gen.SetNotAfter(DateTime.Now.AddYears(100));
            gen.SetNotBefore(DateTime.Now);
            gen.SetSignatureAlgorithm("SHA1WITHRSA");
            gen.SetPublicKey(kp.Public);
            var myCert = gen.Generate(kp.Private);
            byte[] result = DotNetUtilities.ToX509Certificate(myCert).Export(X509ContentType.Cert);
            FileStream fs = new FileStream(textBox1.Text + ".crt", FileMode.Create);
            fs.Write(result, 0, result.Length);           
            fs.Flush();
            fs.Close();
            MessageBox.Show("Сертификат создан!");
            byte[] signature;
            Sender mySender = new Sender();
            Receiver myReceiver = new Receiver();

            signature = mySender.HashAndSign(result);

            //Верификация
            if (myReceiver.VerifyHash(mySender.PublicParameters, result, signature))
            {
                //myReceiver.DecryptData(result);
                MessageBox.Show("Valid signature");
            }
            else
            {
                MessageBox.Show("Invalid signature");
            }
        } 
    }
    class Sender
    {
        RSAParameters rsaPubParams;
        RSAParameters rsaPrivateParams;

        public Sender()
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            rsaPrivateParams = rsaCSP.ExportParameters(true);
            rsaPubParams = rsaCSP.ExportParameters(false);
        }

        public RSAParameters PublicParameters
        {
            get
            {
                return rsaPubParams;
            }
        }

        public byte[] HashAndSign(byte[] encrypted)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
            SHA1Managed hash = new SHA1Managed();
            byte[] hashedData;

            rsaCSP.ImportParameters(rsaPrivateParams);

            hashedData = hash.ComputeHash(encrypted);
            return rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));
        }

        //Encrypts using only the public key data.
        public byte[] EncryptData(RSAParameters rsaParams, byte[] toEncrypt)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            rsaCSP.ImportParameters(rsaParams);
            return rsaCSP.Encrypt(toEncrypt, false);
        }
    }

    class Receiver
    {
        RSAParameters rsaPubParams;
        RSAParameters rsaPrivateParams;

        public Receiver()
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();

            rsaPrivateParams = rsaCSP.ExportParameters(true);
            rsaPubParams = rsaCSP.ExportParameters(false);
        }

        public RSAParameters PublicParameters
        {
            get
            {
                return rsaPubParams;
            }
        }

        public bool VerifyHash(RSAParameters rsaParams, byte[] signedData, byte[] signature)
        {
            RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
            SHA1Managed hash = new SHA1Managed();
            byte[] hashedData;

            rsaCSP.ImportParameters(rsaParams);
            hashedData = hash.ComputeHash(signedData);
            return rsaCSP.VerifyHash(hashedData, CryptoConfig.MapNameToOID("SHA1"), signature);
        }
       
    }
}

14

Уже горячо!

Недописанный кусок программы, который будет считывать сгенерированный сертификат и проверять его.

...
using bcrypto = Org.BouncyCastle.X509;
using Crypto = System.Security.Cryptography;
            ...
            Stream certFile = new FileStream(textBox1.Text, FileMode.Open);
            bcrypto.X509CertificateParser cert_parser = new bcrypto.X509CertificateParser();
            bcrypto.X509Certificate cert = cert_parser.ReadCertificate(certFile);           
            Crypto.SHA1Managed hash_sha1 = new Crypto.SHA1Managed();
            byte[] hash_bytes = hash_sha1.ComputeHash(cert.GetTbsCertificate());
            Crypto.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(1024);

            // Задать объекту rsa открытый ключ. :) ???

            if (rsa.VerifyHash(hash_bytes, cert.SigAlgOid, cert.GetSignature()))
                MessageBox.Show("Сертификат прошел верификацию.");               
            else
                MessageBox.Show("Сертификат не прошел верификацию.");
            certFile.Close();


Диляра, допиши кусок, где нужно провести инициализацию открытого ключа. :)

15

Crypto.X509Certificates.X509Certificate certCur = Crypto.X509Certificates.X509Certificate.CreateFromCertFile(textBox1.Text);
//получаем открытый ключ
byte[] keyBytes = certCur.GetPublicKey();
//создаем объект, который хранит ключи для rsa
RSAParameters keyParams = new RSAParameters();
//задаем открытый ключ (modulus - открытый key, D - закрытый key)
keyParams.Modulus = keyBytes;
//импортируем в rsa
rsa.ImportParameters(keyParams);

16

Шамсутдинова Диляра написал(а):

//задаем открытый ключ (modulus - открытый key, D - закрытый key)
keyParams.Modulus = keyBytes;

Откуда такая уверенность в данной строчке? Согласно алгоритму создания открытого ключа в RSA модуль не эквивалентен открытому ключу.

http://cs625830.vk.me/v625830045/17cc8/eXkUxKVWYZE.jpg
https://ru.wikipedia.org/wiki/RSA

17

Я RSA проинициализировал с помощью открытого ключа. Но вот эта функция постоянно вызывает исключение:
"  if (rsa.VerifyHash(hash_bytes, cert.SigAlgOid, cert.GetSignature())) "
Ругается на то, что ссылка не указывает на экземпляр объекта. Из-за чего может быть ошибка?

18

Kashapov Niyaz написал(а):

Я RSA проинициализировал с помощью открытого ключа.

А вот с этого места подробнее, пожалуйста. :)

19

Как и было сказано, с помощью xml строки с параметрами открытого ключа и экспоненты.

20

Kashapov Niyaz написал(а):

Как и было сказано, с помощью xml строки с параметрами открытого ключа и экспоненты.

Покажи код, будь добр. :)


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Верификация сертификата X.509