見出し画像

暗号化と復号のテクニックを解明しようパート1(Deciphering the Technique of Encryption and Decryption Part I)

暗号化と復号化に興味をお持ちでしょうか。私自身、この分野に大いなる興味を抱き、プロジェクトにおいても暗号化と復号化を活用するため勉強しています。様々な情報源から学びながら、今回の記事の内容は Raspberry Pi Foundation から提供される「Introduction to Encryption and Cryptography」という無料のオンラインコースからの知識に基づいて執筆しました。記事の末尾にはコースのリンクを共有しておりますので、興味をお持ちの方はぜひご覧いただき、受講してみてください。

それでは始めましょう。

質問: なぜプログラマーは自然が好きじゃないか知っていますか?🤨
回答: それにはバグが多すぎるからです!😅

まずはキーワードを理解しましょう。
暗号化 (Encryption)
暗号化は、データを不正なアクセスから保護するために平文を暗号文に変換するプロセスです。アルゴリズムと鍵を使用してデータを複合できない形式に変えます。

復号化 (Decryption)
復号化は暗号化の逆のプロセスです。暗号文を平文に戻すことで、データを読み取り可能な形式に変換します。

平文 (Plaintext)
平文は元の暗号化されていないデータまたはメッセージです。これは暗号化前の情報の読み取り可能で理解できる形式です。

暗号文 (Ciphertext)
暗号文は平文を暗号化した結果です。データの暗号化された、読み取り不可能な形式で、復号化なしに読み取ることはできません。

暗号 (Cipher)
暗号は暗号化と復号化のために使用される特定のアルゴリズムまたは方法です。データが平文から暗号文に、逆に暗号文から平文にどのように変換されるかを定義します。

鍵 (Key)
鍵は暗号化アルゴリズムが変換を行うために使用する秘密のパラメータです。対称暗号化では、同じ鍵が暗号化と復号化の両方に使用されます。

鍵生成 (Key Generation)
鍵生成は暗号化のために安全な鍵を作成するプロセスです。強力でランダムな鍵は効果的な暗号化とセキュリティに不可欠です。

暗号アルゴリズム (Encryption Algorithm)
暗号アルゴリズムは暗号化のために使用されるルールと手順のセットです。平文が暗号文に変換される方法を指定し、暗号と鍵の選択によって定義されます。

復号アルゴリズム (Decryption Algorithm)
復号アルゴリズムは暗号アルゴリズムの対応物です。同じ鍵と暗号で暗号文が平文に変換される方法を指定します。

対称暗号 (Symmetric Encryption)
対称暗号、または秘密鍵暗号、は暗号化と復号化の両方に同じ鍵が使用される暗号化の種類です。

非対称暗号 (Asymmetric Encryption)
非対称暗号、または公開鍵暗号、は公開鍵と秘密鍵のペアを使用します。一方の鍵で暗号化されたデータは、もう一方の鍵でのみ復号化できます。安全な鍵交換に使用されます。

暗号解読 (Cryptanalysis)
暗号解読は、鍵なしで暗号化されたデータを解読する方法の研究です。暗号の解析と破壊に関わります。

暗号技術 (Cryptographic Techniques)
暗号技術はデータと通信を保護するために使用されるすべての方法とプラクティスを包括します。これらの技術には暗号化アルゴリズム、デジタル署名、鍵管理などが含まれます。



次のテップとして、シーザー暗号(Caesar Cipher)について紹介いたします。
シーザー暗号(Caesar cipher)は、最も古くてシンプルな暗号の一つです。この暗号は、ローマの将軍で政治家であるユリウス・シーザー(Julius Caesar)にちなんで名付けられ、彼が機密のメッセージを保護するためにこの方法を使用したとされています。シーザー暗号は、代替暗号(substitution cipher)の一種で、平文の各文字をアルファベットの中で固定された数だけ下方または上方にシフトさせる方法です。

動作方法は以下の通りです:

  1. 鍵(Key):シーザー暗号の鍵は、各文字がシフトする固定の数です。アルファベットには26文字あるので、鍵は1から25までの任意の整数であることができます。

  2. 暗号化(Encryption):メッセージを暗号化する際、平文の各文字を鍵の値だけアルファベットの中で下方にシフトさせます。例えば、鍵が3の場合、 'A' は 'D' に、 'B' は 'E' になります。全体の平文メッセージはこの方法でエンコードされます。

  3. 復号化(Decryption):メッセージを復号化する際、単純に暗号文の各文字を同じ鍵の値だけアルファベットの中で上方にシフトさせることで、元の平文が明らかになります。

シーザー暗号は歴史的な暗号テクニックであり、非常に単純です。しかし、現代の暗号化と比べてセキュリティを提供するには不十分であり、総当たり攻撃や頻度分析に対して脆弱です。データセキュリティのためにはより複雑な暗号化方法が現代の暗号学で使用されています。


それではC++でシーザー暗号を使用して暗号化と復号化する簡単なプログラムを作ってみましょう。

 #include  <iostream>
 #include  <string>

using namespace std;

// シーザー暗号でメッセージを暗号化する関数
string encryptCaesarCipher(string message, int shift) 
{
    string encryptedMessage = "";
    
    for (char character : message) 
    {
        // アルファベット文字であるかを確認
        if (isalpha(character)) 
        {
            // 大文字か小文字かによってベースを設定
            char base = (isupper(character)) ? 'A' : 'a';
            // 文字を暗号化し、暗号化メッセージに追加
            encryptedMessage += static_cast<char>((character - base + shift) % 26 + base);
        } 
        else 
        {
            // アルファベットでない場合、そのまま追加
            encryptedMessage += character;
        }
    }
    
    return encryptedMessage;
}

// シーザー暗号で暗号化されたメッセージを復号化する関数
string decryptCaesarCipher(string encryptedMessage, int shift)
{
    string decryptedMessage = "";
    
    for (char character : encryptedMessage) 
    {
        // アルファベット文字であるかを確認
        if (isalpha(character)) {
            // 大文字か小文字かによってベースを設定
            char base = (isupper(character)) ? 'A' : 'a';
            // 文字を復号化し、復号化メッセージに追加
            decryptedMessage += static_cast<char>((character - base - shift + 26) % 26 + base);
        } 
        else 
        {
            // アルファベットでない場合、そのまま追加
            decryptedMessage += character;
        }
    }
    
    return decryptedMessage;
}

int main() 
{
    string plainText,cipherText;
    char eOrd;
    int shift,key;

    // 暗号化または復号化を選択
    cout<<"暗号化または復号化しますか。"<<endl<<"暗号化の場合は 'e'、復号化の場合は 'd' を入力してください:";
    cin>>eOrd;

    if('e'==eOrd || 'E'==eOrd)
    {
      // 暗号化の場合
      cout << "暗号化するメッセージを入力してください:";
      cin>> plainText;

      cout << "シーザー暗号のシフト値を入力してください:";
      cin >> shift;

     string encryptedMessage = encryptCaesarCipher(plainText, shift);

     cout << "暗号化されたメッセージ: " << encryptedMessage << endl;
    }
    else if('d'==eOrd || 'D'==eOrd)
    {
      // 復号化の場合
      cout << "復号化する暗号文を入力してください:";
      cin>> cipherText;

      cout << "鍵の値を入力してください:";
      cin >> key;
      string decryptedMessage = decryptCaesarCipher(cipherText, key);

      cout << "復号化されたメッセージ: " << decryptedMessage << endl;
    }
    else
    {
        cout<<"無効な入力です。'e' または 'd' を入力してください。";
    }

    return 0;
}

プログラムの説明 : 
シーザー暗号を使用してメッセージを暗号化および復号化する機能が提供されています。ユーザーに暗号化('e')または復号化('d')の選択を求めます。 'e' が選択された場合、ユーザーにメッセージとシーザー暗号のシフト値を入力するように促します。選択されたシフト値に基づいてメッセージ内の各文字をシフトする encryptCaesarCipher 関数を呼び出し、メッセージを効果的に暗号化します。暗号化されたメッセージがユーザーに表示されます。一方、 'd' が選択された場合、ユーザーに暗号文と鍵の値を入力するように促します。その後、 decryptCaesarCipher 関数を呼び出し、元のメッセージを表示するために暗号化プロセスを逆転させます。復号化されたメッセージが表示されます。無効な入力が提供された場合、ユーザーに通知します。
シーザー暗号はシフト値を決めれば平文を暗号化ができ、鍵を分かれば暗号文を復号化することが出来ると結論出来ます。シーザー暗号は面白かったでしょうか。次の記事にはもっと複雑なヴィジュネール暗号(The Vigenère Cipher)を紹介致しますので是非お読みいただければ嬉しいです。

                                                 エンジニアファーストの会社 株式会社CRE-CO
                             su_myat_phyu


参考
RaspberryPiFoundation: Introduction to Encryption and Cryptography
https://www.edx.org/learn/computer-programming/raspberry-pi-foundation-introduction-to-encryption-and-cryptography

この記事が気に入ったらサポートをしてみませんか?