Совместимое шифрование между C# и PHP, ColdFusion, Ruby, Python.

StackOverflow https://stackoverflow.com/questions/102496

Вопрос

Мы разрабатываем сервис, который будет принимать POST запрос.Некоторые из POST данные должны быть зашифрованы перед POST так как он будет храниться в скрытых полях формы.

Приложение написано на C#, но мы хотим, чтобы сторонние клиенты могли легко с ним интегрироваться.Мы обнаружили, что большинство клиентов используют PHP, Classic ASP или VB.Net.

Третьи лица должны заниматься только шифрованием.Мы займемся расшифровкой.Двусторонней связи нет.

Каковы наиболее совместимые комбинации алгоритма шифрования, режима заполнения и других параметров?

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

Решение

Предполагая, что у вас есть безопасный способ поделиться ключом (будь то его шифрование RSA, получение по ссылке SSH или HTTPS или звонок другому разработчику по защищенной телефонной линии), любой из основных современных методов шифрования (например, AES, как уже упоминалось) автор @Ed Haber) подойдет.Я бы поддержал его предложение об AES.Должны быть библиотеки для PHP, VB, Ruby и т. д.

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

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

Если вы имеете в виду, что третьи стороны не смогут расшифровать данные, вам следует использовать асимметричный алгоритм шифрования, такой как RSA.Это позволит третьей стороне зашифровать данные с помощью вашего открытого ключа, и только тогда вы сможете расшифровать данные с помощью вашего закрытого ключа, который вы не раскрываете.Должны быть реализации RSA, доступные для всех упомянутых вами языков.

Если вас не волнует, сможет ли третья сторона расшифровать данные, тогда вам подойдет AES.У вас будет один ключ, которым вы поделитесь с третьими лицами.Этот ключ используется как для шифрования, так и для дешифрования.

Я бы использовал AES для шифрования больших объемов данных и RSA для шифрования ключа AES.Если данных достаточно мало, просто зашифруйте их с помощью RSA.

Эд Хабер сказал

Я бы использовал AES для массового шифрования данных и RSA для шифрования ключа AES.Если данные достаточно малы, просто зашифруйте все это с RSA.

Я думаю, что это хорошее решение.Я бы хотел, чтобы ваше приложение опубликовало API для получения открытого ключа RSA.Когда третья сторона хочет отправить вам что-то, она получает открытый ключ.Затем он генерирует сеансовый ключ для фактического шифрования с использованием блочного шифра (т. е. AES) и отправляет вам ключ, зашифровав его с помощью вашего открытого ключа.Вы расшифровываете сеансовый ключ своим секретным ключом.Затем третья сторона шифрует данные, которые хочет отправить вам, с помощью AES (используя схему заполнения, которую вы также публикуете) и отправляет их вам.Вы расшифровываете его с помощью сеансового ключа.

С описанным выше методом есть некоторые проблемы.Поскольку вы не отправляете никакой информации (кроме публикации вашего открытого ключа), вы не можете контролировать создание сеансового ключа.Это означает, что третьи стороны могут использовать очень небезопасные способы генерации сеансового ключа, и вы никогда об этом не узнаете.Вторая проблема заключается в том, что каждый, кто хочет отправить вам данные, должен дополнять данные для AES так же, как и вы.Поэтому вам придется убедиться, что все скоординированы.Вторая проблема не слишком велика, но первая может стать проблемой, особенно если вы не слишком доверяете третьим лицам в создании действительно хороших сеансовых ключей из хорошего криптографически безопасного генератора случайных чисел.

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

Вот пример PHP:

function XOREncryption($InputString, $KeyPhrase){

    $KeyPhraseLength = strlen($KeyPhrase);

    for ($i = 0; $i < strlen($InputString); $i++){

        $rPos = $i % $KeyPhraseLength;

        $r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]);

        $InputString[$i] = chr($r);
    }

    return $InputString;
}

ColdFusion имеет функции шифрования и дешифрования, способные обрабатывать ряд алгоритмов и кодировок, включая рекомендованный выше AES.

Информация по адресу: http://www.cfquickdocs.com/cf8/?getDoc=encrypt#Encrypt

Быстрый пример кода:

Key = generateSecretKey( 'AES' , 128 )

EncryptedText = encrypt( Text , Key , 'AES' , 'Hex' )

Text = decrypt( EncryptedText , Key, 'AES' , 'Hex' )

Аналогичная функциональность доступна в этой библиотеке для PHP:
http://www.chilkatsoft.com/p/php_aes.asp

...и Java, Python, Ruby и другие...
http://www.example-code.com/java/crypt2_aes_matchPhp.asp
http://www.example-code.com/python/aes_stringEncryption.asp

Похоже, RSA — это алгоритм для вас.

Почему бы не открыть доступ к вашему серверу через HTTPS?Таким образом, любой клиент, поддерживающий HTTPS, сможет безопасно использовать эту услугу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top