Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PGP создание аналога spgpEncode в BouncyCastle на C#

2.5K
02 июня 2011 года
Akula
38 / / 17.01.2005
Здравствуйте,

Столкнулся с такой проблемой: я должен отправить шифрованные данные в PGP при помощи C#. Ранее программа работала на дельфи и криптовала данные при помощи функции spgp_Encode из библиотеки PGP SDK .

В C# с PGP работает сторонняя библиотека Bouncy Castle. Пробую сначала подписать данные при помощью моего закрытоко ключа, а потом зашифровать их при помощи открытого ключа получателя. Получатель такую байду не принимает и ругается на подпись.

Привожу код на C#

Будем считать что мой приватный ключ уже находится в MyPrivateKey, а публичный ключ получателя в ReceiverPublicKey

HashAlgorithmTag digest = HashAlgorithmTag.MD5;

PgpV3SignatureGenerator sGen = new PgpV3SignatureGenerator(MyPublicKey.Algorithm, digest);
sGen.InitSign(PgpSignature.CanonicalTextDocument, pgpPrivKey);

string str="sekretnaia stroka";
byte[] byteStr = Encoding.ASCII.GetBytes(str);

// непосредственно подписание
sGen.Update(byteStr);

byte[] signdata1 = sGen.Generate().GetEncoded();
byte[] encdata1 = Encrypt(byteStr, BankKey);


Данные из encdata1 уже передаются получателю по сети.

Функция Encrypt:

private static byte[] Encrypt(byte[] clearData, PgpPublicKey encKey)
{
bool armor = true;
string fileName = PgpLiteralData.Console;

MemoryStream bOut = new MemoryStream();

PgpCompressedDataGenerator comData = new PgpCompressedDataGenerator(CompressionAlgorithmTag.Uncompressed);
Stream cos = comData.Open(bOut); // open it with the final destination
PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator();

Stream pOut = lData.Open(

cos, // the compressed output stream
PgpLiteralData.Utf8, //Binary
fileName, // "filename" to store
clearData.Length, // length of clear data
DateTime.UtcNow // current time

);



pOut.Write(clearData, 0, clearData.Length);

lData.Close();
comData.Close();

PgpEncryptedDataGenerator cPk = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.Idea);

cPk.AddMethod(encKey);
byte[] bytes = bOut.ToArray();

MemoryStream encOut = new MemoryStream();
Stream os = encOut;

if (armor)
{
os = new ArmoredOutputStream(os);
}



Stream cOut = cPk.Open(os, bytes.Length);
cOut.Write(bytes, 0, bytes.Length); // get bytes from compressed stream
cOut.Close();



if (armor)
{
os.Close();
}
encOut.Close();

return encOut.ToArray();
}


Буду очень признателен за любую помощь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог