Как использовать FIPS-совместимое шифрование в обходе веб-приложения без сохранения состояния - PullRequest
0 голосов
/ 18 октября 2019

У меня есть GridView, который вызывает криптографический класс для шифрования ключа записи. Мой компьютер является государственным, поэтому FIPSAlgorithmPolicy включен. Это приводит к сбою исходного криптографического класса RijndaelManaged. Я заменяю его на AesCryptoServiceProvider. Тем не менее, я не мог расшифровать строку в исходное текстовое значение. Там написано «Входные данные не полный блок». Код взят из примера кода, но разбил код на два открытых метода, которые будут вызываться через веб-интерфейс. Один во время PageLoad (), другой при щелчке по любой строке в сетке, идентификатор зашифрованной записи передается в класс encryto, который необходимо расшифровать. Спасибо за вашу помощь.

Registry key HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy
<asp:TemplateField HeaderText="Task">
  <ItemTemplate>
    <asp:HyperLink ID="Hlink2" runat="server" NavigateUrl='<%# "~/p_encounter.aspx?ref=tickler&mhid="+BEncrypt(DataBinder.Eval(Container.DataItem, "EVENT_ID").ToString()) %>'>
      <%# DataBinder.Eval(Container.DataItem, "RowNum") %>
    </asp:HyperLink>
  </ItemTemplate>
  <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>

public string BEncrypt(string str) {
  return SimpleAES_FIPS_Compliant.EncryptToString(str);;
}

using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;

namespace CMT {
  public class SimpleAES_FIPS_Compliant {

    public static string EncryptToString(string plainText) {
      // Create a new instance of the AesCryptoServiceProvider
      // class.  This generates a new key and initialization 
      // vector (IV).
      using(AesCryptoServiceProvider myAes = new AesCryptoServiceProvider()) {
        // Encrypt the string to an array of bytes.
        byte[] encrypted = EncryptStringToBytes_Aes(plainText, myAes.Key, myAes.IV);
        return System.Text.Encoding.UTF8.GetString(encrypted);
      }
    }

    public static string DecryptString(string encryptedString) {
      using(AesCryptoServiceProvider myAes = new AesCryptoServiceProvider()) {
        char[] charArray = encryptedString.ToCharArray();
        var byteArray = System.Text.Encoding.UTF8.GetBytes(charArray, 0, charArray.Length);
        // Decrypt the bytes to a string.
        return DecryptStringFromBytes_Aes(byteArray, myAes.Key, myAes.IV);
      }
    }

    public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV) {
      // Check arguments.
      if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
      if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
      if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("IV");
      byte[] encrypted;
      // Create an AesCryptoServiceProvider object
      // with the specified key and IV.
      using(AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) {
        aesAlg.Key = Key;
        aesAlg.IV = IV;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

        // Create the streams used for encryption.
        using(MemoryStream msEncrypt = new MemoryStream()) {
          using(CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
            using(StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {

              //Write all data to the stream.
              swEncrypt.Write(plainText);
            }
            encrypted = msEncrypt.ToArray();
          }
        }
      }

      // Return the encrypted bytes from the memory stream.
      return encrypted;

    }

    public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV) {
      // Check arguments.
      if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("cipherText");
      if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
      if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("IV");

      // Declare the string used to hold the decrypted text.
      string decripted = string.Empty;

      // Create an AesCryptoServiceProvider object
      // with the specified key and IV.
      using(AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) {
        aesAlg.Padding = PaddingMode.None;
        aesAlg.Key = Key;
        aesAlg.IV = IV;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

        // Create the streams used for decryption.
        using(MemoryStream msDecrypt = new MemoryStream(cipherText)) {
          using(CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) {
            using(StreamReader srDecrypt = new StreamReader(csDecrypt)) {

              // Read the decrypted bytes from the decrypting stream
              // and place them in a string.
              decripted = srDecrypt.ReadToEnd();
            }
          }
        }

      }

      return decripted;
    }
  }
}

1 Ответ

0 голосов
/ 04 ноября 2019

Работало только с заменой алгоритма шифрования с RijndalelManaged на AesCryptoServiceProvider. Все остальные коды не изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...