私たちは日常生活の中で、暗号化アルゴリズムによく遭遇します。今日は、これらの暗号化アルゴリズムの Python 実装について説明します。一般的に使用される暗号化方法には基本的に対応する Python ライブラリがあるため、コードで特定のアルゴリズムを実装する必要は基本的になくなりました。 [[325194]] MD5暗号化 正式名称: MD5 メッセージ ダイジェスト アルゴリズム (英語: MD5 Message-Digest Algorithm)。情報伝送の整合性と一貫性を確保するために 128 ビット (16 バイト) のハッシュ値を生成できる、広く使用されている暗号化ハッシュ関数です。 md5 暗号化アルゴリズムは不可逆的であるため、復号化は通常、ブルート フォース方式と Web サイトのインターフェイスを通じて実行されます。 Python コード: - ハッシュライブラリをインポートする
- m = ハッシュライブラリ.md5()
- m.update (str.encode( "utf8" ))
- 印刷(m.hexdigest())
SHA1暗号化 正式名称: セキュア ハッシュ アルゴリズム。主に、デジタル署名標準 DSS で定義されているデジタル署名アルゴリズム DSA に適用されます。SHA1 は MD5 よりも安全です。長さが 2^64 ビット未満のメッセージの場合、SHA1 は 160 ビットのメッセージ ダイジェストを生成します。 Python コード: - ハッシュライブラリをインポートする
- sha1 = ハッシュライブラリ.sha1()
- データ = '2333333'
- sha1.update (data.encode( 'utf-8' ))
- sha1_data = sha1.hexdigest()
- 印刷(sha1_data)
HMAC暗号化 正式名称: ハッシュ メッセージ認証コード、HMAC 暗号化アルゴリズムは、暗号化ハッシュ関数と共有キーに基づく安全なメッセージ認証プロトコルです。実装の原則は、公開関数とキーを使用して固定長の値を認証識別子として生成し、この識別子を使用してメッセージの整合性を識別することです。 MAC と呼ばれるキーを使用して固定サイズの小さなデータ ブロックが生成され、メッセージに追加されて送信されます。受信者は、送信者と共有したキーを認証などの目的で使用します。 Python コード: - hmac をインポートする
- ハッシュライブラリをインポートする
- # 最初のパラメータはキー、2番目のパラメータは暗号化する文字列、3番目のパラメータはハッシュ関数です
- mac = hmac.new( 'キー' , 'hello' ,hashlib.md5)
- mac.digest() # 文字列のASCII形式
- mac.hexdigest() # 暗号化された文字列の16進形式
DES暗号化 正式名称: Data Encryption Standard。対称暗号化アルゴリズムです。 DES はブロック暗号化アルゴリズムです。一般的な DES は 64 ビット ブロックでデータを暗号化し、暗号化と復号化に同じアルゴリズムが使用されます。キーの長さは 56 ビットです (8 ビットごとにパリティ チェックが使用されるため)。キーは任意の 56 ビットの数値にすることができ、いつでも変更できます。 Python コード: - binascii をインポートする
- pyDesからdes、CBC、PAD_PKCS5 をインポート
- # pip install pyDes をインストールする必要があります
-
- des_encrypt(秘密鍵、s):
- iv = 秘密鍵
- k = des(secret_key、CBC、iv、pad=なし、padmode=PAD_PKCS5)
- en = k.encrypt(s, パッドモード=PAD_PKCS5)
- binascii.b2a_hex(en)を返します
-
- des_decrypt(秘密鍵、s):
- iv = 秘密鍵
- k = des(secret_key、CBC、iv、pad=なし、padmode=PAD_PKCS5)
- de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
- 戻る
-
- secret_str = des_encrypt( '12345678' , '愛してるよ〜' )
- 印刷(secret_str)
- clear_str = des_decrypt( '12345678' , secret_str)
- 印刷(clear_str)
AES暗号化 正式名称: Advanced Encryption Standard (英語: Advanced Encryption Standard) は、暗号学では Rijndael 暗号化とも呼ばれ、米国連邦政府が採用しているブロック暗号化標準です。この標準は、元の DES を置き換えるために使用され、多くの関係者によって分析され、世界中で広く使用されています。 Python コード: - base64をインポート
- Crypto.CipherからAESをインポート
-
- '' '
- AES対称暗号化アルゴリズム
- '' '
- # 入力する必要があります。str が 16 の倍数でない場合は、16 の倍数になるように入力します。
- def add_to_16(値):
- len(値) % 16 != 0 の場合:
- 値 += '\0'
- return str.encode(value) # バイトを返す
- # 暗号化方式
- def encrypt(キー、テキスト):
- aes = AES.new(add_to_16( key ), AES.MODE_ECB) # 暗号化器を初期化する
- encrypt_aes = aes.encrypt(add_to_16(text)) # まずaesで暗号化する
- encrypted_text = str(base64.encodebytes(encrypt_aes), encoding= 'utf-8' ) # 暗号化とトランスコードを実行してバイトを返します
- 暗号化されたテキストを返す
- # 復号方法
- def decrypt(キー、テキスト):
- aes = AES.new(add_to_16( key ), AES.MODE_ECB) # 暗号化器を初期化する
- base64_decrypted = base64.decodebytes(text.encode(encoding= 'utf-8' )) # まずbase64をバイトに復号化します
- decrypted_text = str(aes.decrypt(base64_decrypted), encoding= 'utf-8' ). replace ( '\0' , '' ) # 復号化とトランスコードを実行して str を返します
- 復号化されたテキストを返す
RSA暗号化 正式名称: Rivest-Shamir-Adleman、RSA 暗号化アルゴリズムは非対称暗号化アルゴリズムです。 RSA は公開鍵暗号や電子商取引で広く使用されています。これは、現在利用可能な公開鍵方式の中で、最も優れたものの 1 つであると一般に考えられています。 RSA は暗号化とデジタル署名の両方に使用できる最初のアルゴリズムであり、既知のすべての暗号化攻撃に対して耐性があります。 Python コード: - # -*- コーディング: UTF-8 -*-
- # 参照コード: https://www.jianshu.com/p/7a4645691c68
-
- base64をインポート
- rsa をインポートする
- rsaから共通をインポート
-
- # RSA 署名と暗号化および復号化には rsa ライブラリを使用します
- クラスRsaUtil(オブジェクト):
- PUBLIC_KEY_PATH = 'xxxxpublic_key.pem' # 公開鍵
- PRIVATE_KEY_PATH = 'xxxxxprivate_key.pem' # 秘密鍵
-
- #キーを初期化する
- デフ__init__(self,
- company_pub_file=PUBLIC_KEY_PATH、
- company_pri_file=PRIVATE_KEY_PATH):
-
- company_pub_fileの場合:
- self.company_public_key = rsa.PublicKey.load_pkcs1_openssl_pem( (company_pub_file)を開きます。読み取り())
- company_pri_fileの場合:
- self.company_private_key = rsa.PrivateKey.load_pkcs1( (company_pri_file)を開きます。読み取り())
-
- def get_max_length(self, rsa_key, encrypt= True ):
- 「暗号化されたコンテンツが長すぎる場合は、セグメントごとに暗号化し、各セグメントの長さを計算する必要があります。
- :param rsa_key: キー。
- :param encrypt: 暗号化するかどうか。
- 「」 「 」
- ブロックサイズ = common.byte_size(rsa_key.n)
- reserve_size = 11 # 予約領域は11です
- 暗号化しない場合: # 復号化時に予約ビットを考慮する必要はありません
- 予約サイズ = 0
- 最大長 = ブロックサイズ - 予約サイズ
- 最大長を返す
-
- # 支払者の公開鍵を暗号化する
- def encrypt_by_public_key(自分自身、メッセージ):
- "" "公開鍵暗号化を使用します。
- :param message: 暗号化するコンテンツ。
- 暗号化後、base64トランスコーディングに接続する必要があります
- 「」 「 」
- 暗号化結果 = b ''
- 最大長 = self.get_max_length(self.company_public_key)
- メッセージ:
- 入力 = メッセージ[:最大長]
- メッセージ = メッセージ[最大長:]
- 出力= rsa.encrypt(入力、self.company_public_key)
- encrypt_result +=出力
- encrypt_result = base64.b64encode(encrypt_result)
- encrypt_resultを返す
-
- decrypt_by_private_key(自分自身、メッセージ):
- "" "秘密鍵を使用して復号化します。
- :param message: 暗号化するコンテンツ。
- 復号化されたコンテンツはそのまま文字列となるため、エスケープする必要はありません。
- 「」 「 」
- 復号結果 = b ""
-
- max_length = self.get_max_length(self.company_private_key, False ) です。
- decrypt_message = base64.b64decode(メッセージ)
- decrypt_message 中:
- 入力 = decrypt_message[:最大長]
- decrypt_message = decrypt_message[最大長:]
- 出力= rsa.decrypt(入力、self.company_private_key)
- decrypt_result +=出力
- decrypt_resultを返す
-
- # 署名販売者秘密鍵Base64変換
- def sign_by_private_key(自己、データ):
- "" "秘密鍵の署名。
- :param data: 署名するコンテンツ。
- SHA-1を使用して署名(MD5も可能)
- 署名後、エスケープして出力する必要がある
- 「」 「 」
- 署名 = rsa.sign(str(data), priv_key=self.company_private_key, ハッシュ= 'SHA-1' )
- base64.b64encode(署名)を返す
-
- def verify_by_public_key(自己、メッセージ、署名):
- "" "公開鍵署名の検証。
- :param message: 署名検証の内容。
- :param signature: 検証コンテンツの署名の値 (署名後は b64 エンコードされるため、検証前にトランスコードする必要もあります)。
- 「」 「 」
- 署名 = base64.b64decode(署名)
- rsa.verify(メッセージ、署名、self.company_public_key)を返します。
ECC暗号化 正式名称: 楕円曲線暗号、ECC 暗号化アルゴリズムは、楕円曲線理論に基づく公開鍵暗号化技術です。暗号化、復号化、デジタル署名は、有限体上の楕円曲線の点によって形成されるアーベル群の離散対数の困難性を利用して実現されます。楕円曲線上の加算演算を離散対数上のモジュラー乗算演算と一致させることにより、楕円曲線に基づく対応する暗号システムを確立できます。 Python コード: - # -*- コーディング:utf-8 *-
- # 著者: DYBOY
- # 参照コード: https://blog.dyboy.cn/websecurity/121.html
- # 説明: ECC 楕円曲線暗号化アルゴリズムの実装
- 「」 「 」
- K=kGを考えます。ここで、KとGは楕円曲線Ep(a,b)上の点、nはGの位数(nG=O∞)、kはn未満の整数です。
- k と G が与えられれば、加法規則に従って K を計算するのは簡単です。しかし逆に言えば、K と G が与えられている場合、k を見つけるのは非常に困難です。
- 実際の使用では、ECC は一般に p と n をかなり大きく取るため、n 個の解ポイントを 1 つずつ計算して上記の表にリストすることは不可能です。
- これは楕円曲線暗号アルゴリズムの数学的基礎である。
- 点Gは基点と呼ばれます。
- k (k < n )は秘密鍵である
- Kは公開鍵(公開 鍵)
- 「」 「 」
-
- get_inverse(mu, p)を定義します。
- 「」 「 」
- yの負の要素を取得する
- 「」 「 」
- iが範囲(1, p)内にある場合:
- (i*mu)%p == 1の場合:
- 戻る
- -1を返す
-
- get_gcd(zi, mu)を定義します。
- 「」 「 」
- 最大公約数を求める
- 「」 「 」
- もしmu:
- get_gcd(mu, zi%mu)を返す
- それ以外:
- 戻るzi
-
- get_np(x1, y1, x2, y2, a, p)を定義します。
- 「」 「 」
- n*pを取得し、np=-pの順序が解決されるまで毎回pを追加します。
- 「」 「 」
- flag = 1 # 符号ビット (+/-) を定義します
-
- # p=q の場合、k=(3x2+a)/2y1mod p
- x1 == x2かつy1 == y2 の場合:
- zi = 3 * (x1 ** 2) + a # 分子を計算する [導関数]
- mu = 2 * y1 # 分母を計算する
-
- # P≠Qの場合、k=(y2-y1)/(x2-x1) mod p
- それ以外:
- zi = y2 - y1
- ミュー = x2 - x1
- zi*mu < 0の場合:
- flag = 0 # 記号 0 は - (負の数) です
- zi =腹筋(zi)
- ミュー =絶対値(ミュー)
-
- # 分子と分母を最も単純な形に減らす
- gcd_value = get_gcd(zi, mu) # 最大公約数
- zi = zi // gcd_value # 整数除算
- mu = mu // gcd_value
- # 分母の逆元を求める 逆元: ∀a∈G、∀b∈G で、ab = ba = e となるもの
- # P(x,y)の負の要素は(x,-y mod p) = (x,py)なので、P+(-P) = O∞
- 逆数 = get_inverse(mu, p)
- k = (zi * 逆数)
-
- フラグ == 0 の場合: # 傾きが負の場合 フラグ == 0
- キロ = -キロ
- k = k % p
- # x3,y3 P+Q を計算する
- 「」 「 」
- x3≡k2-x1-x2(pを法として)
- y3≡k(x1-x3)-y1(pを法として)
- 「」 「 」
- x3 = (k ** 2 - x1 - x2) % p
- y3 = (k * (x1 - x3) - y1) % p
- x3,y3を返す
-
- get_rank(x0, y0, a, b, p)を定義します。
- 「」 「 」
- 楕円曲線の順序を取得する
- 「」 「 」
- x1 = x0 #-pのx座標
- y1 = (-1*y0)%p #-pのy座標
- 温度X = x0
- 温度Y = y0
- 1 の場合
- 真の場合:
- 1 + = 1
- # p+q の合計を求め、n*p を取得し、順序が見つかるまで続けます
- p_x、p_y = get_np(tempX、tempY、x0、y0、a、p)
- # == -pの場合、順序は+1となり、戻ります
- p_x == x1かつp_y == y1 の場合:
- n+1を返す
- tempX = p_x
- 温度Y = p_y
-
- get_param(x0, a, b, p)を定義します。
- 「」 「 」
- pと-pを計算する
- 「」 「 」
- y0 = -1
- iが範囲内(p)の場合:
- # モジュラス制約を満たす、楕円曲線 Ep(a,b)、p は素数、x、y∈[0,p-1]
- i**2%p == (x0**3 + a*x0 + b)%pの場合:
- y0 = 私
- 壊す
-
- # y0が存在しない場合はfalseを返す
- y0 == -1の場合:
- 戻る 間違い
-
- # -y(負の係数)を計算する
- x1 = x0
- y1 = (-1*y0) % p
- x0,y0,x1,y1を返す
-
- get_graph(a, b, p)を定義します。
- 「」 「 」
- 楕円曲線散布図を出力する
- 「」 「 」
- _y = []
- # 2次元配列を初期化する
- iが範囲内(p)の場合:
- x_y.append([ '-' iが範囲内(p)])
-
- iが範囲内(p)の場合:
- val = get_param(i, a, b, p) # 楕円曲線上の点
- if(val != False ):
- x0,y0,x1,y1 = 値
- _y[x0][y0] = 1
- x_y[x1][y1] = 1
-
- print( "楕円曲線のハッシュグラフは次のとおりです:" )
- i が範囲(p)内にある場合: # i = 0-> p-1
- temp = p-1-i # 逆順
-
- # 1/2桁、y軸をフォーマットして出力します
- 温度>= 10 の場合:
- print( temp , end = " " )
- それ以外:
- print( temp , end = " " )
-
- # 特定の座標の値を1行で出力します
- jが範囲(p)内にある場合:
- print(x_y[j][ temp ], end = " " )
- print( "" ) #改行
-
- # 出力x軸
- print( " " , end = "" )を出力します。
- iが範囲内(p)の場合:
- i >=10の場合:
- print(i, end = " " )
- それ以外:
- print(i, end = " " )
- 印刷( '\n' )
-
- get_ng(G_x, G_y,キー, a, p)を定義します。
- 「」 「 」
- nGを計算する
- 「」 「 」
- temp_x = G_x
- temp_y = G_y
- キー!= 1の場合:
- temp_x、temp_y = get_np(temp_x、temp_y、G_x、G_y、a、p)
- キー-= 1
- temp_x、temp_yを返す
-
- ecc_main() を定義します:
- 真の場合:
- a = int (input( "楕円曲線パラメータ a (a>0) の値を入力してください : " ))
- b = int (input( "楕円曲線パラメータ b (b>0) の値を入力してください : " ))
- p = int (input( "楕円曲線パラメータ p の値を入力してください (p は素数です): " )) # モジュラー演算に使用されます
-
- # 条件を満たしました
- (4*(a**3)+27*(b**2))%p == 0の場合:
- print( "入力したパラメータが正しくありません。再入力してください!!!\n" )
- それ以外:
- 壊す
-
- # 楕円曲線散布図を出力する
- get_graph(a, b, p)
-
- # Gスポットとなるポイントを選択
- print( "user1: 上記の座標系で G の値を持つ座標を選択してください" )
- G_x = int (input( "user1: 選択したx座標値を入力してください: " ))
- G_y = int (input( "user1: 選択したy座標値を入力してください: " ))
-
- # 楕円曲線の順序を取得する
- n = get_rank(G_x, G_y, a, b, p)
-
- # user1は秘密鍵、小さな鍵を生成する
- key = int (input( "user1: 秘密鍵を入力してください (<{}):" .format(n)))
-
- # user1 は公開鍵、大きなKEYを生成します
- KEY_x、kEY_y = get_ng(G_x、G_y、キー、a、p)
-
- # ユーザー2 ステージ
- # ユーザー2はユーザー1の公開鍵KEY 、Ep(a,b)の順序nを取得し、暗号化する平文データを暗号化する
- # 暗号化の準備
- k = int (input( "user2: kG と kQ を見つけるには整数 k (<{}) を入力してください: " .format(n)))
- k_G_x、k_G_y = get_ng(G_x、G_y、k、a、p) # kG
- k_Q_x、k_Q_y = get_ng(KEY_x、kEY_y、k、a、p) # kQ
-
- # 暗号化
- plain_text = input( "user2: 暗号化する文字列を入力してください: " )
- プレーンテキスト = プレーンテキスト.strip()
- #plain_text = int (input( "user1: 暗号化する暗号文を入力してください: " ))
- c = []
- print( "暗号文は: " , end = "" )
- のために 文字 プレーンテキストの場合:
- intchar = ord( char )
- 暗号テキスト = intchar*k_Q_x
- c.append([k_G_x, k_G_y, 暗号テキスト])
- print( "({},{}),{}" .format(k_G_x, k_G_y, cipher_text), end = "-" )
-
-
- # ユーザー1 ステージ
- # user2 によって暗号化されたデータを取得して復号化する
- # k_G_x、k_G_y がわかれば、キーケースの k_Q_x、k_Q_y を簡単に解くことができ、したがって plain_text = cipher_text/k_Q_x となります。
- print( "\nuser1 がプレーンテキストを復号しました: " , end = "" )
- cのcharArrの場合:
- decrypto_text_x、decrypto_text_y = get_ng(charArr[0]、charArr[1]、キー、a、p)
- print(chr(charArr[2]//decrypto_text_x), end = "" )
-
- __name__ == "__main__"の場合:
- print( "****************ECC 楕円曲線暗号化****************" )
- ecc_main()
この記事では主に、MD5、SHA-1、HMAC、DES/AES、RSA、ECC などのいくつかの暗号化アルゴリズムと Python コードの例を紹介します。本日の内容は以上です。気に入っていただければ幸いです。 |