Вопрос

Я не эксперт по криптографии, но, насколько я понимаю, 3DES — это симметричный алгоритм шифрования, что означает, что он не использует открытые/закрытые ключи.

Тем не менее, мне было поручено зашифровать данные с помощью открытого ключа (в частности, файла .CER).Если вы проигнорируете всю симметричность/асимметричность, я смогу использовать ключевые данные из открытого ключа в качестве ключа TripleDES.Однако у меня возникли трудности с извлечением ключевых байтов из файла .CER.Это код в его нынешнем виде..

TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(@"c:\temp\whatever.cer");
cryptoProvider.Key = cert.PublicKey.Key.

Самый простой метод, который я могу найти для извлечения байтов необработанного ключа из сертификата, — это ToXmlString(bool), а затем выполнить некоторую хакерскую подстроку в возвращаемой строке.Однако это кажется настолько хакерским, что я чувствую, что мне не хватает более простого и очевидного способа сделать это.

Мне не хватает более простого способа использования файла .cer для предоставления ключевых данных криптоклассу C# 3DES, или взломать его из XML-строки сертификата действительно лучший способ сделать это?

Это было полезно?

Решение

cryptoProvider.Key = cert.GetPublicKey()?

Другие советы

Не рекомендуется использовать ключи, сгенерированные для асимметричной криптографии, для симметричной криптографии.Ничто не мешает вам придумать способ использования открытого ключа в качестве ключа шифрования для 3DES, но конечным результатом будет то, что любой, имеющий доступ к открытому ключу (а это значит, что каждый!) сможет расшифровать ваш зашифрованный текст. .

Шифрование больших объемов данных с помощью асимметричной криптографии — не лучший вариант.Вместо этого зашифруйте данные с помощью симметричного алгоритма и зашифруйте симметричный ключ (и IV) своим открытым ключом.

Эта страница из MSDN действительно помог мне освоить симметричную криптографию .Net.

Настоящая проблема здесь в том, что открытый ключ, ну, общественный.Это означает, что он доступен в свободном доступе, что означает, что он обеспечивает нулевую безопасность шифрования.

Черт возьми, у любого в этой теме есть вся информация, необходимая для расшифровки всего.Как и гуглеры.

Пожалуйста, постарайтесь убедить своих пользователей не использовать подобные данные открытого ключа.По крайней мере, попросите их предоставить пароль или какой-нибудь другой более безопасный фрагмент, который вы можете использовать для генерации согласованного ключа.

Еще кое-что.Ключи сертификатов различаются по размеру.Вероятно, он справится с удалением дополнительных байтов в ключе, но вы, вероятно, получите исключение Array Index/Out Of Bounds, если ключ окажется короче, чем требуется ключу 3DES.Я сомневаюсь, что это произойдет, 3DES требуется только 56 бит, а ключи сертификатов почти всегда имеют размер 256 бит или больше.

Я думаю, что вам не хватает преобразования байтов из строки, содержащей ключевые байты.

Надеюсь, метод FromBase64String Вам поможет:

byte[] keyBytes = Convert.FromBase64String(sourceString);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top