PGP шифрование без файлов - PullRequest
       15

PGP шифрование без файлов

0 голосов
/ 04 октября 2018

Я делаю PGP-шифрование для файла CSV, ниже приведен код, в котором я застрял, в основном приведенный ниже код работает, если открытый ключ находится в локальном текстовом файле, однако, когда у меня такой же файл в хранилище BLOB-объектов AzureЯ загружаю содержимое в поток памяти, а затем передаю его как параметр, он не работает, короче говоря File.OpenRead работает, но не поток памяти, пожалуйста, помогите

 public static PgpPublicKey ReadPublicKey12()
            {
                var containerName = "pgpkeys";
                string storageConnection = CloudConfigurationManager.GetSetting("StorageConnnection");
                CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
                CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
                CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference(containerName);
                CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference("keyPublic.txt");
                Stream inputStream = new MemoryStream();           
                blockBlob.DownloadToStream(inputStream);
               //  inputStream = File.OpenRead(@"C:\PGPTest\keyPublic1234.txt"); 
                inputStream = PgpUtilities.GetDecoderStream(inputStream);
                PgpPublicKeyRingBundle pgpPub = new PgpPublicKeyRingBundle(inputStream);

                foreach (PgpPublicKeyRing kRing in pgpPub.GetKeyRings())
                {
                    foreach (PgpPublicKey k in kRing.GetPublicKeys())
                    {
                        if (k.IsEncryptionKey)
                            return k;
                    }
                }

                throw new ArgumentException("Can't find encryption key in key ring.");
            }

1 Ответ

0 голосов
/ 04 октября 2018

Если мы не сбрасываем позицию потока в ноль (inputStream.Position = 0;) 0-байтовый двоичный объект записывается в поток памяти, поэтому вам нужно добавить его, как показано ниже.

var containerName = "pgpkeys";
            string storageConnection = CloudConfigurationManager.GetSetting("StorageConnnection");
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
            CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
            CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference(containerName);
            CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference("keyPublic.txt");
            Stream inputStream = new MemoryStream();           
            blockBlob.DownloadToStream(inputStream);
            inputStream.Position = 0;

        inputStream = PgpUtilities.GetDecoderStream(inputStream);
        PgpPublicKeyRingBundle pgpPub = new PgpPublicKeyRingBundle(inputStream);

        foreach (PgpPublicKeyRing kRing in pgpPub.GetKeyRings())
        {
            foreach (PgpPublicKey k in kRing.GetPublicKeys())
            {
                Console.WriteLine("Obtained key from BLOB");
                if (k.IsEncryptionKey)
                    return k;
                Console.WriteLine("Obtained key from BLOB");
            }
        }
        throw new ArgumentException("Can't find encryption key in key ring.");
...