ホームページ >バックエンド開発 >C++ >RijndaelManagedと暗号APIを使用してC#で文字列を暗号化および復号化する方法は?

RijndaelManagedと暗号APIを使用してC#で文字列を暗号化および復号化する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2025-02-02 16:56:10241ブラウズ

How to Encrypt and Decrypt Strings in C# Using RijndaelManaged and the Cryptography API?

c#文字列暗号化と復号化 C#では、文字列暗号化と復号化がデータ保護の重要なリンクです。一般的に使用される2つの方法について説明しましょう: 1。rijndaelmanagedクラス

を使用します

rijndaelmanagedクラスは、一般的なAE(高度な暗号化標準)アルゴリズムの強力な実装を提供します。以下は、暗号化と秘密の文字列の例です。

2。暗号化API

を使用します C#の暗号APIは、セキュリティ暗号化操作のためのさまざまなクラスを提供します。以下は、このAPI暗号化と秘密の文字列の使用方法の例です。

両方の方法は、C#の機密データを保護するための強力な暗号化と復号化メカニズムを提供します。 RijndaelManagedクラスは成熟して広く使用されているアルゴリズムであり、暗号APIは追加の機能と柔軟性を提供します。 コード内の
<code class="language-csharp">using System.Security.Cryptography;
using System.Text;

public static class Crypto
{
    // 虽然应用程序特定的盐不是基于密码的加密的最佳实践,
    // 但只要它确实不常见,它可能足够安全。修改此答案还需要做很多工作。
    private static byte[] _salt = { ... };

    public static string Encrypt(string plainText, string sharedSecret)
    {
        // 从共享密钥和盐生成密钥
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

        // 创建 RijndaelManaged 对象
        RijndaelManaged aesAlg = new RijndaelManaged();
        aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

        // 加密数据
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        byte[] cipherText = null;

        using (MemoryStream msEncrypt = new MemoryStream())
        {
            // 添加 IV
            msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
            msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);

            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    // 将数据写入流
                    swEncrypt.Write(plainText);
                }
            }

            cipherText = msEncrypt.ToArray();
        }

        // 将加密的字节作为 base64 字符串返回
        return Convert.ToBase64String(cipherText);
    }

    public static string Decrypt(string cipherText, string sharedSecret)
    {
        // 从共享密钥和盐生成密钥
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

        // 创建 RijndaelManaged 对象
        RijndaelManaged aesAlg = new RijndaelManaged();
        aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

        // 解密数据
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
        byte[] plainText = null;

        using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
        {
            // 从加密流中获取初始化向量
            aesAlg.IV = ReadByteArray(msDecrypt);

            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {
                    // 从解密流中读取解密的字节
                    plainText = Encoding.UTF8.GetBytes(srDecrypt.ReadToEnd());
                }
            }
        }

        // 将解密的文本作为字符串返回
        return Encoding.UTF8.GetString(plainText);
    }

    // 读取流中字节数组的辅助方法
    private static byte[] ReadByteArray(Stream s)
    {
        byte[] rawLength = new byte[sizeof(int)];
        if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)
        {
            throw new InvalidOperationException("流不包含正确格式的字节数组");
        }

        byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)];
        if (s.Read(buffer, 0, buffer.Length) != buffer.Length)
        {
            throw new InvalidOperationException("未正确读取字节数组");
        }

        return buffer;
    }
}</code>
の定義は省略されており、実際の使用で安全な塩値を定義する必要があることに注意してください。 さらに、生産環境では、より強力なキー管理とより安全なキー派生方法を使用することをお勧めします。

以上がRijndaelManagedと暗号APIを使用してC#で文字列を暗号化および復号化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。