【セキュリティー】ハイブリッド方式|基本情報技術者 科目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. 受信者と送信者は、共通鍵を使用して通信内容を暗号化および復号化する。

 

ハイブリッド暗号方式による暗号化では、公開鍵暗号方式を使用して共通鍵を安全に送信するため、安全な鍵共有が実現されます。そして、共通鍵暗号方式を使用することで高速な暗号化と復号化が実現されます。

ハイブリッド暗号方式は、一般的にインターネット上でのセキュアな通信やデータの保護に使用されます。例えば、SSL/TLSプロトコルで使用される暗号化手法や、メールの暗号化にもハイブリッド暗号方式が採用されています。

 

 

ハイブリッド暗号方式の実装例(プログラム/Java

実装例は下記です。

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

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

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

 

以下に、Javaでハイブリッド暗号方式を実現するための簡単な例を示します。

<実装例>

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;

public class Main{

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

        // 公開鍵と秘密鍵の生成
        KeyPair keyPair = generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // メッセージの暗号化
        String plainText = "Hello, World!";
        byte[] encryptedKey = encryptKey(secretKey, publicKey);
        byte[] encryptedText = encryptText(plainText, secretKey);

        // メッセージの復号
        SecretKey decryptedKey = decryptKey(encryptedKey, privateKey);
        String decryptedText = decryptText(encryptedText, decryptedKey);

        System.out.println("暗号化前のメッセージ: " + plainText);
        System.out.println("暗号化後のメッセージ: " + bytesToHex(encryptedText));
        System.out.println("復号後のメッセージ: " + decryptedText);
    }

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

    // 公開鍵と秘密鍵の生成
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048); // 鍵の長さを指定(2048ビット)
        return keyGen.generateKeyPair();
    }

    // 共通鍵の暗号化
    public static byte[] encryptKey(SecretKey secretKey, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(secretKey.getEncoded());
    }

    // 共通鍵の復号
    public static SecretKey decryptKey(byte[] encryptedKey, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedKeyBytes = cipher.doFinal(encryptedKey);
        return new SecretKeySpec(decryptedKeyBytes, "AES");
    }

    // メッセージの暗号化
    public static byte[] encryptText(String plainText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(plainText.getBytes());
    }

    // メッセージの復号
    public static String decryptText(byte[] encryptedText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedTextBytes = cipher.doFinal(encryptedText);
        return new String(decryptedTextBytes);
    }

    // バイト配列を16進数文字列に変換する
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
}

 

 

 

まとめ

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

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

 

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

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

 

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

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