Статус: Участник
Группы: Участники
Зарегистрирован: 24.05.2012(UTC) Сообщений: 15
|
Здравствуйте. Пытаемся реализовать проверку подписи, сформированной Browser plug-in, посредством Sharpei. Сама подпись отделенная, реализуется посредством примера из руководства: Код:function SignCreate(certSubjectName, dataToSign, g_bDetached) { //создание подписи
var oStore = CreateObject("CAPICOM.Store");
oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, //открываем хранилище сертификатов
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
var oCertificates = oStore.Certificates.Find( //ищем сертификат
CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
if (oCertificates.Count == 0) { //если сертификат не нашли
alert("Certificate not found");
return;
}
var oCertificate = oCertificates.Item(1); //нашли сертификат
var oSigner = CreateObject("CAdESCOM.CPSigner");
oSigner.Certificate = oCertificate;
oSigner.TSAAddress = "http://cryptopro.ru/tsp/";
var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
oSignedData.Content = dataToSign;
try {
var sSignedMessage = oSignedData.SignCades(oSigner, 1, g_bDetached); //создаем отделенную подпись
} catch (err) {
alert("Failed to create signature. Error: " + GetErrorMessage(err));
return;
}
oStore.Close();
return sSignedMessage;
}
Созаднную подпись и исходный файл и файл подписи подсовываем приложению на C#, в котором с помощью Sharpei реализована проверка подписи (согласно примера в Sharpei): Код://выбор сертификата отправителя
//Формуруем коллекцию отображаемых сертификатов
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection =
(X509Certificate2Collection)store.Certificates;
X509Certificate2Collection scollection = null;
X509Certificate2 found1 = null;
AsymmetricAlgorithm asym = null;
try
{
// Отображаем окно выбора сертификата
scollection =
X509Certificate2UI.SelectFromCollection(collection,
"Выбор секретного ключа по сертификату",
"Выберите сертификат, соответствующий Вашему секретному ключу",
X509SelectionFlag.SingleSelection);
// Выбран может быть только один сертификат
found1 = scollection[0];
}
catch
{
MessageBox.Show("Установите Ваш сертификат на компьютер и запустите программу заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
try
{
// Получаем секретный ключ соответствующий данному сертификату
asym = found1.PrivateKey;
}
catch
{
MessageBox.Show("Вставьте, пожалуйста, токен с сертификатом в USB-порт компьютера и запустите программу заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
ICspAsymmetricAlgorithm iasym = asym as ICspAsymmetricAlgorithm;
CspKeyContainerInfo info = iasym.CspKeyContainerInfo;
CspParameters par = new CspParameters(75, null, info.KeyContainerName);
Gost3410CryptoServiceProvider srcContainer = new Gost3410CryptoServiceProvider(par);
Gost3410Parameters srcPublicKeyParameters = new Gost3410Parameters();
try
{
srcPublicKeyParameters = srcContainer.ExportParameters(false);
}
catch
{
MessageBox.Show("Вы ввели неправильный pin-код", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
button1.Enabled = false;
button2.Enabled = true;
return;
}
GostSignatureFormatter GostFormatter = new GostSignatureFormatter(srcContainer);
//Значение хеш
FileStream fsh;
HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
using (fsh = new FileStream(MessageDirPath,
FileMode.Open, FileAccess.Read, FileShare.Read))
{
myhash.ComputeHash(fsh);
}
byte[] hashValue = myhash.Hash;
fsh.Dispose();
FileStream fileSt = new FileStream(HashPath, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.ReadWrite);
fileSt.Write(hashValue, 0, hashValue.Length);
fileSt.Dispose();
myhash.Clear();
//Подписываем хеш
byte[] SignedHashValue = GostFormatter.CreateSignature(hashValue);
FileStream fileStl = new FileStream(SignatureFilePath, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.ReadWrite);
fileStl.Write(SignedHashValue, 0, SignedHashValue.Length);
fileStl.Dispose();
myhash.Clear();
//File.Delete(MessageDirPath);
File.Delete(HashPath);
System.Diagnostics.Process.Start("explorer.exe", OutputDirPath);
Однако подпись, созданная в браузере, проверку не проходит. А если создать подпись не в браузере, а стандарными средствами Sharpei: Код://разбираем сертификат отправителя
X509Certificate2 cert = new X509Certificate2(Certificate);
//открытый ключ отправителя
AsymmetricAlgorithm pk1 = cert.PublicKey.Key;
//абсолютные пути к файлам с привязкой к текущей директории
SignatureFilePath1 = textBox2.Text;
WorkDirPath1 = Path.GetDirectoryName(SignatureFilePath1);
EncryptedMessagePath1 = textBox1.Text;
ZipDirPath1 = WorkDirPath1 + @"\message.zip";
UnzipDirPath = WorkDirPath1 + @"\message";
string Hash = WorkDirPath1 + @"\hash.txt";
FileStream cryptedData1 = null;
try
{
cryptedData1 = new FileStream(EncryptedMessagePath1, FileMode.Open);
}
catch
{
MessageBox.Show("Добавьте в папку с цифровой подписью исходный файл и запустите приложение заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
HashAlgorithm gostHashAlgorithm1 = HashAlgorithm.Create("GOST3411");
gostHashAlgorithm1.ComputeHash(cryptedData1);
byte[] hashValue1 = gostHashAlgorithm1.Hash;
cryptedData1.Close();
//работаем с файлом подписи
byte[] signeddata12 = null;
FileStream fshh12 = new FileStream(SignatureFilePath1, FileMode.Open);
//переписываем содержимое в выходной поток
int lengthl123 = (int)fshh12.Length;
signeddata12 = new byte[lengthl123];
fshh12.Read(signeddata12, 0, lengthl123);
fshh12.Close();
GostSignatureDeformatter deformater1 = new GostSignatureDeformatter(pk1);
bool isSignatureCorrect12 = true;
isSignatureCorrect12 = deformater1.VerifySignature(gostHashAlgorithm1, signeddata12);
if (isSignatureCorrect12)
{
MessageBox.Show("Подпись верна.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Подпись не верна. Расшифровка невозможна", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
результат проверки положителен. Как проверить Sharpei’ем подпись, созданную браузером?
|