public final class EnvelopedSignature
extends java.lang.Object
| Constructor and Description |
|---|
EnvelopedSignature()
Конструктор.
|
EnvelopedSignature(EncryptionKeyAlgorithm encryptionKeyAlgorithm)
Конструктор.
|
EnvelopedSignature(java.io.InputStream encryptedData)
Конструктор.
|
| Modifier and Type | Method and Description |
|---|---|
void |
addKeyAgreeRecipient(java.security.cert.X509Certificate recipientCertificate)
Добавление информации о получателе сообщения в виде структуры key_agreement.
|
void |
addKeyTransRecipient(java.security.cert.X509Certificate recipientCertificate)
Добавление информации о получателе сообщения в виде структуры key_transport.
|
void |
close()
Завершение процедуры шифрования.
|
java.io.InputStream |
decrypt(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
Расшифрование данных с помощью заданного получателя.
|
void |
decrypt(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
Расшифрование данных с помощью заданного получателя.
|
java.io.InputStream |
decrypt(java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
Расшифрование данных с помощью заданного получателя.
|
void |
decrypt(java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
Расшифрование данных с помощью заданного получателя.
|
static java.io.InputStream |
decryptOne(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
Расшифрование данных с помощью заданного получателя.
|
static void |
decryptOne(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
Расшифрование данных с помощью заданного получателя.
|
java.util.Collection |
getRecipients()
Получение списка получателей из зашифрованного
сообщения.
|
void |
open(java.io.OutputStream envelopedOutStream)
Открытие потока для шифрования сообщения.
|
void |
update(byte[] buffer)
Зашифрование блока данных.
|
void |
update(byte[] buffer,
int offset,
int length)
Зашифрование блока данных.
|
public EnvelopedSignature(EncryptionKeyAlgorithm encryptionKeyAlgorithm)
1. Пример формирования подписи формата Enveloped CMS с сохранением в буфер
// Буфер для сохранения подписи Enveloped CMS
ByteArrayOutputStream envelopedByteArrayOutStream = new ByteArrayOutputStream();
// Создание объекта Enveloped CMS с ключом шифрования на алгоритме МАГМА
EnvelopedSignature signature = new EnvelopedSignature(
EncryptionKeyAlgorithm.ekaMagma);
// Добавление получателя (сертификат). При расшифровании получатель
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate);
// или
signature.addKeyAgreeRecipient(recipientCertificate);
// Инициализация Enveloped CMS буфером для сохранения подписи
signature.open(envelopedByteArrayOutStream);
// Подготовленные данные для зашифрования - строка или CMS,
// полученная с помощью CMSSign (samples.jar) или CAdES API
byte[] data = ...
// Зашифрование данных data
signature.update(data, 0, data.length);
// Формирование подписи Enveloped CMS
signature.close();
// Получение подписи в формате Enveloped CMS в буфер
byte[] envelopedByteData = envelopedByteArrayOutStream.toByteArray();
2. Пример формирования подписи формата Enveloped CMS с чтением и записью в поток
// Открытие файлового потока для чтения данных для подписи - текстового
// документа или CMS, полученной с помощью CMSSign (samples.jar) или CAdES API
InputStream dataFile = new FileInputStream("data_file");
// Открытие файлового потока для сохранения подписи Enveloped CMS
OutputStream envelopedFileOutStream = new FileOutputStream("signature_file");
// Создание объекта Enveloped CMS
EnvelopedSignature signatureStream = new EnvelopedSignature();
// Добавление получателя (сертификат). При расшифровании получатель
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate);
// или
signature.addKeyAgreeRecipient(recipientCertificate);
// Инициализация Enveloped CMS потоком для сохранения подписи
signatureStream.open(envelopedFileOutStream);
// Чтение данных из файла для зашифрования
final int bufferSize = 1024*1024; // размер буфера
byte[] buffer = new byte[bufferSize];
int read = dataFile.read(buffer);
// Зашифрование данных data
while (read > 0) {
signatureStream.update(buffer, 0, read);
Array.clear(buffer);
read = dataFile.read(buffer, 0, bufferSize);
} // while
// Формирование подписи Enveloped CMS. Подпись Enveloped CMS
// сформирована и записана в "signature_file"
signatureStream.close();
dataFile.close();
envelopedFileOutStream.close();
encryptionKeyAlgorithm - Алгоритм ключа шифрования.
По умолчанию используется ГОСТ 28147.public EnvelopedSignature()
1. Пример формирования подписи формата Enveloped CMS с сохранением в буфер
// Буфер для сохранения подписи Enveloped CMS
ByteArrayOutputStream envelopedByteArrayOutStream = new ByteArrayOutputStream();
// Создание объекта Enveloped CMS
EnvelopedSignature signature = new EnvelopedSignature();
// Добавление получателя (сертификат). При расшифровании получатель
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate);
// или
signature.addKeyAgreeRecipient(recipientCertificate);
// Инициализация Enveloped CMS буфером для сохранения подписи
signature.open(envelopedByteArrayOutStream);
// Подготовленные данные для зашифрования - строка или CMS,
// полученная с помощью CMSSign (samples.jar) или CAdES API
byte[] data = ...
// Зашифрование данных data
signature.update(data, 0, data.length);
// Формирование подписи Enveloped CMS
signature.close();
// Получение подписи в формате Enveloped CMS в буфер
byte[] envelopedByteData = envelopedByteArrayOutStream.toByteArray();
2. Пример формирования подписи формата Enveloped CMS с чтением и записью в поток
// Открытие файлового потока для чтения данных для подписи - текстового
// документа или CMS, полученной с помощью CMSSign (samples.jar) или CAdES API
InputStream dataFile = new FileInputStream("data_file");
// Открытие файлового потока для сохранения подписи Enveloped CMS
OutputStream envelopedFileOutStream = new FileOutputStream("signature_file");
// Создание объекта Enveloped CMS
EnvelopedSignature signatureStream = new EnvelopedSignature();
// Добавление получателя (сертификат). При расшифровании получатель
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate);
// или
signature.addKeyAgreeRecipient(recipientCertificate);
// Инициализация Enveloped CMS потоком для сохранения подписи
signatureStream.open(envelopedFileOutStream);
// Чтение данных из файла для зашифрования
final int bufferSize = 1024*1024; // размер буфера
byte[] buffer = new byte[bufferSize];
int read = dataFile.read(buffer);
// Зашифрование данных data
while (read > 0) {
signatureStream.update(buffer, 0, read);
Array.clear(buffer);
read = dataFile.read(buffer, 0, bufferSize);
} // while
// Формирование подписи Enveloped CMS. Подпись Enveloped CMS
// сформирована и записана в "signature_file"
signatureStream.close();
dataFile.close();
envelopedFileOutStream.close();
public EnvelopedSignature(java.io.InputStream encryptedData)
throws EnvelopedException
1. Пример расшифрования подписи формата Enveloped CMS с чтением из буфера
// Буфер для сохранения расшифрованных данных
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
// Прочитанное в буфер сообщение формата Enveloped CMS
byte[] envelopedByteData = ...
// Создание объекта Enveloped CMS с передачей ему буфера подписи для расшифрования
signature = new EnvelopedSignature(new ByteArrayInputStream(envelopedByteData));
// Расшифрование подписи на закрытом ключе получателя с записью
// расшифрованных данных в буфер decryptedByteDataStream
signature.decrypt(recipientCertificate, recipientPrivateKey, decryptedByteDataStream);
// Получение расшифрованных данных - строки или CMS, которую можно
// далее проверить с помощью CMSVerify (samples.jar) или CAdES.jar
byte[] decryptedByteData = decryptedByteDataStream.toByteArray();
2. Пример рсшифрования подписи формата Enveloped CMS с чтением и записью в поток
// Открытие файлового потока для чтения подписи Enveloped CMS
InputStream encryptedDataFile = new FileInputStream("signature_file");
// Открытие файлового потока для сохранения расшифрованных данных
FileOutputStream outDataFile = new FileOutputStream("decrypted_data_file");
// Создание объекта Enveloped CMS с передачей ему потока подписи для расшифрования
signatureStream = new EnvelopedSignature(encryptedDataFile);
// Расшифрование подписи на закрытом ключе получателя с записью
// расшифрованных данных в поток decryptedDataStream
InputStream decryptedDataStream = signatureStream.decrypt(recipientCertificate, recipientPrivateKey);
// Чтение из потока расшифрованных данных decryptedDataStream и запись в файл
final int bufferSize = 1024*1024; // размер буфера
byte[] buffer = new byte[bufferSize];
int read = decryptedDataStream.read(buffer);
// Запись расшифрованных данных в файл
while (read > 0) {
outDataFile.write(buffer, 0, read);
Array.clear(buffer);
read = decryptedDataStream.read(buffer, 0, bufferSize);
} // while
// Завершение расшифрования. Расшифрованные данные записаны в файл "decrypted_data_file"
decryptedDataStream.close();
encryptedDataFile.close();
outDataFile.close();
encryptedData - Зашифрованное сообщение формата Enveloped CMS.EnvelopedExceptionpublic void addKeyTransRecipient(java.security.cert.X509Certificate recipientCertificate)
throws EnvelopedException
recipientCertificate - Сертификат получателя.EnvelopedExceptionpublic void addKeyAgreeRecipient(java.security.cert.X509Certificate recipientCertificate)
throws EnvelopedException
recipientCertificate - Сертификат получателя.EnvelopedExceptionpublic void open(java.io.OutputStream envelopedOutStream)
throws EnvelopedException
update(byte[], int, int)
или update(byte[]) и close(). Должна быть
в итоге завершена с помощью close().envelopedOutStream - Поток зашифрованных данных. Может
быть байтовым или файловым потоком.EnvelopedExceptionpublic void update(byte[] buffer,
int offset,
int length)
throws java.lang.Exception
open(java.io.OutputStream).buffer - Блок данных.offset - Смещение в буфере.length - Длина данных.java.lang.Exceptionpublic void update(byte[] buffer)
throws java.lang.Exception
open(java.io.OutputStream).buffer - Блок данных.java.lang.Exceptionpublic void close()
throws EnvelopedException
open(java.io.OutputStream),
которую следует вызвать первой.
Необходим по крайней мере одни вызов update(byte[], int, int)
или update(byte[]).EnvelopedExceptionpublic java.util.Collection getRecipients()
throws EnvelopedException
EnvelopedExceptionpublic void decrypt(java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
throws EnvelopedException,
EnvelopedInvalidRecipientException
ByteArrayOutputStream.
Происходит попытка расшифровать сообщение любого из
получателей с помощью переданного закрытого ключа.
Если был передан сертификат, то выполнится проверка,
соответствует ли сертификат данному получателю.recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.dataStream - Исходящий поток с расшифрованными данными.EnvelopedExceptionEnvelopedInvalidRecipientExceptionpublic java.io.InputStream decrypt(java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
throws EnvelopedException,
EnvelopedInvalidRecipientException
recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.EnvelopedExceptionEnvelopedInvalidRecipientExceptionpublic void decrypt(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
throws EnvelopedException,
EnvelopedInvalidRecipientFormatException,
EnvelopedWrongRecipientException
ByteArrayOutputStream.
Происходит попытка расшифровать сообщение заданного
получателя с помощью переданного закрытого ключа.
Если был передан сертификат, то выполнится проверка,
соответствует ли сертификат данному получателю.recipient - Информация о конкретном получателе.recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.dataStream - Исходящий поток с расшифрованными данными.EnvelopedExceptionEnvelopedInvalidRecipientFormatExceptionEnvelopedWrongRecipientExceptionpublic static void decryptOne(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey,
java.io.OutputStream dataStream)
throws EnvelopedException,
EnvelopedInvalidRecipientFormatException,
EnvelopedWrongRecipientException
ByteArrayOutputStream.
Происходит попытка расшифровать сообщение заданного
получателя с помощью переданного закрытого ключа.
Если был передан сертификат, то выполнится проверка,
соответствует ли сертификат данному получателю.recipient - Информация о конкретном получателе.recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.dataStream - Исходящий поток с расшифрованными данными.EnvelopedExceptionEnvelopedInvalidRecipientFormatExceptionEnvelopedWrongRecipientExceptionpublic java.io.InputStream decrypt(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
throws EnvelopedException,
EnvelopedInvalidRecipientFormatException,
EnvelopedWrongRecipientException
recipient - Информация о конкретном получателе.recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.EnvelopedExceptionEnvelopedInvalidRecipientFormatExceptionEnvelopedWrongRecipientExceptionpublic static java.io.InputStream decryptOne(org.bouncycastle.cms.RecipientInformation recipient,
java.security.cert.X509Certificate recipientCertificate,
java.security.PrivateKey recipientPrivateKey)
throws EnvelopedException,
EnvelopedInvalidRecipientFormatException,
EnvelopedWrongRecipientException
recipient - Информация о конкретном получателе.recipientCertificate - Сертификат получателя.
Может быть null.recipientPrivateKey - Закрытый ключ получателя.EnvelopedExceptionEnvelopedInvalidRecipientFormatExceptionEnvelopedWrongRecipientException