PGP создание аналога spgpEncode в BouncyCastle на C#
Столкнулся с такой проблемой: я должен отправить шифрованные данные в 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();
}
Буду очень признателен за любую помощь