暗号の原理簡単入門 (1): 簡単な例から暗号化と復号化を理解する

暗号学は、情報を秘密裏に送信する方法を研究するものです。

1. いくつかの基本概念: 元のテキスト、暗号文、暗号化、復号化、アルゴリズム、キー

次のような簡単な例を考えてみましょう。

「i love you」という一連の情報を送信したいのですが、他人の盗聴を防ぐために、この一連の情報を「j mpwf zpv」として暗号化できます。 

その場合、「i love you」は元のテキストと呼ばれ、「j mpwf zpv」は暗号文と呼ばれます。

暗号化方法は次のとおりです。文字は英小文字のみで、各文字の値は 1 ずつ増加し (つまり、次の文字になります)、スペース文字は変更されません。つまり、i + 1 = j、v + 1 = w ...

この暗号化方法は関数として数学的に表現されます: f(x) = x + k (x は元の文字、現在の k = 1)

暗号化関数は暗号化アルゴリズムと呼ばれます。 

このkの値をキー(key)と呼ぶ。現在の k 値は 1 です。さまざまな状況に適応するために、k の値は可変であり、任意の数にすることができます。

情報を受け取る人が暗号化アルゴリズムと鍵を知っている場合。その後、文字列を復号化できます。

復号化関数は暗号化関数の逆関数です: f2(y) = y - k (y は暗号文文字、現在の k = 1)

次に: j - 1 = i、w - 1 = v の場合、暗号文「j mpwf zpv」は「i love you」と翻訳されます。

「i love you」という情報列が2人目に渡された場合、暗号化アルゴリズムは変更されず、鍵が2に変更され、暗号文は「k nqxg aqw」になります。   

通常、暗号化および復号化のアルゴリズムは変更されず、キーは頻繁に変更されます。

上記の例では、暗号化プロセスで使用されるキーの値は、復号化で使用されるキーの値と同じです。この暗号化アルゴリズムは対称アルゴリズムと呼ばれます。もちろん、暗号化キーと復号化キーが異なるアルゴリズム(非対称アルゴリズムと呼ばれます)もあります。

暗号化アルゴリズムに対応する復号化アルゴリズムがない場合、このアルゴリズムは一方向暗号化と呼ばれる不可逆暗号化アルゴリズムになります。つまり、元のテキストを暗号文に変換することしかできませんが、暗号文は元のテキストになることはできません。最も一般的に使用される不可逆暗号化アルゴリズムは MD5 です。

一方向暗号化アルゴリズムは主に検証と署名に使用されます。例: Linux システムのログイン パスワードは一方向暗号化で保存されており、ユーザーが入力したログイン パスワードが正しければ、暗号化されたパスワードは保存されている暗号文と同じになり、ユーザーの認証とログインは成功します。たとえ盗聴者がシステム内のログインパスワードの暗号文を盗んでも、元のパスワードを取得することはできません。誰かが暗号文を変更した場合、検証が失敗するため、暗号文が変更されたことがわかります。

情報システムの設計では、パスワードは一方向の暗号化を使用してデータベースに保存する必要があります。そうしないと、漏洩が非常に簡単になります。しかし、残念なことに、市場には元のパスワードをデータベースに書き込むシステムが多数存在しており、システム管理者がデータベースを開いた場合、全員のパスワードを閲覧できてしまいます。多くの人が同じパスワードを使用して異なるシステムにログインすることが多いためです。他の人の共通パスワードを知っている場合は、他の人のシステムのパスワードも知っていることがよくあります。したがって、インターネット上でシステムを登録する際には、通常のパスワードを使用してはなりません。

2. 暗号文の解読、セキュリティアルゴリズム、セキュリティの概念

  この式を見てください: Secret = f ( raw, key)

Secret は暗号文、f は暗号化関数、raw は元のテキスト、key はキーです。

盗聴者は暗号文を聞くことができます。

盗聴者が暗号化アルゴリズムとキーを知らない場合、復号して元のテキストを取得することは多くの場合困難です。

盗聴者が暗号化アルゴリズムを知っていてもキーを知らなかった場合、元のテキストを入手(解読)できるでしょうか?

これは、暗号化アルゴリズムのセキュリティとキーの長さによって異なります。

上記の単純な暗号化アルゴリズムは f(x) = x + k であり、クラッキング方法も単純です。 

暗号化アルゴリズムがわかっているので、k の値が 0、1、2、3、... であると仮定し、考えられるすべてのキーの値を計算して、出力が意味のある単語であるかどうかを確認し、そうであれば k の値 (上記の例では 1) を取得し、暗号文が解読されます。

パスワードを 1 つずつクラッキングする方法は、ブルート フォース クラッキングと呼ばれます。

アルゴリズムに欠陥がある場合は、少数のパスワードを戦略的に試行することで解読できることがよくあります。

上記の単純な暗号化アルゴリズム f(x) = x + k は、ブルート フォース手法を使用して数十のパスワードを解読します。クラッキング時間は 1 ミリ秒未満であり、計算コストは​​基本的にゼロです。この暗号化アルゴリズムは安全ではありません。

セキュリティアルゴリズムとは何ですか? セキュリティアルゴリズムの対策は、暗号化と復号化のアルゴリズムが公開されており、盗聴者が鍵を知らなければ、盗聴者は膨大な計算リソースを使ってアルゴリズムを解読できないというものです。

何が安全ですか?セキュリティは相対的なものです。

経済的な観点から見ると、クラッキングのコストがクラッキングの利益よりも大きい場合は安全です。

 数学的に言えば、数学関数で構築されたほぼすべてのアルゴリズムは解読可能ですが、一部の数学関数の計算は大きすぎます。現在の計算能力では 1 億年かかる可能性があります。その時間が実現不可能な場合でも、アルゴリズムは安全です。ただし、コンピューターの計算能力が 100 億倍に向上した場合、解読には 3 日しかかからず、このアルゴリズムは再び安全ではなくなります。

セキュリティアルゴリズムはハイレベルのデジタルサイエンティストによって提案されることが多く、長年にわたる国家認定を経て社会全体に公開されます。

1977 年に、米国国家標準局は DES セキュリティ アルゴリズムを発表しました。これは対称アルゴリズムであり、当時は安全なアルゴリズムでした。計算能力の進歩に伴い、現時点では安全なアルゴリズムではなくなりました。2001 年に、米国は DES に代わる AES セキュリティ アルゴリズムを発表しました。今でも最も人気のある対称アルゴリズムの 1 つです。

1983 年、3 人の MIT 教授によって発明された RSA アルゴリズムが米国で特許を申請しました。それ以来、RSA はインターネット上で最も広く使用され、最もよく知られた非対称アルゴリズムになりました。RSA アルゴリズムは、主要な Web サイトやブラウザーで使用されています。今日、私たちは多数の Web サイトで使用されている https プロトコルを訪問しますが、その多くは RSA アルゴリズムを使用しています。

RSA 512 ビット キーは安全ではないと考えられており、768 ビット キーは NSA 以外からは安全であると主張されていますが、RSA 1024 ビット キーであっても必ずしも安全であるとは限りません。RSA1024 ビットは、私の国のセキュリティ暗号部門によって放棄されました。

現在普及している暗号化アルゴリズムのほとんどは米国によって提案されています。

ただし、暗号化アルゴリズムは国家安全保障に関連しています。

中国国家暗号局は近年、一連の国内暗号アルゴリズムを特定しており、公開されているアルゴリズムには SM2、SM3、SM4、SM9 が含まれます。   

SM2 は、RSA を置き換えることができる非対称アルゴリズムです。   

SM3 は、MD5 を置き換えることができる不可逆的なアルゴリズムです。 

SM4 は、AES を置き換えることができる対称アルゴリズムです。 

SM9 は 2016 年にリリースされた非対称アルゴリズムであり、RSA を置き換えることができます。

数学的暗号化アルゴリズムは可逆性があるため、その安全性は計算能力に依存します。スーパーコンピューターや量子コンピューターに直面すると、計算能力が何百億倍にも増加すると、安全なアルゴリズムは存在しません。数学的ではない、より高度なアルゴリズムはありますか? 現在検討されている方向性の 1 つは、量子セキュリティ (後で紹介する数学に基づいていないアルゴリズム) です。

3. Python プログラミングを使用して、最も単純な暗号化と復号化のアルゴリズムとクラッキング プロセスをデモンストレーションします。

Python を使用して、上記の例の単純な暗号化と復号化を実装し、遊んでみましょう。

# 加解密原理: 简单的对称加密演示


def validate(n):
    # 当n值超出字符'a'到'z'的范围,则修正它
    while n < ord('a'):
        n = n + 26
    while n > ord('z'):
        n = n - 26
    return n


# 加密函数
def encrypt(raw, key):
    """ 加密 """
    secret = ''
    for c in raw:
        # 跳过空格
        if c == ' ':
            secret += c
            continue
        # 加密算法: 字符值 + key
        n = ord(c) + key
        n = validate(n)  # 修正超出范围的字符
        secret += chr(n)
    return secret


# 解密函数
def decrypt(secret, key):
    """ 解密 """
    raw = ''
    for c in secret:
        # 跳过空格
        if c == ' ':
            raw += c
            continue
        # 解密算法: 字符值 - key
        n = ord(c) - key
        n = validate(n)  # 修正超出范围的字符
        raw += chr(n)
    return raw


# 破解函数,在已知原文及对应密文的情况下,计算密钥
def crack(raw, secret):
    """ 破解 """
    r1 = raw[0]  # 取原文第一个字符
    s1 = secret[0]  # 取密文的第一个字符

    key = 0
    while 0 <= key < 10000:  # 逐个尝试密码:0到10000
        n = ord(r1) + key  # 加密字符 r1
        n = validate(n)  # 修正超出范围的字符
        if chr(n) == s1:  # 如果与密文相同
            return key
        key = key + 1


# 主程序如下:

key = 1  # 密钥

raw = 'i love you'  # 原文

secret = encrypt(raw, key)  # 使用加密函数、密钥,得到密文

restore = decrypt(secret, key)  # 使用解密函数、密钥,得到原文

print('原文     =  ', raw)
print('密文     =  ', secret)
print('解密后原文=  ', restore)

print('破解得到的密钥  = ', crack(raw, secret))  # 使用破解函数,得到密钥

ソース プログラムには完全に注釈が付けられており、Python を学習する学生は自分でプレイできます。

プログラム実行結果

原文     =   i love you
密文     =   j mpwf zpv
解密后原文=   i love you
破解得到的密钥  =  1

おすすめ

転載: blog.csdn.net/c80486/article/details/131819713