【セキュリティー】共通鍵暗号方式|基本情報技術者 科目B対策

 

2023年4月から基本情報技術者の試験制度が変更されたものの科目B(旧:午後問題)の重要さは変わりません。

出題方式は「多肢選択式」で以前と同じですが、データ構造及びアルゴリズムが8割、情報セキュリティが2割の割合で出題される点が大きく変わっています。

合格基準点は600点以上/1000点満点中、つまり6割以上取れれば合格になります。

そんな科目Bの情報セキュリティについて、基本となる暗号化の問題について考えてみましょう。

 

 

目次

 

 

情報セキュリティとは??

情報セキュリティは、コンピュータシステムやネットワーク上の情報やデータを不正アクセス、改ざん、漏洩、破壊などから保護するための対策や手段のことを指します。情報セキュリティは、情報の機密性(confidentiality)、完全性(integrity)、可用性(availability)を確保することを目指します。

機密性(confidentiality)は、情報が不正なアクセスから保護され、許可されていない者には読み取りが困難であることを意味します。機密情報は、個人情報、経済的な取引データ、企業の秘密、政府の機密情報など、外部の目に触れるべきではない情報を含みます。

完全性(integrity)は、情報が意図しない変更や改ざんから保護され、正確かつ信頼性のある状態を維持することを意味します。情報の完全性が保たれることで、データの正当性や信頼性が確保されます。

可用性(availability)は、情報が必要な時に利用可能であることを意味します。情報システムやネットワークの可用性を確保することで、サービスの中断やシステムの停止を最小限に抑えることができます。

情報セキュリティの目的は、情報資産の保護、機密性の確保、データの完全性と信頼性の確保、システムの可用性の確保です。情報セキュリティの実現には、セキュリティポリシーの策定、アクセス制御、暗号化、脆弱性管理、インシデント対応、教育・訓練など、様々な技術や手法が利用されます。

情報セキュリティは、個人のプライバシー保護や金融機関のデータ保護、組織の業務継続性、国家の国家安全保障など、多くの領域で重要な役割を果たしています。また、情報セキュリティは絶えず進化し続ける領域であり、新たな脅威や攻撃手法に対応するために、常に最新の技術と対策が求められます。

 

 

 

暗号化とは??

暗号化は、データや情報を不正アクセスや盗聴から保護するために、読み取りや理解が困難な形式に変換するプロセスです。暗号化では、元のデータ(プレーンテキストまたはクリアテキストと呼ばれます)を特定の方法で変換して、暗号文(または暗号化されたテキスト)と呼ばれる形式に変換します。この暗号文は、権限を持つ受信者以外には意味を持たないようになっています。

暗号化の目的は、機密性(confidentiality)を確保することです。機密性は、データや情報が不正なアクセスから保護され、許可されていない者には読み取りが困難であることを意味します。暗号化を使用することで、データを保管、送信、共有する際にセキュリティを確保できます。

暗号化では、特定のアルゴリズム(暗号アルゴリズム)が使用されます。暗号アルゴリズムは、データを暗号化するための数学的な手法や手順のセットです。一般的な暗号アルゴリズムには、対称鍵暗号方式(共通鍵暗号方式)と公開鍵暗号方式(非対称鍵暗号方式)の2つの主要なカテゴリがあります。

 

共通鍵暗号方式

送信者と受信者が同じ鍵を使用して暗号化と復号を行います。鍵の管理と配布が重要です。代表的な対称鍵暗号方式には、AES (Advanced Encryption Standard) やDES (Data Encryption Standard) があります。

 

公開鍵暗号方式

送信者と受信者が異なる鍵のペアを使用します。公開鍵は一般に公開され、秘密鍵は受信者のみが保持します。公開鍵で暗号化されたデータは、秘密鍵でのみ復号することができます。代表的な公開鍵暗号方式には、RSAECC (Elliptic Curve Cryptography) があります。

 

暗号化は、情報セキュリティの重要な要素であり、個人のプライバシーや機密データの保護、セキュアな通信やデータの安全な保存など、さまざまな応用分野で利用されています。

 

 

 

共通鍵暗号方式とは??

共通鍵暗号方式(または対称鍵暗号方式)は、暗号化および復号に同じ鍵(共通鍵)を使用する暗号方式です。送信者と受信者が同じ鍵を共有することで、暗号化されたデータを送信して受信者がそれを復号することができます。

共通鍵暗号方式では、データの暗号化と復号に同じ鍵が使用されるため、高速な処理が可能です。一般的に、共通鍵暗号方式は以下の手順で動作します。

  1.  送信者と受信者が共有の鍵を確立します。この鍵は機密性が保たれなければなりません。
  2. 送信者は、暗号化したいデータ(プレーンテキスト)と共通鍵を使用して暗号化アルゴリズムを適用します。これにより、暗号文が生成されます。
  3. 送信者は、生成された暗号文を通信経路を介して受信者に送信します。
  4. 受信者は、受信した暗号文と共通鍵を使用して復号アルゴリズムを適用します。これにより、元のプレーンテキストが再び復号されます。

共通鍵暗号方式の例として、DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、Blowfish、IDEA(International Data Encryption Algorithm)などがあります。これらのアルゴリズムは、データの機密性を保護するために広く使用されています。

共通鍵暗号方式の利点は高速な暗号化・復号処理、シンプルな実装、効率的な鍵の管理です。ただし、共通鍵を安全に共有する必要があります。鍵を安全に伝達する手段や鍵管理プロトコルが重要であり、そのセキュリティが確保されなければなりません。また、共通鍵暗号方式では、鍵を共有するために信頼できるセキュアなチャネルが必要です。

 

 

 

 

 

共通鍵暗号方式の実装例(プログラム/Java

実装例は下記です。

Web上で実際にプログラムを動かすことができるサイトがあります。

色々プログラムをいじってみましょう!

Online PHP/Java/C++... editor and compiler | paiza.IO

 

Java共通鍵暗号方式(AES)を使用してテキストの暗号化と復号を行う簡単な例です。

<実装例>

import javax.crypto.*;
import java.util.Base64;

public class Main{

    public static void main(String[] args) throws Exception {
        // 共通鍵生成
        SecretKey secretKey = generateKey();

        // 暗号化
        String plainText = "Hello, World!";
        String encryptedText = encrypt(plainText, secretKey);
        System.out.println("暗号文: " + encryptedText);

        // 復号
        String decryptedText = decrypt(encryptedText, secretKey);
        System.out.println("復号結果: " + decryptedText);
    }

    // 共通鍵生成
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 鍵の長さを指定(128ビット)
        return keyGen.generateKey();
    }

    // 暗号化
    public static String encrypt(String plainText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 復号
    public static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }
}

 

 

 

まとめ

基本的には、共通鍵暗号方式がどんなものか・暗号化、復号化手順を理解していれば基本情報技術者試験では問題ありません。

ただ、SEやプログラマとしてもやっていきたいということだったり、興味のある方はプログラムを少しいじってみてください!触ってみることで定着もしやすくなると思っています!

 

情報セキュリティ分野はほとんど暗記ですが、体を使って覚えていきましょう!!

Online PHP/Java/C++... editor and compiler | paiza.IO

 

こちらのサイトはjava以外にも対応しています。他の言語で試しても動かすことができます。

アルゴリズムと言われると難しく感じる方もいるかもしれません。ただ、順を追っていけばそこまで難しい話ではないです。まずは触ってみて動きを見てみてはいかがでしょうか。