【.NET】SYSLIB0022: RijndaelとRijndaelManagedの各型は古い形式である

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【.NET】SYSLIB0022: RijndaelとRijndaelManagedの各型は古い形式である

2024-7-8 |

.NETでRijndaelRijndaelManagedを使ってると発生するSYSLIB0022をなんとかしたい!

概要

今回の記事では、.NETでRijndaelRijndaelManagedを使ってると発生するSYSLIB0022をなんとかする手順を掲載する。

仕様書

環境

  • .NET 8

手順書

暗号化の処理でRijndaelRijndaelManagedが使われてると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;
}

まとめ(感想文)

修正は面倒なんだけども、セキュリティー的なリスクを教えてくれるのはありがたいと思う今日この頃。

参考文献・引用

下記の記事を参考にさせていただきました。ありがとうございました。