У меня есть 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;
}
}
}