【.NET】SYSLIB0022: RijndaelとRijndaelManagedの各型は古い形式である
2024-7-8 | .NET
.NETでRijndael
とRijndaelManaged
を使ってると発生するSYSLIB0022
をなんとかしたい!
概要
今回の記事では、.NETでRijndael
とRijndaelManaged
を使ってると発生するSYSLIB0022
をなんとかする手順を掲載する。
仕様書
環境
- .NET 8
手順書
暗号化の処理でRijndael
やRijndaelManaged
が使われてるとSYSLIB0022
が発生する。
引数で渡された文字列を暗号化してBASE64 URLに相互変換する例。
まずは、SYSLIB0022
が発生するパターン。
public string Encrypt(string source, string password)
{
RijndaelManaged rm = new();
byte[] key, iv;
// パスワードから鍵とIVを作る関数
GenerateKeyFromPassword(password, rm.KeySize, out key, rm.BlockSize, out iv);
rm.Key = key;
rm.IV = iv;
byte[] strBytes = Encoding.UTF8.GetBytes(source);
string result;
using (ICryptoTransform ict = rm.CreateEncryptor())
{
byte[] encBytes = ict.TransformFinalBlock(strBytes, 0, strBytes.Length);
result = Convert.ToBase64String(encBytes).TrimEnd('=').Replace('+', '-').Replace('/', '_');
}
return result;
}
public string Decrypt(string source, string password)
{
RijndaelManaged rm = new RijndaelManaged();
byte[] key, iv;
// パスワードから鍵とIVを作る関数
GenerateKeyFromPassword(password, rm.KeySize, out key, rm.BlockSize, out iv);
rm.Key = key;
rm.IV = iv;
for (int i = 0; i < (encryptString.Length % 4); i++)
{
encryptString += "=";
}
byte[] strBytes = Convert.FromBase64String(source.Replace('-', '+').Replace('_', '/'));
string result;
using (ICryptoTransform ict = rm.CreateDecryptor())
{
byte[] decBytes = ict.TransformFinalBlock(strBytes, 0, strBytes.Length);
result = Encoding.UTF8.GetString(decBytes);
}
return result;
}
次にRijndaelManaged
を使わず、Aes
を使って暗号化する例。
public string Encrypt(string source, string password)
{
string strRet;
using (Aes aes = Aes.Create())
{
// パスワードから鍵とIVを作る関数
GenerateKeyFromPassword(password, aes.KeySize, out byte[] key, aes.BlockSize, out byte[] iv);
using ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);
using MemoryStream out_stream = new();
using (CryptoStream cs = new(out_stream, encryptor, CryptoStreamMode.Write))
{
using StreamWriter sw = new(cs);
sw.Write(source);
}
byte[] result = out_stream.ToArray();
strRet = Convert.ToBase64String(result).TrimEnd('=').Replace('+', '-').Replace('/', '_');
}
return strRet;
}
public string Decrypt(string source, string password)
{
string strRet;
using (Aes aes = Aes.Create())
{
// パスワードから鍵とIVを作る関数
GenerateKeyFromPassword(password, aes.KeySize, out byte[] key, aes.BlockSize, out byte[] iv);
for (int i = 0; i < (source.Length % 4); i++)
{
source += "=";
}
byte[] strBytes = Convert.FromBase64String(source.Replace('-', '+').Replace('_', '/'));
using ICryptoTransform decryptor =
aes.CreateDecryptor(key, iv);
using MemoryStream in_stream = new(strBytes);
using CryptoStream cs = new(in_stream, decryptor, CryptoStreamMode.Read);
using StreamReader sr = new(cs);
strRet = sr.ReadToEnd();
}
return strRet;
}
まとめ(感想文)
修正は面倒なんだけども、セキュリティー的なリスクを教えてくれるのはありがたいと思う今日この頃。
参考文献・引用
下記の記事を参考にさせていただきました。ありがとうございました。