XOR暗号

暗号学において単純XOR暗号は加法暗号の一種であり[1]以下の原理に従って動作する暗号化アルゴリズムである。

A 0 = A、
A A = 0,
A B = B A、
(A B) C = A (B C)、
(B A) A = B 0 = B

例えば、 は排他的論理和(XOR)演算を表します[2]この演算は、法2の加算(または減算、どちらも同じ)と呼ばれることもあります。[3]このロジックを用いると、与えられた鍵を用いて各文字にビット単位のXOR演算子を適用することで、テキスト文字列を暗号化できます。出力を復号するには、鍵を用いてXOR関数を再度適用するだけで暗号が解除されます。

文字列「Wiki」(8 ビットASCIIでは01010111 01101001 01101011 01101001)は、次のように繰り返しキー11110011を使用して暗号化できます。

01010111 01101001 01101011 01101001
11110011 11110011 11110011 11110011
10100100 10011010 10011000 10011010

逆に、復号化の場合は次のようになります。

10100100 10011010 10011000 10011010
11110011 11110011 11110011 11110011
01010111 01101001 01101011 01101001

使用とセキュリティ

XOR演算子は、より複雑な暗号の構成要素として非常に一般的に使用されています。単純なXOR暗号は、一定の繰り返しキーを使用するだけで、頻度分析によって簡単に解読できます。メッセージの内容が推測可能、あるいは何らかの方法で知られる場合、キーを推測することができます。XORの主なメリットは、実装が簡単で、XOR演算の計算コストが低いことです。そのため、単純な繰り返しXOR(つまり、データ全体に対するXOR演算に同じキーを使用する)暗号は、特別なセキュリティが要求されない場合に、情報を隠すために使用されることがあります。XOR暗号は、リバースエンジニアリングを困難にするために、コンピュータマルウェアでよく使用されます。

鍵がランダムで、少なくともメッセージと同じ長さであれば、XOR暗号はメッセージ内で鍵が重複している場合よりもはるかに安全です。[4]擬似乱数生成器によって鍵ストリームが生成されるストリーム暗号が生成されます。真にランダムな鍵の場合は理論上解読不可能なワンタイムパッドが生成されます。

これらの暗号のいずれにおいても、XOR演算子は既知平文攻撃に対して脆弱です。これは、平文 暗号文=鍵であるためです。また、暗号文を操作することで、復号された平文の任意のビットを反転させることも容易です。これは展性と呼ばれます。

暗号技術における有用性

XORが暗号学で非常に有用な主な理由は、それが「完全にバランスが取れている」ためです。つまり、与えられた平文入力が0または1の場合、暗号文の結果は、真にランダムなキービットに対して0または1のいずれかになる可能性が等しくなります。[5]

下の表は、平文と鍵ビットの4つの可能なペアをすべて示しています。鍵または平文について何も知らなければ、暗号文だけでは何も判断できないことは明らかです。[5]

XOR暗号トレーステーブル
平文暗号文
000
011
101
110

ANDORなどの他の論理演算には、このようなマッピングはありません。例えば、以下のANDの表を考えてみましょう。

AND暗号トレーステーブル
平文暗号文
000
010
100
111

暗号文が0の場合、平文も0である確率は2/3です。また、暗号文が1の場合、平文も1でなければなりません。これは、XORアプローチでは得られない、テキストに関する情報を明確に示しています。[a]

実装例

JavaScriptプログラミング言語を使用した例。[6]

function xor_Encrypt ( inputString , key ) { let encrypted_Hex = "" ; for ( let i = 0 ; i < inputString . length ; i ++ ) { const plain_string = inputString . charCodeAt ( i ); const key_Char = key . charCodeAt ( i % key . length ); const xor_Result = plain_string ^ key_Char ; // XOR 演算を実行します// XOR の結果を 2 桁の 16 進文字列に変換します// 1 桁の場合は '0' で埋めます (例: 5 -> "05") let hex = xor_Result . toString ( 16 ); if ( hex . length < 2 ) { hex = "0" + hex ; } encrypted_Hex += hex ; } return encrypted_Hex ; }                                                            function xorDecrypt ( hexInput , key ) { let decrypted_String = '' ; // ステップ 1: hexInput 文字列を配列に変換しますconst bytes = []; // 16 進文字列を 2 文字ずつ反復処理しますfor ( let i = 0 ; i < hexInput . length ; i += 2 ) { // 2 文字の 16 進部分文字列を取得します (例: "AB") const hexa_Byte = hexInput . slice ( i , i + 2 ); // 16 進部分文字列を整数に変換します (例: "AB" -> 171) bytes . push ( parseInt ( hexa_Byte , 16 )); } // ステップ 2: 各バイトをキーで XOR し、文字に戻しますfor ( let i = 0 ; i < bytes . length ; i ++ ) { const byte_Value = bytes [ i ]; const key_Char = key . charCodeAt ( i % key . length ); const xor_Result = byte_Value ^ key_Char ; // XOR 演算を実行します// XOR の結果を文字に変換しますdecrypted_String += String . fromCharCode ( xor_Result ); } return decrypted_String ; }                                                                           

Pythonプログラミング言語を使用した別の例[b]

osからurandomをインポート   def generate_key ( length : int ) -> bytes : """暗号化キーを生成します。""" return urandom ( length )       def xor_strings ( s , t ) -> bytes : """2つの文字列をXOR結合します。""" if isinstance ( s , str ): # テキスト文字列には単一の文字が含まれます。 return "" . join ( chr ( ord ( a ) ^ b ) for a , b in zip ( s , t )) . encode ( "utf8" ) else : # バイトオブジェクトには0~255の範囲の整数値が含まれます。return bytes ([ a ^ b for a , b in zip ( s , t )])                               message  =  "これは秘密のメッセージです" print ( "メッセージ:" ,  message )key  =  generate_key ( len ( message )) print ( "Key:" ,  key )cipherText  =  xor_strings ( message . encode ( "utf8 " ),  key ) print ( "cipherText: " ,  cipherText ) print ( "decrypted: " ,  xor_strings ( cipherText ,  key ) . decode ( "utf8 " ))# xor_strings ( cipherText , key ) . decode ( "utf8" ) == message の場合 print ( "Unit test passed" )の場合、 else の場合print ( "Unit test failed" )の場合を検証します。     

GCHQが Instagram に投稿したパズルに基づいた、Rプログラミング言語を使用した短い例です

secret_key <- c ( 0xc6 , 0xb5 , 0xca , 0x01 ) |> as.raw ()       secret_message <- "私はWikipedia <3" |> charToRaw () |> xor ( secret_key ) |> base64enc :: base64encode ()        secret_message_bytes <- secret_message |> base64enc :: base64decode () xor ( secret_message_bytes , secret_key ) |> rawToChar ()       

参照

参考文献

注記

  1. ^ AND演算から(暗号文の)出力ビットが0になる方法は3つあります平文=0、鍵=0、平文=0、鍵=1、平文=1、鍵=0です。したがって、暗号文のビットが0であることが分かっている場合、真にランダムな鍵であれば、平文のビットも0になる確率は2/3です。XOR演算の場合、方法は正確に2つあるため、確率は1/2です(つまり、確率は等しく、この情報から何も学ぶことはできません)。



  2. ^ これはRichter 2012に触発されたものである

引用

  1. ^ トゥッテ 1998、3ページ
  2. ^ ルーウィン 2012、14~19頁。
  3. ^ チャーチハウス 2002、11ページ
  4. ^ チャーチハウス 2002、68ページ
  5. ^ ab Paar & Pelzl 2009、32–34 ページ。
  6. ^ armasahar/XOR-Cipher、2025-09-26

出典

  • Budiman, MA; Tarigan, JT; Winata, AS (2020). 「ヴィジュネル暗号とXOR暗号を組み合わせたArduino UNOとAndroidベースのデジタルロック」. Journal of Physics: Conference Series . 1566 (1) 012074. IOP Publishing. Bibcode :2020JPhCS1566a2074B. doi : 10.1088/1742-6596/1566/1/012074 . ISSN  1742-6588.
  • チャーチハウス、ロバート(2002)、コードと暗号:ジュリアス・シーザー、エニグマ、そしてインターネット、ケンブリッジ:ケンブリッジ大学出版局、ISBN 978-0-521-00890-7
  • Garg, Satish Kumar (2017). 「XOR暗号を用いた暗号化」. Research Journal of Science and Technology . 9 (1). A and V Publications: 25. doi : 10.5958/2349-2988.2017.00004.3 . ISSN  0975-4393.
  • ゲーデル、クルト(1931年12月)。 「正式な数学と教育システム I を確立する」。Monatshefte für Mathematik und Physik (ドイツ語)。38 – 38 (1): 173 – 198。土井:10.1007/BF01700692。ISSN  0026-9255。S2CID  197663120。
  • Lewin, Michael (2012年6月). 「XORのすべて」. Overload . 2 ((109): 14–19 . 2021年8月29日閲覧.
  • パー、クリストフ、ペルツル、ヤン(2009年)『暗号を理解する:学生と実務家のための教科書』シュプリンガー、ISBN 978-3-642-04101-3. OCLC  567365751。
  • リヒター、ヴォルフガング(2012年8月3日)、「5分で解読不能な暗号」、クロスロード:学生向けACMマガジン、ACM(Association for Computing Machinery)
  • Tutte, WT (19 June 1998), Fish and I (PDF) 、 2020年2月7日時点のオリジナル(PDF)からアーカイブ、 2020年1月11日閲覧。ウォータールー大学におけるトゥット教授の講義の記録
「https://en.wikipedia.org/w/index.php?title=XOR_cipher&oldid=1314892414」より取得