Pythonの暗号化アルゴリズムとその関連モジュール(hashlib、RSA、ランダムな文字列、数学)を学べます。

暗号化アルゴリズムの紹介

A、HASH

  ハッシュは、一般に「ハッシュ」を行うために、翻訳、また、出力に固定長変換、ハッシュアルゴリズムを介して(また、プレマッピングと呼ばれる、プレ画像)は、任意の長さの入力であり、「ハッシュ」、直接音訳を有します出力はハッシュ値です。この変換は、圧縮マップであり、すなわち、空間ハッシュ値は、典型的には、入力空間よりもはるかに小さい、異なる入力が同じ出力にハッシュ、一意のハッシュ値から入力値を決定することは不可能であることができます。

  また、関数により得られるハッシュアルゴリズムとして知られているダイジェストアルゴリズムは、任意のデータ長が固定長データ列、使用されるデータ列を16進表現に変換されます。ダイジェストアルゴリズムは、あなたが困難な非常に好きである抗ダイジェストアルゴリズムをプッシュする場合、簡単な計算、一方向関数ですが、元のデータの変更のビットを行う場合は、完全に異なるダイジェスト計算につながる、私たちはしばしば要約を使用します比較データが変更され、暗号化されているか否かパスワード。

  単にメッセージの圧縮関数に任意の長さAのメッセージは、固定長のダイジェストことを意味します。

  HASHは、主に情報セキュリティの暗号化アルゴリズムの分野で使用されている、彼は情報の一部を入れて、128ビットエンコーディング厄介者と呼ばれるHASH値の異なる長さに変換されても言うことができ、ハッシュは、アドレスの間で保存されたデータ内容やデータを見つけることですマッピング関係

二、MD5

2.1 MD5アルゴリズムは何ですか

  MD5メッセージダイジェストアルゴリズム(英語:MD5メッセージダイジェストアルゴリズム)を使用広くヘテロパスワードハッシュ関数は、完全かつ一貫性を保証するために128ビットのハッシュ値(ハッシュ値)、情報伝送を生成することができます。MD5の前身は、MD2、MD3とMD4を持っていました。

2.2 MD5機能

  任意の長さの入力情報、処理後、情報(デジタル指紋)の出力128、
  異なる入力(一意)で得られた異なる結果。

2.3 MD5アルゴリズムの特徴

  1. 圧縮率:任意のデータ長、MD5値の長さが固定されて算出されます
  2. 容易に計算:MD5の値を容易に元のデータから計算されます
  3. アンチ変更:変更を加えるために、元のデータは、バイトMD5世代間の差の値が大きいだろう変更します
  4. 強力な衝突防止:オリジナルデータと知られているMD5、(すなわち、データを偽造)のデータを検索するには、同じMD5値を持つことは非常に困難です。

2.4 MD5アルゴリズム可逆的かどうか?

MD5は、元の情報の一部は、の計算中に失われ、ハッシュアルゴリズムを使用して、ハッシュ関数で不可逆的な理由です。

2.5 MD5を使用します

 

  1.改ざんを防止します:

    ①こうした送信する前に、電子文書を送信するよう、私はMD5出力aを取得してみましょう。その後、他方によって受信された電子文書の後、もう一方の側は、出力BのMD5でした。aとbが改ざんされていない真ん中に代わって同じである場合。

    ②例えば、私は犯罪者は、インストーラにトロイの木馬を追加しないようにするために、私は、サイト上のインストールファイルからMD5の出力結果を発表することができ、ファイルのダウンロードを提供します。

    変更されたファイルをチェックアウトした後に検出されたか否か③SVNは、また、MD5を使用します。

  2.直視プレーンテキストを防ぐには:

  MD5値のデータベースに格納されたユーザパスワードは、ユーザーのパスワードに格納されている今、多くのウェブサイト。だから、犯罪者は、データベースのユーザのパスワードMD5値を取得し、あなたがユーザーのパスワードを知ることができない場合でも。(例えば、ユーザのパスワードにUNIXシステムでは、格納された暗号化により)、MD5(または他の同様のアルゴリズムである。、システムは、ファイルシステムにユーザーが入力したパスワードMD5値を算出し、行くと保存するときにユーザーがログインしますMD5ファイルシステム内の値と比較して、正しいパスワードが入力されているかどうかを判断している。このステップでは、システムがユーザのパスワード場合の符号を知らないが、ユーザの正当性がシステムにログインして決定することができます。これは、ユーザーが保存されますだけでなく、パスワードは知っているが、またある程度までも危険にさらされているパスワードの難易度を高めるために、システム管理者権限を持つユーザーです。)

 

  否認(デジタル署名)を防止するために3:

    これは、サードパーティの認証機関が必要です。認証機関などの書かれた文書では、MD5アルゴリズムを使用して、この文書の要約情報を生成し、記録を作成します。A後でこの文書は彼によって書かれていないと言うなら、当局はこのファイル必要なサマリ情報と同じです冊子要約内の情報と比較するレコードを再生成し、それが書かれたA.であることが判明しました これは、いわゆる「デジタル署名」です。

三、SHA-1

  ハッシュアルゴリズム(セキュアハッシュアルゴリズム)を確保することは、主にデジタル署名アルゴリズム(デジタル署名アルゴリズムDSA)を定義するデジタル署名標準(デジタル署名標準DSS)に適用されます。メッセージの長さが2未満^ 64ビットであるため、SHA1は、160ビットのメッセージダイジェストを生成します。メッセージを受信すると、メッセージダイジェストは、データの整合性を検証するために使用することができます。

  SHAは、米国国立標準技術研究所の暗号ハッシュ関数のシリーズで出版され、米国国家安全保障局(NSA)のために設計されています。

  山東大学教授ワング・ザイアオユンをクラックするために2005年にMD5とSHA-1として、科学者たちは、SHA224、SHA256、SHA384、SHA512、もちろん、長く中央値は、はるかに困難休憩に、しかし同時に、暗号化されたメッセージダイジェストを生成を立ち上げてきました時間が長く過ごしました。最も人気のある暗号化アルゴリズムであるSHA-256です。

四、MD5とSHA-1を比較します

  MD5とSHA-1はMD4から開発されているように、強度のそれらの構造および特性は多くの類似点を持って、MD5とSHA-1の間の最大の差は、MD5ダイジェストの32ビットより長いことでダイジェスト。ブルートフォース攻撃のために、任意の所与のパケットのメッセージダイジェストが困難ダイジェストに等しくなるように:MD5は、操作2128の大きさで、SHA-1は、2160回の動作の順番です。同一のダイジェストを持つ2つのパケットを生成することの難しさ:MD5は、操作264のオーダーである、SHA-1は、280の操作の順序です。したがって、より大きなSHA-1は、フォース攻撃の対を提供します。しかし、複数の大きな160ビットを処理するために80:64とMD5より手順のキャッシュSHA-1ループ以降:128ビット、SHA-1動作速度も遅いMD5より。

第五は、機密MD5パスワードを使用します

  ほとんどのデータベースに保存されている方法のMD5を使用して、パスワードに登録され、当社の主要なサイトの日々の生活の中で塗りつぶし、および一部のSHA方法を使用しますが、登録パスワードを埋めるために多くの友人があるだろうが、あまりにも簡単です。オンラインカジュアルな検索では、事前に逆推力装置のテーブルを与えるためにこれらの共通パスワードのMD5値を計算することができ、MD5は暗号化されたハッカーを使用していても、単純なパスワードは、オンラインであなたがMD5暗号解読を見ることができ、そのようなサイトは事前にしていますライブラリ内のMD5の計算を使用して、これらの従来のパスワードは、私たちは「ヒットライブラリー」は、このような状況を呼び出します。

  人気のパスワードにハッカーが容易に計算することができ、その後、という抗打ち上げを回避する方法は、この方法は、一般的に、あなたが前に追加する固定文字列を暗号化する際に、「塩」として知られています。

#!は/ usr / binに/ Pythonの
# - * - encodeing:UTF-8 - * - 
インポートhashlib 
MD5 = hashlib.md5( '塩' .encode() 'UTF-8')
md5.update(b'123.com 「) 
((md5.hexdigest)を印刷)
 
#cbff36039c3d0212b3e34c23dcde1456 
#69c974abecb370564b051094c820fc6a 
以前よりも、この時に得られた#暗号化された値と同じではありません

  もう一つの方法は、動的な塩を破るために困難です

#!は/ usr / binに/ Pythonが
# - * - encodeing:UTF-8 - * - 
インポートhashlib 
USR = '牙' 
MD5 = hashlib.md5(USR [0:2] .encode( 'UTF-8')+ '塩「.encode(」UTF-8 『)) このメソッドは、パスワードの追加、ユーザー名に加えて、固定アクセス文字の最初の2つの文字である
)md5.update(b'123.com』
印刷(md5.hexdigest())

 

六、RSAの暗号化アルゴリズム

6.1、RSAの暗号化アルゴリズムが定義されています

  RSAの暗号化アルゴリズムは、非対称暗号化アルゴリズムです。公開鍵暗号化と電子商取引ではRSAが広く用いられています。ロナルド・リベスト(ロナルド・リベスト)、アディ・シャミア(アディ・シャミア)とレオナルド・エーデルマン(レオナルド・エーデルマン)によるRSA 1977は一緒に発表しました。その時にそれらの3つがMITで働いています。RSAは、一緒に作品を作曲文字で始まる姓三人です。

  1973年、英国政府通信本部は同じアルゴリズムの内部文書で提示したが、1997年だけだったまでの彼の調査結果は、秘密に含まれていたクリフォード・コックス(クリフォードコックス)の数学者公表。
  整数の因数分解大きな困難を行うには、RSAアルゴリズムの信頼性を決定します。つまり、大きな整数の因数分解がより困難行う、RSAアルゴリズムは、より信頼性があります。誰かが速い因数分解アルゴリズムを見つけた場合、その情報のRSA暗号の信頼性を使用することは確かに大幅に低下してしまいます。しかし、このようなアルゴリズムの可能性を見つけることは非常に小さいです。今日、唯一の短いRSA鍵は、ブレーク前の溶液の強力な方法することができます。世界でRSAアルゴリズムを攻撃するためにこれまでのところ、信頼できる方法はありません。限り、キーの長さが十分に長くなるように、情報が実際に使用されているRSA暗号化ソリューションが破損することはできません。

6.2、RASのパスワードの暗号化と復号化

  私たちは一般的に使用されたパスワードのパスワードは暗号で呼ばれています。従来のパスワードでは:暗号化アルゴリズムは秘密です。現代暗号の場合:暗号化アルゴリズムが公開され、秘密鍵は秘密です。

  システムは、現代暗号対称暗号化と非対称暗号化に分かれています。

  RSA暗号化および復号化プロセスは、その後、(百科事典百度から)以下に示します。

  RAS非対称暗号化システム。公開鍵は、(本明細書に開示されている)を暗号化するために使用され、秘密鍵(プライベート)を復号化するために使用されます。例えば:

  そして、それは通常、ユーザによって保存された秘密鍵を、そのうちの1つはRSA鍵のペアを1つ、生き残るために最初であり、もう一つは、公開鍵でもネットワークサーバに登録され、公開されることが可能です。セキュリティ強度、少なくとも500のRSA鍵長、一般1024推奨を改善するために。これは、計算の暗号化を大量にできます。情報を送信する際の計算方法の量を減らすために、伝統的な暗号方式と共通鍵暗号方式を組み合わせて開示されています。この情報は、セッション鍵とRSA暗号化キー情報の要約を使用し、その後修正DESのIDEA暗号化またはキーを使用して、と。異なる鍵を用いて、情報の他の側面を受信した後に復号化し、メッセージダイジェストを確認します。

  最初のアルゴリズムは、RSAアルゴリズムは、暗号化およびデジタル署名の両方に使用することができるだけでなく、簡単に理解して動作させることです。RSAは、年以来、今30年への提案から最も広く研究されている公開鍵アルゴリズムは、2017年のように、徐々に受け入れられ、様々な攻撃の試練に耐えた、広く最高の公開鍵方式とみなされています1。

6.3、RSA暗号化アルゴリズムプロセス

  • 1、2つのランダムに選択された素数p及びq
  • 2算出N = PQ
  • 3、および選択はO(n)が小さい奇数の素数EはO(N)=(P-1)(Q-1)であります
  • 4、E dの乗法的逆数を計算するO(n)を成形するために、満たされる(E * D)MODはO(n)= 1
  • 5、公開鍵(E、N)、秘密鍵(D、N)

次のように分析を詳細:

  一緒に仕事へのRSA公開鍵と秘密鍵のニーズ。対応する秘密鍵でのみ復号化するために使用することができた後、公開鍵は、データブロックを暗号化するために使用しました。鍵を生成するときは、正しく動作させるには、この関係の公開鍵と秘密鍵を確実にするためにいくつかの手順を実行する必要があります。これらの手順はまた、互いから導入することができるキーの実用的な方法がないことを確認してください。

  開始する前に、二つの大きな素数を選択する最初は、pとqを表します。技術レベルを解決するための要因大量今日によると、これらの2つの数字が、実際にそれが安全と考えることができている、少なくとも200、でなければなりません。  

  その後、N-に開始:N-PQ =

  接下来,选择一个小的奇数e,它将成为公钥的一部分。选择e最需要考虑的重点是它与(p-1)(q-1)不能有相同的因子。换句话说,e与(p-1)(q-1)是互为素数关系的。比如,如果p=11而q=19,那么n=11 X 19=209。这里选择e=17,因为(p-1)(q-1)=10 X 18 =180,而17和180没有相同的因子。通常选择3、17、65、537作为e的值。使用这些值不会对RSA的安全性造成影响,因为解密数据还需要用到私钥。

  一旦为e选择了一个值,接下来开始计算相对应的值d,d将成为私钥的一部分。d的值就是计算e的倒数对(p-1)(q-1)的取模结果,公式如下:d = e-1 mod (p-1)(q-1)

  这里d和e是模乘法逆元的关系。

 

  思考一下这个问题:当d为多少时可以满足ed mod (p-1)(q-1) = 1 ?比如在等式 17d mod 180 = 1中,d的一个可能值是53。其他的可能值是233、413、593等。在实践中,可以利用欧几里德算法来计算模乘法逆元。这里就不再展开。

  现在有了e和d的值,将(e,n)作为公钥P将(d,n)作为私钥S并保持其不可见。表示为:P = (e,n) , S = (d,n)

  加密方使用P来加密数据,解密方使用S来解密。为了防止就算有人知道了P也无法推算出S,必须保证p和q的值绝对不能暴露

  P和S结合在一起提供的安全性来自于一个事实,那就是乘法是一种很好的单向函数。

  单向函数是加密技术的基础简单的说,单向函数就是在一个方向上能够很容易算出结果,但反向推导则是不切实际的。比如,在RSA算法中,计算p和q的成绩是一种单向函数,因为尽管计算p和q的成绩很容易,但将n反向因子分解为p和q则是极其耗时的。这里,选择的p和q的值要足够大才可以。

  计算P和S的步骤起源于欧拉函数中的一些有趣性质。特别是,这些性质允许对模幂运算做一些有用的操作。

  欧拉函数记为φ(n),定义所有小于n的正整数里和n互素的整数的个数

  只有当两个整数的唯一公因子为1时,才说这两个整数是互素的。例如,φ(8)=4,因为一共只用4个比8小的整数是互素的,它们是1,3,5,7。

  欧拉方程有两个性质对RSA算法来说是特别重要的。

  第一,当n是素数时,φ(n)=n-1。这是由于n的唯一因子是1和n,因此,n与之前的所有n-1个正整数都是互素的。

  另一个有趣的性质是对于任意小于n且与n互素的正整数a,都有aφ(n) mod n = 1。例如,14 mod 8 = 1, 34mod 8 = 1, 54 mod 8 = 1, 74 mod 8 = 1。对上述方程两边都乘以a,得到:(a)(aφ(n) mod n)=a,或者aφ(n)+1 mod n = a

  因此,可以得到15 mod 8 = 1, 35 mod 8 = 3, 55 mod 8 = 5, 75 mod 8 = 7。

  调整之后得到的等式非常强大。因为对于某些等式c = me mod n,该等于可以让我们找出一个d的值,使得cdmod n = m。

  这就是RSA算法中允许加密数据,之后再解密回原文的恒等式。可以按照如下方式表示:cd mod n = (me)d mod n = med mod n = mφ(n)+1 mod n = m mod n

  欧拉函数和指数间的关系保证了加密的任意数据都能够唯一地解密回来。为了找出d的值,解方程d = e-1 φ(n) +1。不巧的是,对于方程d = e-1φ(n)+1不一定总是有整数解。为了解决这种问题,转而计算d mod φ(n)的值。换句话说,d = (e-1 φ(n) + 1) mod φ(n),可以简化为:d = e-1 mod φ(n)

  我们可以得到这样的简化形式,因为(φ(n)+1) mod φ(n) = (φ(n)+1) - φ(n) = 1。可以用任意的正整数替代φ(n)来证明等式成立。注意这个方程式同之前计算密钥的过程中得出d的推导式之间的相似之处。这提供了一种通过e和n来计算d的方法。

  当然了,e和n是公开的,对于攻击者来说是事先可知的,因此就有人问,这难道不是给了攻击者相同的机会来计算出私钥吗?讨论到这里,是时候来探讨一下RSA算法安全性保障的由来了。

  RSA算法的安全性保障来自一个重要的事实,那就是欧拉函数是乘法性质的。这意味着如果p和q是互素的,那么有φ(pq)=φ(p)φ(q)。因此,如果有两个素数p和q,且n=p*q,则φ(n)=(p-1)(q-1),而且最重要的是:d = e-1 mod (p-1)(q-1)

  因此,尽管攻击者可能知道了e和n的值,为了计算出d必须知道φ(n),而这又必须同时得到p和q的值才能办到。由于p和q是不可知的,因此攻击者只能计算n的因子,只要给出的p和q的值足够大,这就是一个相当耗费时间的过程。

6.4,加密和解密数据分组

  要使用RSA算法对数据进行加密和解密,首先要确定分组的大小。为了实现这一步,必须确保该分组可以保存的最大数值要小于n的位数。比如,如果p和q都是200位数字的素数,则n的结果将小于400位。因而,所选择的分组所能保存的最大值应该要以是接近于400。在实践中,通常选择的位数都是比n小的2的整数次幂。比如,如果n是209,要选择的分组大小就是7位,因为27 = 128比209小,但28 = 256又大于209。

  要从缓冲区M中加密第(i)组明文M,使用公钥(e,n)来获取M的数值,对其求e次幂,然后再对n取模。这将产生一组密文Ci对n的取模操作确保了Ci将和明文的分组大小保持一致。因而,要加密明文分组有:Ci = Mie mod n

  之前提到过,欧拉函数是采用幂模运算来加密数据的基础,根据欧拉函数及其推导式,能够将密文解密回原文。

  要对缓冲区中C中的第(i)组密文进行解密,使用私钥(d,n)来获取Ci的数值部分,对其求d次幂,然后再对n取模。这将产生一组明文Mi。因此,要解密密文分组有:Mi = Cid mod n

6.5,RSA加密算法代码实现

  代码如下:

# 取两个质数
p = 53
q = 59
n = p * q  # 3127
fai = (p - 1) * (q - 1)
# fai = 3016
e = 3
# fai/3 = 1005.333  # 除不尽,这是质数
d = 2011  # d是唯一的(这个自己算)
# 这里我们反推一下d是否正确
# (e * d) % fai = 1
# (e, n)组成公钥
# (d, n)组成私钥
 
# 加密和解密的过程
# c = (m**e)%n
# m = (c**d)%n

6.6,为什么使用RSA加密算法呢?

  为什么RSA加密算法破解不了,两个质数计算乘法很简单,但是打乱拆分为两个质数很难。没有一个算法可以破解,所以只能一个一个试,就是说大数拆分很难。

 

Python的 提供的相关模块

  用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

一,HASH模块

  下面举例说明了SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5算法的运算:

#使用update生成MD5加密的值,注意update在pycharm中没有提示,需要自行手打

import hashlib
 
m = hashlib.md5()
print("m:",m)
# m: <md5 HASH object @ 0x00000224BA2D0378>
m1 = m.update(b"Hello")    
print("m1:",m1)
print("m:",m)
# m1: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
m2 = m.update(b"It's me")
print("m2:",m2)
print("m:",m)
# m2: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
print(m.digest())
# b']\xde\xb4{/\x92Z\xd0\xbf$\x9cR\xe3Br\x8a'
m3 = m.update(b"It's been a long time since last time we ...")
print("m3:",m3)
print("m:",m)
# m3: None
# m: <md5 HASH object @ 0x00000224BA2D0378>
print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
# b'\xa0\xe9\x89E\x03\xcb\x9f\x1a\x14\xaa\x07?<\xae\xfa\xa5'
# 32
'''
def digest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of binary data. """
    pass
 
def hexdigest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of hexadecimal digits. """
    pass

 

import hashlib
 
######## md5 ########
 
res = hashlib.md5()
print("md5",res)
# md5 <md5 HASH object @ 0x00000203F6610378>
res1 = res.update(b'admin')
print("md5_update:",res1)
print("md5",res)
# md5_update: None
# md5 <md5 HASH object @ 0x00000203F6610378>
print(res.hexdigest())
# 21232f297a57a5a743894a0e4a801fc3
 
 
 
######## sha1 ########
 
hash = hashlib.sha1()
print("sha1",hash)
# sha1 <sha1 HASH object @ 0x0000024CA2840378>
hash1 = hash.update(b'admin')
print("hash1:",hash1)
print("hash:",hash)
# hash1: None
# hash: <sha1 HASH object @ 0x0000024CA2840378>
print(hash.hexdigest())
# d033e22ae348aeb5660fc2140aec35850c4da997
 
######## sha256 ########
 
hash = hashlib.sha256()
print("hash",hash)
# hash <sha256 HASH object @ 0x000001D462B20378>
hash1 = hash.update(b'admin')
print("sha256:",hash1)
print("hash:",hash)
# sha256: None
# hash: <sha256 HASH object @ 0x000001D462B20378>
print(hash.hexdigest())
# 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
 
 
######## sha384 ########
 
hash = hashlib.sha384()
print("hash:",hash)
# hash: <sha384 HASH object @ 0x000001D82F940378>
hash1 =hash.update(b'admin')
print("sha384:",hash1)
print("hash:",hash)
# sha384: None
# hash: <sha384 HASH object @ 0x000001D82F940378>
print(hash.hexdigest())
# 9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

 

二,random模块

下面直接上代码,明白的快

import random
 
res1 = random.randrange(1,10) #返回1-10之间的一个随机数,不包括10
print(res1)
#4
res2 = random.randint(1,10) #返回1-10之间的一个随机数,包括10
print(res2)
#6
res3 = random.randrange(0, 100, 2) #随机选取0到100间的偶数
print(res3)
#12
res4 = random.random()  #返回一个随机浮点数
print(res4)
# 0.31929002952597907
res5 = random.choice('abce3#$@1') #返回一个给定数据集合中的随机字符
print(res5)
# @
res6 = random.sample('abcdefghij',3)  #从多个字符中选取特定数量的字符
print(res6)
# ['j', 'h', 'a']

  程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串,举例如下:

#生成随机字符串
import string
import random
res = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
print(res)
# 3l82uv
#洗牌
 
num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
res2 = random.shuffle(num)
print(num)
# [3, 9, 5, 8, 4, 6, 1, 0, 2, 7]

 

三,string模块

string模块

常数  含义
ascii_letters 获取所有ascii码中字母字符的字符串(包含大写和小写)
ascii_uppercase 获取所有ascii码中的大写英文字母
ascii_lowercase 获取所有ascii码中的小写英文字母
digits 获取所有的10进制数字字符
octdigits 获取所有的8进制数字字符
hexdigits 获取所有16进制的数字字符
printable 获取所有可以打印的字符
whitespace 获取所有空白字符
punctuation 获取所有的标点符号


练习题:写一个6位随机验证码,要求至少包括一个数字,一个小写字母,一个大写字母

# 写一个6位随机验证码程序(使用random模块),
# 要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
 
import random
import string
 
# ascii_letters:获取所有ascii码中字母字符的字符串(包含大写和小写)
# digits:获取所有的10进制数字字符
res = ''.join(random.sample(string.digits+string.ascii_letters,6))
# res = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
print(res)

 

四,math模块

  在数学之中,除了加减乘除四则运算之外——还有其它更多的运算,比如乘方、开方、对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math

  模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具。换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践的需要,于是就有人专门制作了另外一些工具。这些工具被称之为“模块”

  任何一个 Pythoner 都可以编写模块,并且把这些模块放到网上供他人来使用。

  当安装好 Python 之后,就有一些模块默认安装了,这个称之为“标准库”,“标准库”中的模块不需要安装,就可以直接使用。

  如果没有纳入标准库的模块,需要安装之后才能使用。模块的安装方法,我特别推荐使用 pip 来安装。这里仅仅提一下,后面会专门进行讲述,性急的看官可以自己 google。

  math模块是标准库里面的,所以不用安装,可以直接调用

# _*_ coding: utf-8 _*_
#导入模块
import math
 
#dir(module)是一个非常有用的指令,可以通过他来差任何模块所包含的工具
res = dir(math)
print(res)
# ['__doc__', '__loader__', '__name__', '__package__', '__spec__',
#  'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
#  'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1',
#  'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd',
#  'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma',
#  'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians',
#  'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
'''
    上面列举了math的所有方法,如果不会使用,
    请输入help(math.方法名)
'''
# help(math.pow)
# Help on built - in function pow in module math:
#
# pow(...)
#     pow(x, y)
#
#     Return x ** y(x to the power of y).
print(math.pi)
# 3.141592653589793

おすすめ

転載: www.cnblogs.com/tu240302975/p/12341041.html