Nano Hash - криптовалюты, майнинг, программирование

Зашифровать в Coldfusion и расшифровать в C#

Вот код, используемый для шифрования в coldfusion

<cfset strBase64Value = encrypt(strValue,24 character key,AES) />

Он генерирует зашифрованные значения, такие как 714FEA9A9A2184769CA49D5133F08580, что кажется мне странным, учитывая, что это только прописные буквы и цифры.

Какую библиотеку С# следует использовать для правильной расшифровки?

Также просмотрите эту информацию. , кажется, что по умолчанию он использует алгоритм UUEncode для кодирования.

Должен ли я попросить шифровальщик использовать Base64 в качестве параметра кодирования?

03.10.2014

  • оформите заказ в этом сообщении SO и посмотрите на некоторые ссылки в принятом ответе stackoverflow.com/questions/3226813/ 04.10.2014
  • Вот отличная статья об AES и .NET. блоги. msdn.com/b/shawnfa/archive/2006/10/09/ 04.10.2014
  • Я попробовал это, и он выдает [CryptographicException: длина данных для расшифровки недействительна.] System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) +7593325 Кажется, что-то делать с кодировкой. 04.10.2014

Ответы:


1

Он генерирует зашифрованные значения, такие как 714FEA9A9A2184769CA49D5133F08580

Тогда они используют «Hex», а не «UUEncode» по умолчанию. Либо "hex", либо "base64" в порядке. Пока вы оба согласны с кодировкой, это не имеет большого значения.

Вы можете использовать RijndaelManaged для расшифровки строк. Однако параметры шифрования по умолчанию для ColdFusion и C# немного различаются. С функцией шифрования:

  • «AES» — это сокращение от «AES/ECB/PKCS5Padding».
  • Режим "ECB" не использует IV
  • Строки ключей всегда кодируются base64.

Примечание. Несмотря на разницу в именах, для поставщика SUN PKCS5Padding (CF/Java) соответствует PaddingMode.PKCS7 (C#). Как упоминалось в этой теме, "... Поставщик SUN в Java указывает [s] PKCS#5, где следует использовать PKCS#7 - "PKCS5Padding" должен был быть "PKCS7Padding". Это наследие тех времен, когда использовались только 8-байтовые блочные шифры. такие как (тройной) симметричный шифр DES."

Поэтому вам нужно убедиться, что ваши настройки C # настроены так, чтобы они соответствовали. Имея это в виду, просто декодируйте зашифрованный текст ">из hex и ключевой строки из base64. Использование слегка некрасиво пример в API, просто настройте параметры алгоритма так, чтобы они соответствовали параметрам, используемым функцией encrypt():

Шифровать с помощью ColdFusion

<cfscript>
    plainText     = "Nothing to see";
    // 128 bit key base64 encoded
    keyInBase64   = "Y25Aju8H2P5DR8mY6B0ezg==";
    // "AES" is short for "AES/ECB/PKCS5Padding"
    encryptedText = encrypt(plainText, keyInBase64, "AES", "hex");
    WriteDump( encryptedText );
    // result: 8889EDF02F181158AAD902AB86C63951 
</cfscript>

Расшифровать с помощью C#

byte[] bytes = SomeMethodToConvertHexToBytes( encryptedText );
byte[] key = Convert.FromBase64String( keyInBase64 );

string decryptedText = null;

using (RijndaelManaged algorithm = new RijndaelManaged())
{

    // initialize settings to match those used by CF
    algorithm.Mode = CipherMode.ECB;
    algorithm.Padding = PaddingMode.PKCS7;
    algorithm.BlockSize = 128;
    algorithm.KeySize = 128;
    algorithm.Key = key;

    ICryptoTransform decryptor = algorithm.CreateDecryptor();

    using (MemoryStream msDecrypt = new MemoryStream(bytes))
    {
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
        {
           using (StreamReader srDecrypt = new StreamReader(csDecrypt))
           {

               decryptedText = srDecrypt.ReadToEnd();
           }
        }
    }
}

Console.WriteLine("Encrypted String: {0}", encryptedText);
Console.WriteLine("Decrypted String: {0}", decryptedText);

Имейте в виду, что вы можете (и, вероятно, должны) изменять настройки, например использовать более безопасный CBC режим вместо ECB. Вам просто нужно согласовать эти изменения с разработчиком CF.

04.10.2014
  • В тексте указано, что режим заполнения — PKCS5, но в коде указано, что это PKCS7. Это ошибка? 14.01.2016
  • @WayneConrad - Нет, но хороший вопрос. Из того, что я прочитал, java (как ни странно) поддерживает старый отступ descriptor PKCS5, но внутри при необходимости использует заполнение PKCS7, например, для AES. Таким образом, для кода CF/java вы должны использовать PKCS5Padding, который соответствует PaddingMode.PKCS7C в C#. 15.01.2016
  • @Leigh Ли, у тебя есть понимание, как это сделать с кодировкой UU? stackoverflow.com/ вопросы/38110956/. Я попробовал это с помощью вышеуказанного метода и получаю сообщение об ошибке «Длина данных для расшифровки недействительна». Вероятно, это связано с преобразованием пароля UUEncoded. 05.07.2016
  • @PatrickGoode - вам просто нужно что-то для декодирования строки UU в байты. (Это заменит SomeMethodToConvertHexToBytes). В последний раз я проверял, что в C# не было основной функции или библиотеки, реализующей UUEncode. Поэтому для этого на стороне С#, вероятно, потребуется сторонняя библиотека. Проще перекодировать значения как base64, а не UU, в CF. 05.07.2016
  • т.е. зашифрованныйBase64 = двоичный код (двоичный декод (зашифрованный AsUU, uu), base64) 05.07.2016

  • 2

    Если у кого-то была похожая проблема с JAVA, я только что реализовал шифрование и дешифрование строки, ранее зашифрованной/дешифрованной в coldfusion с помощью «Hex» и «tripledes». Вот мой код:

    private static final String PADDING = "DESede/ECB/PKCS5Padding";
    private static final String UTF_F8 = "UTF-8";
    private static final String DE_SEDE = "DESede";
    private String secretKey;
    
    
    public String encrypt(String message) throws Exception {
    
        secretKey = getSecretKey();
    
        final byte[] secretBase64Key = Base64.decodeBase64(secretKey);
        final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE);
        final Cipher cipher = Cipher.getInstance(PADDING);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        final byte[] plainTextBytes = message.getBytes();
        final byte[] cipherText = cipher.doFinal(plainTextBytes);
    
        return Hex.encodeHexString(cipherText);
    }
    
    public String decrypt(String keyToDecrypt) throws Exception {
    
        secretKey = getSecretKey();
    
        byte[] message = DatatypeConverter.parseHexBinary(keyToDecrypt);
        final byte[] secretBase64Key = Base64.decodeBase64(secretKey);
        final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE);
        final Cipher decipher = Cipher.getInstance(PADDING);
        decipher.init(Cipher.DECRYPT_MODE, key);
        final byte[] plainText = decipher.doFinal(message);
    
        return new String(plainText, UTF_F8);
    }
    
    26.09.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..