.NET ヘルプ

C# XOR(開発者向けの動作原理)

イントロダクション

C#でPDFを操作する際には、セキュリティとデータ操作が重要な課題です。 軽量暗号化およびデータ変換のための効果的な技術の一つは、ビット単位のXOR演算です。 この技術は、論理演算、データの難読化、およびウォーターマーキングに広く使用されています。

IronPDFは、PDFを扱う強力なC#ライブラリであり、開発者がビット単位の論理演算子をPDFワークフローに統合することを可能にします。 論理XOR演算子を活用することで、PDF内のテキスト、画像、メタデータに変換を適用することができます。

このガイドでは、IronPDFを使ってPDF処理にどのように適用するかを探ります。

C#におけるXORの理解

XORとは何ですか?

XOR(論理排他的 OR 演算子としても知られる)は、コード内で '^' 記号で表され、ビット単位の XOR 演算を実行するために使用される二項演算です。 では、論理 OR 演算子とはどのように異なるのでしょうか? これらの2つの演算子は似た名前を持っていますが、XORの演算子名における「exclusive」という単語の使用が、これら2つを区別する要因です。 論理和演算子は、包含的なオペランドであり、AND/OR演算子として見られることが多いです。これは、2つのオペランドのうち1つまたは両方が真であれば、真を返します。

一方、XORは少し異なる方法で動作します。 このビット単位演算子はブール値を評価し、2つのオペランドのうちどちらか一方がtrueを返す場合にのみtrueを返します。 両方の選択肢が同じ結果を返した場合、false を返します。

より簡略化した概要として、XORの動作を示す真理値表を見てみましょう。

in1

in2

出力

1

1

1

1

1

1

一方、ORはこのように機能します:

in1

in2

出力

1

1

1

1

1

例えば:

byte a = 0b10101010; // 170 in decimal
byte b = 0b11001100; // 204 in decimal
byte result = (byte)(a ^ b); // XOR operation
Console.WriteLine(Convert.ToString(result, 2)); // Output: 01100110
byte a = 0b10101010; // 170 in decimal
byte b = 0b11001100; // 204 in decimal
byte result = (byte)(a ^ b); // XOR operation
Console.WriteLine(Convert.ToString(result, 2)); // Output: 01100110
Dim a As Byte = &B10101010 ' 170 in decimal
Dim b As Byte = &B11001100 ' 204 in decimal
Dim result As Byte = CByte(a Xor b) ' XOR operation
Console.WriteLine(Convert.ToString(result, 2)) ' Output: 01100110
$vbLabelText   $csharpLabel

壊れた画像

代替テキストをクリア

ブール式では、XORをブールオペランドに適用できます。

bool a = true;
bool b = false;
bool result = a ^ b; // Logical XOR operator
Console.WriteLine(result); // Output: True
bool a = true;
bool b = false;
bool result = a ^ b; // Logical XOR operator
Console.WriteLine(result); // Output: True
Dim a As Boolean = True
Dim b As Boolean = False
Dim result As Boolean = a Xor b ' Logical XOR operator
Console.WriteLine(result) ' Output: True
$vbLabelText   $csharpLabel

C# XOR (開発者向けの仕組み): 図2 - ブール式の出力

Pixabay から追加アップロード

またはここに画像をドラッグアンドドロップします

代替テキストをクリア

ここでは、ビット演算を使用して2つのオペランドを比較します。 右のオペランドは左と異なるため、出力が真であることが保証されます。 第二オペランドが最初のオペランドと同じであった場合、falseを見たでしょう。

演算子の優先順位とXOR

ビットごとのXOR演算は、算術演算子よりも演算子の優先順位が低いですが、ビットごとの補数(~)や論理否定(!)よりも高いです。

例えば:

int x = 5 ^ 2 + 3; 
Console.WriteLine(x); // Output: 0
int x = 5 ^ 2 + 3; 
Console.WriteLine(x); // Output: 0
CONVERTER NOT RUNNING
$vbLabelText   $csharpLabel

壊れた画像

画像の代替テキストを追加

C# の演算子の優先順位

  • +(加算)は、^(ビット単位の排他的論理和)よりも優先順位が高い。

    • これは、式が次のように評価されることを意味します:
int x = 5 ^ (2 + 3); // Equivalent to 5 ^ 5
int x = 5 ^ (2 + 3); // Equivalent to 5 ^ 5
Dim x As Integer = 5 Xor (2 + 3) ' Equivalent to 5 ^ 5
$vbLabelText   $csharpLabel
  • 次に、ビット単位の XOR を計算します。
5  = 00000101  
    5  = 00000101  
    -------------
    XOR = 00000000  (Decimal 0)
5  = 00000101  
    5  = 00000101  
    -------------
    XOR = 00000000  (Decimal 0)
CONVERTER NOT RUNNING
$vbLabelText   $csharpLabel
  • 最終結果: 0.

PDFセキュリティと処理のためのXOR

PDFでの基本的な暗号化にXORを使用する

XORは同じ操作でデータをエンコードおよびデコードできるため、軽量な暗号化にしばしば使用されます。 AES暗号化と比較すると強力なセキュリティ対策とは言えませんが、PDF内容をすばやく難読化する方法を提供します。

画像の可視性切り替え用XOR

XOR は、画像ベースの透かしの表示を動的に切り替えるために使用できます。 例えば、透かしはXORを使用してエンコードでき、既知のキーを適用した場合にのみ表示可能になります。 この同じ方法をテキストベースの透かしやスタンプに適用することができます。

メタデータ難読化におけるXOR

PDFメタデータには、ドキュメントの作成者、作成日、および他の識別情報などの機密情報が含まれていることがあります。 XORはデコードしない限り読み取れないようにするために、メタデータフィールドに適用することができます。

IronPDFを使用したC#でのXORの実装

XOR ベースのPDFテキスト処理

テキストをPDFに挿入する前にXORを適用することで、基本的な難読化が可能になります。 次の例では、このプロセスに関与するコードを詳しく見ていきます。

例:IronPDFでの XOR を使用したテキストのエンコードとデコード

using IronPdf;
using IronSoftware.Drawing;
using System;
using System.Text;
class Program
{
    static string XorEncryptDecrypt(string text, char key)
    {
        StringBuilder output = new StringBuilder();
        foreach (char c in text)
        {
            output.Append((char)(c ^ key));
        }
        return output.ToString();
    }
    static void Main()
    {
        var text = "Confidential Information";
        char key = 'X'; // Simple XOR key
        string encodedText = XorEncryptDecrypt(text, key);
        var pdf = new PdfDocument(270, 270);
        pdf.DrawText(encodedText, FontTypes.TimesNewRoman.Name, FontSize: 40, PageIndex: 0, X: 150, Y: 300, Color.Black, Rotation: 0);
        pdf.SaveAs("XorEncoded.pdf");
        Console.WriteLine("PDF with XOR-encoded text created.");
    }
}
using IronPdf;
using IronSoftware.Drawing;
using System;
using System.Text;
class Program
{
    static string XorEncryptDecrypt(string text, char key)
    {
        StringBuilder output = new StringBuilder();
        foreach (char c in text)
        {
            output.Append((char)(c ^ key));
        }
        return output.ToString();
    }
    static void Main()
    {
        var text = "Confidential Information";
        char key = 'X'; // Simple XOR key
        string encodedText = XorEncryptDecrypt(text, key);
        var pdf = new PdfDocument(270, 270);
        pdf.DrawText(encodedText, FontTypes.TimesNewRoman.Name, FontSize: 40, PageIndex: 0, X: 150, Y: 300, Color.Black, Rotation: 0);
        pdf.SaveAs("XorEncoded.pdf");
        Console.WriteLine("PDF with XOR-encoded text created.");
    }
}
Imports IronPdf
Imports IronSoftware.Drawing
Imports System
Imports System.Text
Friend Class Program
	Private Shared Function XorEncryptDecrypt(ByVal text As String, ByVal key As Char) As String
		Dim output As New StringBuilder()
		For Each c As Char In text
			output.Append(ChrW(AscW(c) Xor AscW(key)))
		Next c
		Return output.ToString()
	End Function
	Shared Sub Main()
		Dim text = "Confidential Information"
		Dim key As Char = "X"c ' Simple XOR key
		Dim encodedText As String = XorEncryptDecrypt(text, key)
		Dim pdf = New PdfDocument(270, 270)
		pdf.DrawText(encodedText, FontTypes.TimesNewRoman.Name, FontSize:= 40, PageIndex:= 0, X:= 150, Y:= 300, Color.Black, Rotation:= 0)
		pdf.SaveAs("XorEncoded.pdf")
		Console.WriteLine("PDF with XOR-encoded text created.")
	End Sub
End Class
$vbLabelText   $csharpLabel

出力

C# XOR(開発者向けの動作方法): 図4 - エンコードされたテキストPDF出力

Pixabay から追加アップロード

またはここに画像をドラッグアンドドロップします

代替テキストをクリア

ここでは、XOR関数を使用してテキストを難読化し、PDFに挿入する前に処理します。 同じ関数は、同じキーで再びXORを適用することでそれを復号化できます。

PDF画像操作用XOR

XORは、PDFに埋め込む前に画像に適用することもでき、そのピクセル値を変更してデコードされるまで表示できないようにします。

例:PDFに挿入する前に画像ピクセルにXORを適用

using IronPdf;
using IronPdf.Editing;
using System;
using System.Drawing;
using System.Text;
class Program
{
    static Bitmap XorImage(Bitmap image, byte key)
    {
        for (int y = 0; y < image.Height; y++)
        {
            for (int x = 0; x < image.Width; x++)
            {
                Color pixel = image.GetPixel(x, y);
                Color newPixel = Color.FromArgb(pixel.A, pixel.R ^ key, pixel.G ^ key, pixel.B ^ key);
                image.SetPixel(x, y, newPixel);
            }
        }
        return image;
    }
    static void Main()
    {
        var pdf = new PdfDocument(270, 270);
        Bitmap image = new Bitmap("example_image.png");
        Bitmap encodedImage = XorImage(image, 0x55);
        encodedImage.Save("XorImage.png");
        ImageStamper imageStamp = new ImageStamper("XorImage.png")
        {
            VerticalAlignment = VerticalAlignment.Middle,
        };
        pdf.SaveAs("XorImagePDF.pdf");
        Console.WriteLine("PDF with XOR-modified image created.");
    }
}
using IronPdf;
using IronPdf.Editing;
using System;
using System.Drawing;
using System.Text;
class Program
{
    static Bitmap XorImage(Bitmap image, byte key)
    {
        for (int y = 0; y < image.Height; y++)
        {
            for (int x = 0; x < image.Width; x++)
            {
                Color pixel = image.GetPixel(x, y);
                Color newPixel = Color.FromArgb(pixel.A, pixel.R ^ key, pixel.G ^ key, pixel.B ^ key);
                image.SetPixel(x, y, newPixel);
            }
        }
        return image;
    }
    static void Main()
    {
        var pdf = new PdfDocument(270, 270);
        Bitmap image = new Bitmap("example_image.png");
        Bitmap encodedImage = XorImage(image, 0x55);
        encodedImage.Save("XorImage.png");
        ImageStamper imageStamp = new ImageStamper("XorImage.png")
        {
            VerticalAlignment = VerticalAlignment.Middle,
        };
        pdf.SaveAs("XorImagePDF.pdf");
        Console.WriteLine("PDF with XOR-modified image created.");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Imports System.Drawing
Imports System.Text
Friend Class Program
	Private Shared Function XorImage(ByVal image As Bitmap, ByVal key As Byte) As Bitmap
		For y As Integer = 0 To image.Height - 1
			For x As Integer = 0 To image.Width - 1
				Dim pixel As Color = image.GetPixel(x, y)
				Dim newPixel As Color = Color.FromArgb(pixel.A, pixel.R Xor key, pixel.G Xor key, pixel.B Xor key)
				image.SetPixel(x, y, newPixel)
			Next x
		Next y
		Return image
	End Function
	Shared Sub Main()
		Dim pdf = New PdfDocument(270, 270)
		Dim image As New Bitmap("example_image.png")
		Dim encodedImage As Bitmap = XorImage(image, &H55)
		encodedImage.Save("XorImage.png")
		Dim imageStamp As New ImageStamper("XorImage.png") With {.VerticalAlignment = VerticalAlignment.Middle}
		pdf.SaveAs("XorImagePDF.pdf")
		Console.WriteLine("PDF with XOR-modified image created.")
	End Sub
End Class
$vbLabelText   $csharpLabel

XOR 画像出力

C# XOR(開発者向けの仕組み):図5 - XOR画像出力

Pixabay から追加アップロード

またはここに画像をドラッグアンドドロップします

代替テキストをクリア

このアプローチは、XORを使用してピクセルの色を変更し、正しいキーでデコードされない限り、画像がスクランブルされて表示されるようにします。

PDFメタデータ処理のためのXOR

PDFメタデータには、秘匿される必要がある可能性のある重要な情報が含まれていることがよくあります。 XORをメタデータフィールドに適用して、復号キーがないと読み取れないようにすることができます。

例: PDFメタデータフィールドのXOR暗号化

using IronPdf;
using System;
using System.Text;
class Program
{
    static string XorEncryptDecrypt(string input, char key)
    {
        StringBuilder output = new StringBuilder();
        foreach (char c in input)
        {
            output.Append((char)(c ^ key));
        }
        return output.ToString();
    }
    static void Main()
    {
        var pdf = new PdfDocument(270, 270);
        pdf.MetaData.Author = XorEncryptDecrypt("John Doe", 'K');
        pdf.MetaData.Title = XorEncryptDecrypt("Confidential Report", 'K');
        pdf.SaveAs("XorMetadata.pdf");
        Console.WriteLine("PDF with XOR-encoded metadata created.");
    }
}
using IronPdf;
using System;
using System.Text;
class Program
{
    static string XorEncryptDecrypt(string input, char key)
    {
        StringBuilder output = new StringBuilder();
        foreach (char c in input)
        {
            output.Append((char)(c ^ key));
        }
        return output.ToString();
    }
    static void Main()
    {
        var pdf = new PdfDocument(270, 270);
        pdf.MetaData.Author = XorEncryptDecrypt("John Doe", 'K');
        pdf.MetaData.Title = XorEncryptDecrypt("Confidential Report", 'K');
        pdf.SaveAs("XorMetadata.pdf");
        Console.WriteLine("PDF with XOR-encoded metadata created.");
    }
}
Imports IronPdf
Imports System
Imports System.Text
Friend Class Program
	Private Shared Function XorEncryptDecrypt(ByVal input As String, ByVal key As Char) As String
		Dim output As New StringBuilder()
		For Each c As Char In input
			output.Append(ChrW(AscW(c) Xor AscW(key)))
		Next c
		Return output.ToString()
	End Function
	Shared Sub Main()
		Dim pdf = New PdfDocument(270, 270)
		pdf.MetaData.Author = XorEncryptDecrypt("John Doe", "K"c)
		pdf.MetaData.Title = XorEncryptDecrypt("Confidential Report", "K"c)
		pdf.SaveAs("XorMetadata.pdf")
		Console.WriteLine("PDF with XOR-encoded metadata created.")
	End Sub
End Class
$vbLabelText   $csharpLabel

出力

C# XOR(開発者向けの解説):図6 - XORでエンコードされたメタデータの出力

Pixabay から追加アップロード

またはここに画像をドラッグアンドドロップします

代替テキストをクリア

ここでは、メタデータフィールドがXOR暗号化されており、機密情報への容易なアクセスを防ぎます。

ベストプラクティスと制限事項

PDF処理でXORを使用するタイミング

  • テキスト、画像、およびメタデータの軽量な難読化
  • シンプルなウォーターマーキング技術
  • 高度なセキュリティが必要ない場合の基本的な暗号化

セキュリティの懸念と代替案

  • XORは強力な暗号化方法ではなく、高度に機密性のある情報の保護には使用すべきではありません。
  • より強力なセキュリティのために、AES暗号化またはPDFパスワード保護機能を検討してください。

大規模PDFでのパフォーマンス考慮事項

  • 大規模なPDFファイル、特に画像に対するXOR操作は、パフォーマンスに影響を与える可能性があります。
  • 選択的な要素にXORを適用して、PDF全体を対象にせずに最適化を検討する。

結論

XORは、PDFのビット単位の論理操作、透かし、メタデータ処理において簡単でありながら効果的な手法です。 テキスト、画像、およびメタデータにXOR変換を適用することにより、開発者は可逆的な難読化を持つPDFを作成できます。 しかし、より高いセキュリティが必要な場合は、より強力な暗号化方法を使用するべきです。

C#でビット単位の論理演算子、演算子の優先順位、およびブール式の動作を理解することで、開発者はIronPDFとXORをさまざまな実用的なアプリケーションで効果的に使用できます。 まだIronPDFをお持ちでないですか? 無料トライアルを試して、IronPDFがあなたのPDFプロジェクトをどのように次のレベルへと導くかを今日確認してください!

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# ObservableCollection(開発者向けの動作方法)
次へ >
C# インターロック (開発者のための仕組み)