Pythonの暗号化方法の概要

基本的なリテラシー

対称暗号化

対称鍵暗号化は、また、秘密鍵暗号として知られています。暗号化データと秘密の鍵によって送信され、受信者情報。最大の利点は、データの暗号化、大量のための高速暗号化と復号化速度であり、対称暗号鍵配布および管理の欠点は、あなたのメッセージは、問題の手を必要と復号化するための鍵を送信するためにどのように他の言葉で、あります。キーを送信するプロセスでは、鍵がハッカーによって傍受されるの大きなリスクがあります。現実には実際にはその後、彼を必要とするために渡された非対称暗号化のための対称暗号鍵です。

非対称暗号化

非対称暗号化システムは、また、公開鍵暗号として知られています。非対称暗号化は、データの暗号化および復号化のための非常に安全な方法を提供します。彼女は鍵のペア、公開鍵と秘密鍵を使用しています。民間警備の一方の当事者だけの保管が存在することができ、それは妥協することはできない、と公開鍵は彼女のために尋ねた誰に配布することができます。暗号化の鍵を使用して、この非対称暗号化では、別のキーながら、それが取る解読しました。銀行はあなたのメッセージを復号化することができます - たとえば、あなたが銀行に公開鍵を要求することを銀行に行く、銀行はあなたに公開鍵を送信します、あなたはメッセージ、秘密鍵だけホルダーを暗号化するために、公開鍵を使用しています。そして、対称暗号化と相違は、銀行は、プライベートネットワークを介して送信される必要がありません。したがって、セキュリティが大幅に向上します。最も一般的に使用される非対称暗号化アルゴリズムはRSAアルゴリズムです。公開鍵と柔軟性が、暗号化と復号化は、はるかに遅い対称鍵暗号よりも高速化します。公開鍵と柔軟性が、暗号化と復号化の速度は、暗号化の山よりもはるかに遅いです。

1)アリスは、ブラウザが最初の対称鍵として乱数を生成し、銀行のウェブサイトで契約を行う必要があります。
(2)アリスのブラウザは、銀行のウェブサイトに公開鍵を要求します。
(3)銀行は、アリスに公開鍵を送信します。
(4)銀行自身の公開鍵対称鍵暗号化を使用してアリスのブラウザ。
(5)アリスのブラウザでは、銀行への暗号化対称鍵を送信します。
(6)銀行は、対称鍵アリスブラウザを解読するための秘密鍵を使用して得られました。
(7)アリスと銀行は、通信の内容を暗号化及び復号化するための対称鍵を使用することができます。

概要
暗号化と復号化鍵を使用して(1)対称暗号化は非常に速く、同じですが、理由は主要なネットワーク伝送する必要のため、セキュリティは高くありません。
(2)非対称暗号は、鍵、公開鍵と秘密鍵のペアを使用する安全なので、しかし遅い暗号化と復号化。
(3)溶液を暗号化するために、非対称暗号化公開鍵を用いて対称暗号鍵であり、その後送信、受信者が取得した対称暗号化キーを解読するための秘密鍵を使用して、2つの側面は、対称暗号化を使用して通信することができます。 。

pythonの暗号化された注意事項

私たちは、暗号化について話している、それが私たちのバイトで、Pythonのに相当する、バイナリコード化された形式が暗号化されています。

だから我々は、Pythonで暗号化操作を実行すると、それ以外の場合はエラーになり、私たちの事業はバイトであることを確実にするために。

バイト文字列との相互変換をコードすることができる()及びデコード()メソッド。

Base64で

BASE64は64の任意のバイナリデータによって表される文字です。

Base64エンコーディングは、暗号化の礎を呼び出すことができます。任意のバイナリデータをBase64エンコードされますすることができます。すべてのデータはテキストファイルとしてエンコードすることができ、唯一の65文字を表現することができます。(65の文字:A〜Z〜Z 0〜9 + / =)4/3前のデータを符号化され=〜符号化データ、約1/3が大きくなります。

原則

1.将所有字符转化为ASCII码。
2.将ASCII码转化为8位二进制 。
3.将二进制3个归成一组(不足3个在后边补0)24位,再拆分成4组,每组6位。
4.统一在6位二进制前补两个0凑足8位。
5.将补0后的二进制转为十进制。
6.从Base64编码表获取十进制对应的Base64编码。

説明

  1. バッファへのデータの3つのバイトは、24ビット、上位バイトを占有する最初のを持って変換。
  2. 不十分なデータの3Byte目ワードは、バッファ内のゼロでビットを残り。次いで、6「ビットを取って、それぞれの場合に、選択されたルックアップテーブルに従って符号化された出力として文字に対応する値を選択します。
  3. 入力データ変換のすべてが完了するまで継続します。
  4. 最後に残った2つのデータ入力、符号化された追加の結果であれば、「=」を
  5. もし最後の残りの1つの入力データ、符号化結果プラス2「=」。
  6. あなたが任意のデータを休まない場合、我々はデータ削減の正当性を確保することができますので、私たちは、何も追加しないでください。

Base64で暗号化と復号化

注:
1. Aをbase64エンコードのいずれか含まれているASCII文字またはバイナリデータ
2.base64対称暗号化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import base64

s = 'hello, world'
s = "你好"
# 加密
bs = base64.b64encode(s.encode("utf8"))
print(bs)

# 解密
decode = base64.b64decode(bs)
print(decode)
print(decode.decode("utf8"))

MD5

メッセージダイジェストアルゴリズム5(情報 - ダイジェストアルゴリズムを)。多くの場合、「MD5暗号化」と言う、メッセージダイジェストアルゴリズムです。

MD5、実際には、アルゴリズム。あなたは、文字列、またはファイル、または圧縮され、MD5を実行した後、文字列の128ビットの固定長を生成することができますであってもよいです。この文字列は、実質的にユニークです。

説明

  • 圧縮率:任意のデータ長は、MD5値の計算された長さが固定されています。
  • 容易に計算:MD5の値を容易に元のデータから計算されます。
  • 抗修正可能:元のデータへの変更は、偶数のみバイト修正場合、得られたMD5の値が非常に異なっています。
  • アンチコリジョンストロング:(すなわち、データを改ざんさ)知られ、元のデータとそのMD5値、データを検索するには、同じMD5値を持つことは非常に困難です。
  • 不可逆性:誰もがこの人を見、あなたが彼の指紋やその他の情報、および対応のみを得ることができますが、指紋を見て、別の指紋を持って、参照するか、人の外見や身元を読み取ることは不可能ですその他の情報。

MD5の暗号化と復号化

MD5用のpython3モジュールが除去されるように、モジュールのpython3のhashlib動作はMD5を行います

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import hashlib

# 待加密信息
str = '这是一个测试'

# 创建md5对象
hl = hashlib.md5()

# 此处必须声明encode
# 若写法为hl.update(str)  报错为: Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))

print('MD5加密前为 :' + str)
print('MD5加密后为 :' + hl.hexdigest())

出力

MD5加密前为 :这是一个测试
MD5加密后为 :cfca700b9e09cf664f3ae80733274d9f

MD5の長さは、デフォルト128は0と1のバイナリ列である、128ビットです。このような表現は非常に友好的です。それは、それぞれが4ビット16進数、16進数にそれほど4分の1​​28 = 32、32ビットを表し、バイナリ進数になりました。

なぜオンライン16のMD5それがあるのですか?

実際には、16ビット長、32ビット値MD5から。図32は、得られた8を除去した後、除去フロント8つのMD5です。

OF

はじめにPyCrypto

Pythonの暗号でPyCryptoは、最も有名なサードパーティ製のパッケージで提供多くの使用暗号化アルゴリズム。残念ながら、2012年にその開発作業は停止していました。

幸い、PyCryptoを置き換えるプロジェクトの分岐PyCrytodomeがあります。

インストールとインポート

インストールする前にMicrosoftのVisual C ++ 2015をインストールする必要があります。

Linuxのインストールでは、次のピップコマンドを使用することができます。

pip install pycryptodome

インポート:

import Crypto

Windowsシステムのインストールでは若干異なります。

pip install pycryptodomex

インポート:

import Cryptodome

DESはじめに

DESアルゴリズムは、対称暗号暗号であり、また、米国のデータ暗号化規格として知られています。
DESは、データパケットを暗号化するブロック暗号化アルゴリズム、典型的な64ビットDES、同じアルゴリズムを使用して、暗号化と復号化です。
キー、データ、モード:入口DESアルゴリズムは3つのパラメータがあります。キー7項56バイトの合計は、ワーク鍵は、DESアルゴリズムである;データ8 64バイト、データを暗号化又は復号化されるべきであり、モードDESとして働く二つがある:暗号化または復号化。
64ビットの鍵長、キー56は、実際にはDES操作に関与している(8,16,24,32,40,48,56,64最初のビットは、各キーが奇数であるように、パリティビットです)ビット又は代替交換暗号文グループを形成する方法でグループ化され、そして56ビットの平文キー群。

暗号化の原理

DESは64ビットの最大パケットサイズを生成するために、56ビットのキーとさらに8つのパリティビットを使用します。これは半分にフェイステルと呼ばれる技術であって、前記暗号化されたテキストブロックを使用して、反復ブロック暗号です。サブキー半周期関数を用いて、その後他の半分、「排他的OR」演算を出力する、2つの半分を交換し、このプロセスは、最後の交換サイクルを続けるが、ません。DESは、排他的論理和、交換、置換、四つの基本的な算術シフト演算を使用して、16サイクルを使用します。

アルゴリズムステップ

1)初期転置

その機能は、ビット単位の組み合わせ、再64ビットの入力データブロックであり、出力をL0、R0二つの部分に分割され、それぞれ長さ32ビットの各部分、第一入力トランスデューサへの最初の58のためにどの置換規則、最初の50は、最初の2つの変更し......というように、最後のものは、元の7日です。L0、R0は、転置後の2つの部分の出力であり、L0は左から32ビット出力、右32ビットR0であり、例えば、次のとおり入力トランスデューサはD1D2D3の前に設けられている...... D64、初期転置の結果は後: L0 = D58D50 ...... D8; R0 = D57D49 ...... D7。
その交換用のルールは、以下:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4、
62,54,46,38,30,22 、14,6,64,56,48,40,32,24,16,8、
57,49,41,33,25,17,9,1,59,51,43,35,27,19,11 3、
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7、

2)逆置換

16回の反復後、L16を得た、R16、この入力として、逆置換、逆置換は、暗号文出力を得ることが、最初の順列のちょうど逆です。
このアルゴリズムは、対称暗号化アルゴリズムで広くコンピュータネットワークシステムで使用される代表的なシステムです。

DESの暗号化と復号化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入DES模块
from Cryptodome.Cipher import DES
import binascii

# 这是密钥
key = b'abcdefgh'
# 需要去生成一个DES对象
des = DES.new(key, DES.MODE_ECB)
# 需要加密的数据
text = 'python spider!'
text = text + (8 - (len(text) % 8)) * '='

# 加密的过程
encrypto_text = des.encrypt(text.encode())
encrypto_text = binascii.b2a_hex(encrypto_text)
print(encrypto_text)

3DES

3DES(又はトリプルDESとも呼ばれる)一般的な用語トリプルデータ暗号化アルゴリズム(TDEA、トリプルデータ暗号化アルゴリズム)ブロック暗号です。これは、トリプルDES暗号化アルゴリズムは、各データ・ブロックに適用されるに相当します。

強化コンピューティングパワーのためには、オリジナルのDESパスワードキーの長さは、ブルートフォースに対して脆弱になります。DES鍵の長さを増加させるのではなく、新しいブロック暗号アルゴリズムを設計することで同様の攻撃を防ぐために、比較的簡単な方法、すなわち、提供するように設計されている3DES。

3DES、AES(すなわち、トリプルDES)暗号化アルゴリズムDES遷移(指定された遷移として1999年に、NIST意志3DES暗号化標準)、暗号化アルゴリズム、特定の実装を次のようにレッツエックは()とDkの()DESアルゴリズムの代わりに暗号化および復号化プロセス、鍵代表を用いK DESアルゴリズム、M平文のために、C暗号文のため、その結果:

3DES暗号化プロセスである:C = EK3(DK2(EK1(M)))

3DES復号プロセスである:M = DK1(EK2(DK3©))

AES

また、Rijndaelの暗号で暗号、米国連邦政府によって採用されたブロック暗号化規格として知られている、のAdvanced Encryption Standard(AES:英語:高度暗号化標準、略語)。この規格は、オリジナルのDESを置き換えるために使用され、それが広く分析し、マルチ世界中で使用されています。5年間の選定プロセスの後、2001年11月26日に高度暗号化標準は、FIPS PUBの197で標準技術の米国国立研究所(NIST)によって発行され、そして、2002年5月26日効果的な標準規格となりました。2006年には、高度暗号化標準は、最も人気のある対称鍵暗号化アルゴリズムの一つとなっています。

AESの暗号化と復号化は比較的実装し、簡単に言えば、すぐにソフトウェアやハードウェアでも、非常に少ないメモリを必要とすることができます。新暗号規格として、現在のアプリケーションの広い範囲に展開されています。

機能

  1. すべての既知の攻撃に耐性。
  2. 複数のプラットフォーム上のスピード、コンパクトなコーディング。
  3. シンプルなデザイン。

AES暗号化と復号化

AESは、ブロック暗号であり、ブロック暗号は、グループに平文のセット、それぞれ同じ長さ、各時間平文の完全な暗号化するまで暗号化されたデータの集合です。AES標準仕様では、唯一のパケット長、すなわち、各パケットは16バイト(バイト当たり8ビット)であり、128ビットです。鍵の長さは128ビット、192ビットまたは256ビットを使用することができます。キーの異なる長さは、異なるラウンドをお勧めします暗号化されています。

128は、一般的に使用されます

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from Cryptodome.Cipher import AES
from Cryptodome import Random

from binascii import a2b_hex

# 要加密的明文
data = '南来北往'
# 密钥key必须为 16(AES-128), 24(AES-192), 32(AES-256)
key = b'this is a 16 key'
# 生成长度等于AES 块大小的不可重复的密钥向量
iv = Random.new().read(AES.block_size)
print(iv)
# 使用 key 和iv 初始化AES 对象, 使用MODE_CFB模式
mycipher = AES.new(key, AES.MODE_CFB, iv)
print(mycipher)
# 加密的明文长度必须为16的倍数, 如果长度不为16的倍数, 则需要补足为16的倍数
# 将iv(密钥向量)加到加密的密钥开头, 一起传输
ciptext = iv + mycipher.encrypt(data.encode())
# 解密的话需要用key 和iv 生成的AES对象
print(ciptext)
mydecrypt = AES.new(key, AES.MODE_CFB, ciptext[:16])
# 使用新生成的AES 对象, 将加密的密钥解密
decrytext = mydecrypt.decrypt(ciptext[16:])

print(decrytext.decode())

RSA

RSAの暗号化アルゴリズムは、非対称暗号化アルゴリズムです。公開鍵暗号化と電子商取引ではRSAが広く用いられています。

アルゴリズムは非常に単純な算術事実に基づいています:二つの大きな素数を乗算することは非常に簡単ですが、その後、彼らの製品の因数分解したい、それが公開された公開暗号化キーの製品として使用することができますので、非常に困難であり、二つの大きなプライム合成秘密鍵しばらくの配列。公開鍵は、秘密鍵が復号のために、すべての彼だった、使用するすべての人の解放のために利用可能です。

非対称暗号化

典型的なRSAなどとOpenSSLを使用して一般的な方法、同様に、公開鍵と秘密鍵のペアを生成するために他のツールをkeytools、公開鍵を用いて暗号化されたデータは、秘密鍵を用いて復号化することができ、逆もまた同様(秘密鍵データを知ることができます復号鍵)。

実際の使用では、秘密鍵は、一般的に出版社の手の中に保持され、パブリックにプライベート開かれていない、唯一の公開鍵は、方法は、データを復号化するための秘密鍵の唯一のホルダーを達成することができ、発表しました。キーは、それが渡されることはありません解読するため、この暗号化安全率はそれほど傍受された転写プロセスにおけるキーの危険がない、非常に高く、クラックの暗号文は、ほとんど不可能です。

しかし、アルゴリズムの効率が低いが、それは一般的にデータの暗号化に使用されている重要であり、そして多くの場合、対称暗号鍵を暗号化するために、対称、非対称暗号鍵を用いて。

RSAの暗号化と復号化

まず、モジュールのRSAをインストールする必要があります。

pip install rsa

INT()を使用する必要があるので、RSA暗号化アルゴリズムは、RSA公開鍵と秘密鍵の特性は、小数が、進形式で格納され、多くの場合、公開鍵の値であるため、さらに、小数10に変換されます。フォーマット。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import rsa
import binascii

# 使用网页中获得的n和e值,将明文加密
def rsa_encrypt(rsa_n, rsa_e, message):
    # 用n值和e值生成公钥
    key = rsa.PublicKey(rsa_n, rsa_e)
    # 用公钥把明文加密
    message = rsa.encrypt(message.encode(), key)
    # 转化成常用的可读性高的十六进制
    message = binascii.b2a_hex(message)
    # 将加密结果转化回字符串并返回
    return message.decode()

# RSA的公钥有两个值n和e,我们在网站中获得的公钥一般就是这样的两个值。
# n常常为长度为256的十六进制字符串
# e常常为十六进制‘10001’
pubkey_n = '8d7e6949d411ce14d7d233d7160f5b2cc753930caba4d5ad24f923a505253b9c39b09a059732250e56c594d735077cfcb0c3508e9f544f101bdf7e97fe1b0d97f273468264b8b24caaa2a90cd9708a417c51cf8ba35444d37c514a0490441a773ccb121034f29748763c6c4f76eb0303559c57071fd89234d140c8bb965f9725'
pubkey_e = '10001'
# 需要将十六进制转换成十进制
rsa_n = int(pubkey_n, 16)
rsa_e = int(pubkey_e, 16)
# 要加密的明文
message = '南北今天很忙'

print("公钥n值长度:", len(pubkey_n))
print(rsa_encrypt(rsa_n, rsa_e, message))

結果:

公钥n值长度: 256
480f302eed822c8250256511ddeb017fcb28949cc05739ae66440eecc4ab76e7a7b2f1df398aefdfef2b9bfce6d6152bf6cc1552a0ed8bebee9e094a7ce9a52622487a6412632144787aa81f6ec9b96be95890c4c28a31b3e8d9ea430080d79297c5d75cd11df04df6e71b237511164399d72ccb2f4c34022b1ea7b76189a56e
公開された706元の記事 ウォンの賞賛737 ビュー102万+

おすすめ

転載: blog.csdn.net/sinat_38682860/article/details/104030117