【セキュリティー】公開鍵暗号方式|基本情報技術者 科目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. 鍵の対称性の欠如:公開鍵暗号方式では、公開鍵と秘密鍵が異なる鍵です。つまり、公開鍵で暗号化すると、対応する秘密鍵でのみ復号することができます。この特性により、公開鍵は安全に共有することができます。

公開鍵暗号方式は、セキュアな通信やデータの機密性を確保するために広く使用されています。また、公開鍵暗号方式はデジタル署名や鍵交換などのセキュリティプロトコルにも応用されています。

代表的な公開鍵暗号アルゴリズムには、RSA(Rivest-Shamir-Adleman)、Diffie-Hellman、Elliptic Curve Cryptography(ECC)などがあります。これらのアルゴリズムは、暗号化と復号の効率性やセキュリティレベルなどに異なる特性を持っています。

 

 

 

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

実装例は下記です。

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

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

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

 

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

<実装例>

import java.security.*;
import javax.crypto.Cipher;

public class Main{
    public static void main(String[] args) throws Exception {
        // 鍵ペアの生成
        KeyPair keyPair = generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // メッセージの暗号化
        String plainText = "Hello, World!";
        byte[] encryptedBytes = encrypt(plainText, publicKey);

        // メッセージの復号
        String decryptedText = decrypt(encryptedBytes, privateKey);

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

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

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

    // メッセージの復号
    public static String decrypt(byte[] encryptedBytes, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }

    // バイト配列を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以外にも対応しています。他の言語で試しても動かすことができます。

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