0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonプログラムで作る 暗号的な特殊時計

Posted at

理想の暗号を考える:簡単で解読しにくい「コロンブスの卵」

暗号解読を試みる人々は、どんな手段を使っても解を求めます。そして、残念ながら裏切り者が存在する可能性も否定できません。このため、「絶対」や「完全」といったセキュリティは存在しないと考えています。

では、理想的な暗号とは何でしょうか?
私が考える理想は、プログラムが簡単でありながら解読がしにくいものです。シンプルさと堅牢さが両立した暗号こそが、現実的で効果的な選択ではないでしょうか。

そのために、私は「コロンブスの卵」のような発想が鍵だと考えます。見過ごされがちな視点や、一見すると単純な仕組みが、結果として非常に高い防御力を持つ暗号を生み出すのではないかと期待しています。

暗号的な特殊時計を考える:2001年1月1日を基準に

「時計」といえば、時間を単純に知らせる道具ですが、もし暗号のような複雑な形式で時間を表示する時計があったらどうでしょう?
今回はその発想の第一歩として、PCの時間を読み込み、7つの変数に分解して組み合わせる時計を考案しました。この仕組みは、通常の時間を計算や変換を通じて全く新しい形で表現することを目指したものです。

各OSの基準時間と暗号化の類似性

基準時間の違い

各OSやシステムは、それぞれ異なる基準時間(エポック)を持っています。この基準時間をもとに現在時刻を計算するため、基準が異なるだけでシステム間の時間表現が大きく異なります。以下は、代表的なOSの基準時間です:

  • Windows: 基準は1601年1月1日(100ナノ秒単位)。
  • Unix/Linux: 基準は1970年1月1日(秒単位、いわゆるUnixエポック)。
  • macOS: 基準は1904年1月1日(古いバージョン)。

暗号化との類似性

基準時間が異なると、同じ現在時刻であっても異なる数値や表現になります。この現象は、プログラム的に見ると暗号化に近い性質を持っています。たとえば:

  • あるシステムでは「2025年1月1日」を「4536278400秒」として記録し、別のシステムでは「136805年」として解釈する場合があります。
  • このような基準時間の差異は、外部から見て解読するにはその基準を知る必要があるため、暗号化された情報を解読するプロセスに類似しています。

2001年1月1日を基準とした理由

今回の時計では、人間にとって直感的に理解しやすい基準日として2001年1月1日を選びました。この日は21世紀の始まりとして象徴的であり、区切りの良い日付として親しみやすいものです。
プログラム的には、基準時間を2001年1月1日に設定することで、他のOSの基準時間との差異が一種の暗号的な性質を持つことになります。


詳細な仕組みと解読の考え方

この時計は、PCの現在時刻を基準に、計算や変換を通じて得られる7つの変数を用いて時間を暗号的に表示します。しかし、単純に「暗号化された時間」として終わるのではなく、特定の解読キーを用いることで、元の時間や意味を再構築できるように設計されています。


解読キーの仕組み

この時計では、時間を計算する際の基準や変換式を解読キーとして渡すことで、他の人やシステムが簡単に元の時間を再現できる仕組みを取り入れています。

解読キーの例

解読キーには、以下の情報が含まれます:

  1. 基準日: 2001年1月1日
    時間を計算する際の基準として、この日付が必要です。
  2. 変換ルール: 各変数(dayhmsなど)の計算式
    例: 「1日を480ブロック(3分単位)に分割」「15秒刻みでさらに詳細化」などのルール。
  3. 時間フォーマット: 元の時間の形式(例: YYYY-MM-DD HH:MM:SS

解読プロセス

相手に解読キーを渡すことで、以下の手順で元の時間を簡単に再構築できます:

  1. 各変数を元の形式に逆変換:
    例: hmから時間と分を計算、sで秒を補完する。
  2. 基準日を元に日時を計算:
    2001年1月1日を基準に、moから年月を、dayから日付を求めます。
  3. 結果を組み合わせて元の時間を再現

解読キーの活用シナリオ

この仕組みは以下のようなシナリオで有効に機能します:

  1. 安全な時間共有:
    時間情報を「暗号化された形式」で送信し、解読キーを共有することで、安全に時間を復元できます。

  2. アクセス制限:
    解読キーを持つ特定の人だけが、暗号化された時間情報を理解できるようにする仕組みです。

  3. データ同期:
    異なるシステムやタイムゾーン間での時間同期に利用。基準日や計算式をキーとして共有することで、異なるOS間の時間同期も実現可能です。


今回の基準について

今回、2001年1月1日を基準日として選びました。この日は、21世紀の始まりとして象徴的であり、人々にとって分かりやすい節目となる日付です。
基準日を固定することで、解読キーを共有する際もシンプルで分かりやすくなります。


解読の容易さとセキュリティの両立

この時計は、「解読キーがあると簡単に元の時間を復元できる」一方で、解読キーがない場合には暗号化されたデータとして意味を持たない仕組みです。
基準日や計算式をシンプルにすることで、実用性と暗号的な要素の両方をバランス良く取り入れました。


この仕組みは、暗号的な時計を作るだけでなく、時間データの安全なやり取りや新たな時間表示のデザインにも応用できます。解読キーを通じたシンプルな再現性を持ちながら、時間を新しい視点で楽しむことができる時計の基盤として機能することを目指しています。

メインプログラム

from datetime import datetime

def convert_timestamp(timestamp):
    """
    タイムスタンプから必要な変数を計算する関数。

    Args:
        timestamp (str): 現在の時刻(YYYY-MM-DD HH:MM:SS形式)。

    Returns:
        dict: 変換された値を含む辞書。
    """
    try:
        dt = datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S")

        # 1. day: 3月1日から数えて何日目か
        start_of_year = datetime(dt.year, 3, 1)
        if dt.month < 3:  # 年をまたぐ場合の調整
            start_of_year = datetime(dt.year - 1, 3, 1)
        day = (dt - start_of_year).days 

        # 2. hm: 1日を3分刻みで数値化
        minutes_in_day = dt.hour * 60 + dt.minute
        hm = minutes_in_day // 3

        # 3. s: 3分以下を秒数で数値化する
        s = minutes_in_day % 3 * 60 + dt.second

        # 4. mo: 2001年1月から何か月経過したか
        mo = (dt.year - 2001) * 12 + dt.month - 1

        # 5. h: 毎月1日午前0時から2時間ごとでどれだけ経過したか
        start_of_month = datetime(dt.year, dt.month, 1)
        hours_since_start_of_month = (dt - start_of_month).total_seconds() // (2 * 3600)
        h = int(hours_since_start_of_month)

        # 6. mi: 現在時刻からhを引いた値を15秒単位で計算
        current_seconds = dt.hour * 3600 + dt.minute * 60 + dt.second  # 現在時刻を秒に変換
        remaining_seconds = current_seconds % 7200  # 7200秒(2時間)で割った余り
        mi = remaining_seconds // 15  # 15秒で割った値

        # 7. ss: 15秒を0.05ms単位で分割した数字
        ss = int((remaining_seconds % 15) / 0.05)

        # 結果を辞書で返す
        return {
            "day": day,
            "hm": hm,
            "s": s,
            "mo": mo,
            "h": h,
            "mi": mi,
            "ss": ss
        }

    except Exception as e:
        print(f"Error converting timestamp: {e}")
        return {}

def main():
    print("タイムスタンプ変換プログラム")
    print("========================")
    
    # PCの現在時刻を自動的に取得
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"現在時刻を使用します: {timestamp}")
    
    try:
        result = convert_timestamp(timestamp)
        print("\n変換結果:")
        for key, value in result.items():
            print(f"{key}: {value}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    main()

最後に

大したことはしていませんが、今回のアイデアや試みが、何かの参考になればと思い投稿しました。
時間の表示や暗号化に関する新しい視点を共有できたら嬉しいです。
もしご意見や改良案があれば、ぜひコメントいただけると幸いです!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?