フッターコンテンツにスキップ
.NETヘルプ

C# AES暗号化(開発者向けの仕組み)

AES(高度暗号化標準)は、最も一般的に使用される対称暗号化アルゴリズムの1つです。 データを暗号化および復号化するために同じキーを使用するため、AES暗号化は多くのアプリケーションで機密データを保護するために効率的かつ高速です。

このチュートリアルでは、C#でのAES暗号化に焦点を当て、AESクラスを使用してデータを暗号化および復号化し、IronPDFライブラリを使用します。 実践的な例を取り上げ、暗号化プロセスを通じて解説し、セキュリティを向上させるためにブロック連鎖暗号モード (CBC) の使用方法を紹介します。 暗号化キーの管理と初期化ベクトル (IV) の役割についても議論します。

C#におけるAES暗号化の紹介

高度暗号化標準 (AES) は、国家標準技術研究所 (NIST) によって標準化された対称暗号化アルゴリズムです。 アルゴリズムは128ビット、192ビット、または256ビットのキーサイズを持ち、機密データの暗号化に非常に安全です。 データを暗号化および復号化するために同じ暗号化キーを使用します。

AESは元のデータをブロックに分割し、それらのブロックに対して変換を施すことで動作します。 CBC(暗号ブロック連鎖)やECB(電子コードブック)など、異なる暗号モードで動作し、それぞれ異なるセキュリティ機能を提供します。

C#におけるAESの動作

C#のAES暗号化アルゴリズムはSystem.Security.Cryptography名前空間の一部です。 この名前空間にはAESクラスが含まれており、これを使用してAESのインスタンスを作成し、キーサイズ、暗号モード、パディングモードを指定し、秘密キーを使用してデータを暗号化および復号化できます。

C#でAESを使用するには、次の基本的な手順に従います。

  1. Aes.Create()を使用してAESクラスのインスタンスを作成します。
  2. キー、IV、および暗号モードなどの関連パラメータを設定します。
  3. ICryptoTransformインターフェイスを使用してデータを暗号化し、MemoryStreamに書き込みます。
  4. 同じキーとIVを使用してデータを復号化します。

C#で基本的な暗号化プロセスと復号プログラムを作成しましょう。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    // Declare a static byte array for encrypted data
    public static byte[] encryptedData;

    // Main method to demonstrate encryption and decryption
    public static void Main(string[] args)
    {
        // String plaintext to be encrypted
        string plaintext = "This is some sensitive data!";
        string key = "abcdefghijklmnop"; // 128-bit key (16 characters)

        // Encrypt the plaintext
        string ciphertext = Encrypt(plaintext, key);
        Console.WriteLine("Encrypted Data: " + ciphertext);

        // Decrypt the ciphertext
        string decryptedData = Decrypt(ciphertext, key);
        Console.WriteLine("Decrypted Data: " + decryptedData);
    }

    // Method to encrypt data
    public static string Encrypt(string plaintext, string key)
    {
        // Create a new instance of the AES encryption algorithm
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create an encryptor to perform the stream transform
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            // Create the streams used for encryption
            using (MemoryStream ms = new MemoryStream())
            {
                // Create a CryptoStream using the encryptor
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(plaintext);
                    }
                }
                // Store the encrypted data in the public static byte array
                encryptedData = ms.ToArray();
                return Convert.ToBase64String(encryptedData);
            }
        }
    }

    // Method to decrypt data
    public static string Decrypt(string ciphertext, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

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

            // Create the streams used for decryption
            using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    // Declare a static byte array for encrypted data
    public static byte[] encryptedData;

    // Main method to demonstrate encryption and decryption
    public static void Main(string[] args)
    {
        // String plaintext to be encrypted
        string plaintext = "This is some sensitive data!";
        string key = "abcdefghijklmnop"; // 128-bit key (16 characters)

        // Encrypt the plaintext
        string ciphertext = Encrypt(plaintext, key);
        Console.WriteLine("Encrypted Data: " + ciphertext);

        // Decrypt the ciphertext
        string decryptedData = Decrypt(ciphertext, key);
        Console.WriteLine("Decrypted Data: " + decryptedData);
    }

    // Method to encrypt data
    public static string Encrypt(string plaintext, string key)
    {
        // Create a new instance of the AES encryption algorithm
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create an encryptor to perform the stream transform
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            // Create the streams used for encryption
            using (MemoryStream ms = new MemoryStream())
            {
                // Create a CryptoStream using the encryptor
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(plaintext);
                    }
                }
                // Store the encrypted data in the public static byte array
                encryptedData = ms.ToArray();
                return Convert.ToBase64String(encryptedData);
            }
        }
    }

    // Method to decrypt data
    public static string Decrypt(string ciphertext, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

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

            // Create the streams used for decryption
            using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Friend Class Program
	' Declare a static byte array for encrypted data
	Public Shared encryptedData() As Byte

	' Main method to demonstrate encryption and decryption
	Public Shared Sub Main(ByVal args() As String)
		' String plaintext to be encrypted
		Dim plaintext As String = "This is some sensitive data!"
		Dim key As String = "abcdefghijklmnop" ' 128-bit key (16 characters)

		' Encrypt the plaintext
		Dim ciphertext As String = Encrypt(plaintext, key)
		Console.WriteLine("Encrypted Data: " & ciphertext)

		' Decrypt the ciphertext
		Dim decryptedData As String = Decrypt(ciphertext, key)
		Console.WriteLine("Decrypted Data: " & decryptedData)
	End Sub

	' Method to encrypt data
	Public Shared Function Encrypt(ByVal plaintext As String, ByVal key As String) As String
		' Create a new instance of the AES encryption algorithm
		Using aes As Aes = System.Security.Cryptography.Aes.Create()
			aes.Key = Encoding.UTF8.GetBytes(key)
			aes.IV = New Byte(15){} ' Initialization vector (IV)

			' Create an encryptor to perform the stream transform
			Dim encryptor As ICryptoTransform = aes.CreateEncryptor(aes.Key, aes.IV)

			' Create the streams used for encryption
			Using ms As New MemoryStream()
				' Create a CryptoStream using the encryptor
				Using cs As New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
					Using sw As New StreamWriter(cs)
						sw.Write(plaintext)
					End Using
				End Using
				' Store the encrypted data in the public static byte array
				encryptedData = ms.ToArray()
				Return Convert.ToBase64String(encryptedData)
			End Using
		End Using
	End Function

	' Method to decrypt data
	Public Shared Function Decrypt(ByVal ciphertext As String, ByVal key As String) As String
		Using aes As Aes = System.Security.Cryptography.Aes.Create()
			aes.Key = Encoding.UTF8.GetBytes(key)
			aes.IV = New Byte(15){} ' Initialization vector (IV)

			' Create a decryptor to perform the stream transform
			Dim decryptor As ICryptoTransform = aes.CreateDecryptor(aes.Key, aes.IV)

			' Create the streams used for decryption
			Using ms As New MemoryStream(Convert.FromBase64String(ciphertext))
				Using cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
					Using sr As New StreamReader(cs)
						Return sr.ReadToEnd()
					End Using
				End Using
			End Using
		End Using
	End Function
End Class
$vbLabelText   $csharpLabel

C# AES暗号化(開発者向けの仕組み):図1 - メモリストリームを使用した暗号化と復号出力

コードの説明

  1. Aes.Create(): AES暗号化アルゴリズムの新しいインスタンスを作成します。
  2. aes.Key: 暗号化と復号化の両方に使用されるキーです。 サイズは128ビット(16バイト)、192ビット、または256ビットのように有効でなければなりません。
  3. aes.IV: 初期化ベクトル (IV) は、暗号化プロセスをランダム化するために使用されます。 この例では、シンプルさのためにゼロのIVを使用します。
  4. MemoryStream: 暗号化されたデータをバイトのストリームとして処理できます。
  5. CryptoStream: データストリーム(暗号化または復号化)を変換します。

高度な例: カスタムキーとIVを使用したAES暗号化

以前の例を基にして、ランダムキーIVを生成し、暗号化をより安全にします。

public static string EncryptData(string plaintext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = new byte[32]; // AES-256 requires a 256-bit key (32 bytes)
        aes.IV = new byte[16];  // 128-bit block size

        // Randomly generate key and IV
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(aes.Key); // Generate a random key
            rng.GetBytes(aes.IV);  // Generate a random IV
        }

        // Create an encryptor to perform the stream transform
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        // Create the streams used for encryption
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(plaintext);
                }
            }
            return Convert.ToBase64String(ms.ToArray());
        }
    }
}
public static string EncryptData(string plaintext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = new byte[32]; // AES-256 requires a 256-bit key (32 bytes)
        aes.IV = new byte[16];  // 128-bit block size

        // Randomly generate key and IV
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(aes.Key); // Generate a random key
            rng.GetBytes(aes.IV);  // Generate a random IV
        }

        // Create an encryptor to perform the stream transform
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        // Create the streams used for encryption
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(plaintext);
                }
            }
            return Convert.ToBase64String(ms.ToArray());
        }
    }
}
Public Shared Function EncryptData(ByVal plaintext As String) As String
	Using aes As Aes = Aes.Create()
		aes.Key = New Byte(31){} ' AES-256 requires a 256-bit key (32 bytes)
		aes.IV = New Byte(15){} ' 128-bit block size

		' Randomly generate key and IV
		Using rng As RandomNumberGenerator = RandomNumberGenerator.Create()
			rng.GetBytes(aes.Key) ' Generate a random key
			rng.GetBytes(aes.IV) ' Generate a random IV
		End Using

		' Create an encryptor to perform the stream transform
		Dim encryptor As ICryptoTransform = aes.CreateEncryptor(aes.Key, aes.IV)

		' Create the streams used for encryption
		Using ms As New MemoryStream()
			Using cs As New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
				Using sw As New StreamWriter(cs)
					sw.Write(plaintext)
				End Using
			End Using
			Return Convert.ToBase64String(ms.ToArray())
		End Using
	End Using
End Function
$vbLabelText   $csharpLabel

この場合、関数が呼び出されるたびに新しいキーIVを生成します。 これは、同じキーが毎回使用されることなく、より強力な暗号化を提供します。 AESは128、192、256ビットのようなキーサイズをサポートしています

AESによるデータの復号化

復号化は、データを暗号化する逆プロセスです。 私たちの例では、暗号化に使用された同じキーとIVを提供してデータを復号化する必要があります。 復号化プロセスには、暗号化されたデータを元の形式に戻すことが含まれます。

ここでは、以前に暗号化されたデータを使用した例を紹介します。

public static string DecryptData(string ciphertext, byte[] key, byte[] iv)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;

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

        // Create the streams used for decryption
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}
public static string DecryptData(string ciphertext, byte[] key, byte[] iv)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;

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

        // Create the streams used for decryption
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}
Public Shared Function DecryptData(ByVal ciphertext As String, ByVal key() As Byte, ByVal iv() As Byte) As String
	Using aes As Aes = Aes.Create()
		aes.Key = key
		aes.IV = iv

		' Create a decryptor to perform the stream transform
		Dim decryptor As ICryptoTransform = aes.CreateDecryptor(aes.Key, aes.IV)

		' Create the streams used for decryption
		Using ms As New MemoryStream(Convert.FromBase64String(ciphertext))
			Using cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
				Using sr As New StreamReader(cs)
					Return sr.ReadToEnd()
				End Using
			End Using
		End Using
	End Using
End Function
$vbLabelText   $csharpLabel

このコードは暗号化されたデータ元のデータに戻します。

AES暗号化を使用したIronPDF

IronPDFは、シンプルで開発者フレンドリーな.NETライブラリで、簡単なC#コードを使用してPDFを生成、編集、および操作するために設計されています。 開発者がHTML、CSS、およびJavaScriptから直接PDFドキュメントを作成することを可能にし、動的なレポート、請求書、その他のドキュメントの生成に非常に便利です。 マージ、分割、さらにはパスワードやデジタル署名などのセキュリティ機能を追加するサポートを備えたIronPDFは、.NETアプリケーションでのPDF生成の包括的なソリューションです。

AES暗号化との統合によるIronPDFの活用

C# AES暗号化(開発者向けの仕組み):図2 - IronPDF

機密レポートやドキュメントを生成する際には、PDF内のデータが共有前に暗号化されていることを保証する必要があるかもしれません。 AES(高度暗号化標準)暗号化は、PDFファイルの内容を安全に暗号化するための完璧なソリューションです。 IronPDFとAES暗号化を組み合わせることで、PDF内のデータを保護しつつ、ドキュメント自体と連携できるようにします。

ステップ1:IronPDFを使用したPDFの作成

ChromePdfRendererクラスを使用してHTMLコンテンツからPDFを生成し、ファイルに保存します。

var htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(@"C:\Reports\ConfidentialReport.pdf");
var htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(@"C:\Reports\ConfidentialReport.pdf");
Dim htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("C:\Reports\ConfidentialReport.pdf")
$vbLabelText   $csharpLabel

ステップ2:AESを使用したPDFの暗号化

PDFを作成したら、それをAESで暗号化します。

byte[] pdfBytes = File.ReadAllBytes(@"C:\Reports\ConfidentialReport.pdf");
using (Aes aes = Aes.Create())
{
    aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop");
    aes.IV = new byte[16];
    using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
    using (var ms = new MemoryStream())
    {
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(pdfBytes, 0, pdfBytes.Length);
        }
        File.WriteAllBytes(@"C:\Reports\ConfidentialReport.encrypted", ms.ToArray());
    }
}
byte[] pdfBytes = File.ReadAllBytes(@"C:\Reports\ConfidentialReport.pdf");
using (Aes aes = Aes.Create())
{
    aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop");
    aes.IV = new byte[16];
    using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
    using (var ms = new MemoryStream())
    {
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(pdfBytes, 0, pdfBytes.Length);
        }
        File.WriteAllBytes(@"C:\Reports\ConfidentialReport.encrypted", ms.ToArray());
    }
}
Dim pdfBytes() As Byte = File.ReadAllBytes("C:\Reports\ConfidentialReport.pdf")
Using aes As Aes = Aes.Create()
	aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop")
	aes.IV = New Byte(15){}
	Using encryptor = aes.CreateEncryptor(aes.Key, aes.IV)
	Using ms = New MemoryStream()
		Using cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
			cs.Write(pdfBytes, 0, pdfBytes.Length)
		End Using
		File.WriteAllBytes("C:\Reports\ConfidentialReport.encrypted", ms.ToArray())
	End Using
	End Using
End Using
$vbLabelText   $csharpLabel

結論

C# AES暗号化(開発者向けの仕組み):図3 - ライセンシング

IronPDFとAES暗号化を統合することで、アクセス可能でありながら暗号化された動的で安全なドキュメントを生成することができます。 安全なドキュメント生成を必要とするアプリケーションの開発や機密レポートの管理において、強固な暗号化との統合によってデータを保護します。 IronPDFはPDFの取り扱いを簡略化し、AESはコンテンツが安全であることを保証します。

IronPDFは無料トライアルを提供しており、開発者はその機能を検討する前に探索することが容易です。 IronPDFをプロジェクトに実装する準備が整ったら、ライセンスは一回限りの購入で$799から開始されます。

よくある質問

C# で HTML を PDF に変換するにはどうすればいいですか?

IronPDF の RenderHtmlAsPdf メソッドを使用して、HTML 文字列を PDF に変換できます。RenderHtmlFileAsPdf を使用して HTML ファイルを PDF に変換することもできます。

AES 暗号化とは何か、C# でどのように使用されるのか?

AES (Advanced Encryption Standard) は、データを保護するために使用される対称暗号化アルゴリズムです。C# では、AES 暗号化は System.Security.Cryptography 名前空間の AES クラスを使用して実装されます。AES インスタンスを作成し、キーと IV パラメータを設定し、ICryptoTransform インターフェイスを使用してデータを暗号化および復号化します。

AES 暗号化で Cipher Block Chaining (CBC) モードを使用する利点とは?

Cipher Block Chaining (CBC) モードは、同一の平文ブロックが異なる暗号文ブロックを生成するようにすることでセキュリティを強化します。これは、初期化ベクトル (IV) を使用してブロックの暗号化を連鎖させることで達成されます。

C# で AES を使用して PDF ドキュメントを暗号化するにはどうすればよいですか?

C# で AES を使用して PDF を暗号化するには、IronPDF を利用して PDF ファイルを処理し、指定されたキーと IV で PDF バイトを暗号化してから、新しいファイルに暗号化されたデータを書き戻します。

C# アプリケーションで AES 暗号化を実装するには、どのようなステップが必要ですか?

C# で AES 暗号化を実装するには、AES インスタンスを作成し、キーと IV を設定して暗号化装置を作成し、MemoryStreamCryptoStream を使用してデータを変換します。

C# で AES 暗号化にカスタムキーと IV を使用できますか?

はい、AES 暗号化ではカスタムキーと IV を指定してセキュリティを強化することができます。各暗号化セッションごとにランダムな値を生成することが優れた保護のために推奨されます。

C# で開発者は PDF ドキュメントのセキュリティをどのように強化できますか?

開発者は IronPDF と AES 暗号化を組み合わせて C# で PDF ドキュメントのセキュリティを強化し、PDF の作成、編集、セキュリティの追加、パスワードやデジタル署名の追加を可能にします。

IronPDF は、共有前に PDF コンテンツをどのように保護しますか?

IronPDF は、開発者が AES を使用して PDF を暗号化できるようにすることで、共有前に PDF コンテンツを保護します。このプロセスは、暗号化メソッドを使用して PDF ファイルを生成、編集、および操作してデータ保護を保証します。

なぜ AES 暗号化でキー管理が重要なのか?

AES 暗号化では、暗号化されたデータのセキュリティが、暗号化キーの秘密性と強度に大きく依存しているため、キー管理が非常に重要です。適切な管理により不正アクセスを防ぎます。

C# 開発者向けの IronPDF ライブラリの主な機能とは?

IronPDF ライブラリは、C# 開発者が PDF ドキュメントを簡単に作成、編集、および操作できるようにします。マージ、分割、暗号化された PDF のセキュリティをサポートし、ドキュメント管理とセキュリティを強化します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。