用Python实现密码学

457 阅读8分钟

什么是密码学?

密码学是通过使用代码对数据进行加密和解密来创建一个安全的通信渠道的艺术,这意味着除了目的地的人之外,没有人可以看到传输的数据。

密码学主要使用数学原理和一系列的公式和算法来加密信息,从而使解密这些信息变得不可能。它在当今世界随处可见,从保障社交媒体平台的日常通信到保障在线电子商务的银行交易活动。

密码学的不同类型是什么?

有三种主要的密码学类型。

  1. 对称密钥密码学
  2. 非对称密钥加密法
  3. 散列

让我们深入了解一下每一种

对称密钥加密法

对称密钥加密法是解密和加密信息的最快和最简单的方法之一。它主要涉及使用一个单一的密钥,称为秘钥,用于加密和解密数据。它也被称为私钥加密法,以及秘钥、共享密钥、单钥和私钥加密法。

数据被转换为一种任何人都无法理解的形式,使数据免受攻击者的侵害。它主要用于加密大量的数据。对称密钥加密法有两种方法类型,用于将明文转换为密文:区块密码和流密码。

区块密码器使用电子代码块(ECB)和密码代码块(CBC)的算法模式。这些采取文本输入,并通过采取一个文本块和生成相同大小的密码文本将其转换为密码文本。区块密码器比流密码器相对较慢,因为一个文本块需要覆盖、加密和解密。

另一方面,流密码使用密码文本反馈(CFB)和输出反馈(OFB)模式,通过一次性接受1个字节的输入,将明文转换为密码文本,这使得流密码比块密码快。流密码使用XOR来将明文转换为密码文本。

对称密钥算法的一些例子是。

使用Python的凯撒密码

凯撒密码是对称密钥加密法的一个例子,它是实现加密法最古老和最简单的方法之一。凯撒密码是一种替换式密码,在这种密码中,字母的顺序会以固定的数量转移。

加密和解密凯撒密码很容易,因为方法是固定的,不需要钥匙。因此,任何知道该方法的人都能轻松解密信息。

例如,像 "猫 "这样一个简单的单词,如果你将每个字母在字母表中移位三个字母,就会被加密成 "fdw"。这使得 "猫 "这个词在你不知道它的加密方式的情况下很难理解。

现在,让我们创建一个简单的Python程序来加密和解密密码文本。

alphabets = 'abcdefghijklmnopqrstuvwxyz'
def encrypt_caesar(num, text):
 result = ' '
 for k in text.lower():
  try:
    i = (alphabets.index(k) + num) % 26
    results += alphabets[i]
  except ValueError:
   results+= k
 return results.lower()
num =int(input("please input the shift:\t"))
text=input("please input the text: \t")
ciphertext = encrypt_caesar(num, text)
print(“Encoded text:”,ciphertext)

下面是结果。

Encoded Text

首先,我们创建了一个名为alphabets 的变量,我们在其中写下了所有的字母表字母。然后,我们创建了一个名为encrypt_ceaser(num, text) 的函数,在这个函数中我们将输入移位密钥和需要加密的文本。

for k in text.lower():

通过使用for 循环,我们将把输入的字符串插入小写字母。

for k in text.lower():
 try:
    i = (alphabets.index(k) - num) % 26
     results += key[i]
   except ValueError:
    results += k
  return results.lower()

try 方法和except 方法,ValueError ,是用来捕捉程序之间的错误。在try ,我们使用index,计算字符串中的字母*。*

用shift键将文本中的所有字母相加,然后再除以26。一旦循环完成,这些字母就会被移位值移位。

num =int(input("Please input the shift:\t"))
text=input("Please input the text: \t")
ciphertext = decrypt_caesar(num, text)
print ("Decoded text:",ciphertext)

通过input() 方法,我们为程序接受用户输入。然后,在密码文本中创建一个变量,我们称之为encrypt_caesar( num, text)print 语句被用来打印编码后的密码文本。

现在,为了解密该文本,我们将用相同的密钥值进行减法。3

alphabets= 'abcdefghijklmnopqrstuvwxyz'
def decrypt_caesar(num, text):
 results = ''
 for k in text.lower():
  try:
    i = (alphabets.index(k) - num) % 26
    results +=alphabets[i]
  except ValueError:
   results += k
 return results.lower()
num =int(input("please input the shift:\t"))
text=input("please input the text: \t")
ciphertext = decrypt_caesar(num, text)
print(“Decoded text:”,ciphertext)

下面是解密后的文本结果。

Decoded Text

虽然这个程序与我们之前创建的程序非常相似,但我们在解密文本时做了一些小改动。

我们没有使用i = (alphabets.index(k) + num) % 26,而是在i = (alphabets.index(k) - num) % 26 中使用了一个- ,对密码文本进行解密。

非对称密钥加密法

非对称密钥加密法比对称加密法更复杂,速度更慢。它也被称为公钥加密法,涉及使用两个不同的密钥(有时更多)来加密和解密数据。

从本质上讲,一个公钥将被用来加密数据,而只有相应的私钥才能解密数据,这使得非对称密钥更加安全。

例如,你现在在阅读这篇博文时正在使用非对称加密技术。HTTPS网站URL附近的锁符号表明,你正在使用SSL/TLS证书安全地连接到这个网站。

非对称密钥加密验证了服务器的身份,并创建了非对称加密技术。

非对称密钥算法的一些例子是。

  • 里维斯特-萨米尔-阿德勒曼(RSA)
  • 数字签名算法(DSA)
  • 椭圆曲线加密法(ECC)

让我们用Python生成一个RSA密钥,使用一个叫做Cryptodome的Python软件包。

from Crypto.PublicKey import RSA
key = RSA.generate(3072)
file= open('Rsakey.pem','wb')
file.write(key.exportKey('PEM'))
file.close()

让我们安装Cryptodome。

pip install cryptodome

为了生成一个密钥,我们将使用key.generate(bit size)bit size 必须在2048-4096之间,以使密钥安全和冗长。

file = open('Rsakey.pem','wb')

在这里,wb **意为 "以二进制方式写入"。

接下来,让我们创建一个.pem (隐私增强邮件),这是一种用于存储加密密钥和证书的文件格式

file.write(key.exportkey('PEM'))

我们将使用.write 函数来打印文件中的密钥,并使用.exportkey 来导出PEM格式的文件。最后,我们将通过使用file.close 关闭文件。

打开Rsakey.pem file

Rsakey.pem File

Hashing

Hashing是使用数学算法将任何长度的输入转换为固定大小的文本字符串的过程。这意味着任何大小的文本,不管它有多长,都可以通过一个算法转换成数字和字母的数组。

用于转换文本的数学算法被称为哈希函数,而输出被称为哈希值。哈希算法被设计成不可逆的,使其免受攻击者的影响。

散列用于用户认证和存储密码。MD5和SHA-1散列算法早先用于认证和存储密码,但它们后来被废弃了,因为它们不安全。目前,最安全的算法是Argon2bycrptscrypt,以及PBKDF2

现在,让我们创建一个简单的散列程序,这样我们就可以加密一个字符串了。首先,让我们通过编码来看看Python中有多少种散列算法可用。

import hashlib
Hash_Algorithms_available = hashlib.algorithms_available
print(Hash_Algorithms_available)

Output: {'sha256', 'md4', 'whirlpool', 'sha384', 'sha224', 'sm3', 'blake2s', 'blake2b', 'ripemd160', 'sha512_256', 'md5', 'sha512_224', 'shake_128', 'sha512', 'sha1', 'sha3_384', 'sha3_256', 'sha3_512', 'md5-sha1', 'shake_256', 'sha3_224'}

首先,让我们看看一个简单的MD5 Python散列程序的运行,因为它是最常见的Python散列例子之一。

import hashlib #importing libraries
module = hashlib.md5() #selecting the hashing module 
module.update(b"You are Awesome ") #inputting the text and b implies bytecode
print(module.hexdigest())

生成的十六进制是。

83d38079ecb05b2b0ad97ffa50a951eb

在这里,我们导入hashlib ,这是一个在Python中可用的模块,并创建一个名为module 的变量,在这里我们选择了在散列时要使用的Python散列算法。

.update 是hashlib中的一个内置函数,它将数据作为输入并生成散列。字母b 表示该字符串是一个字节字符串,.digest 给你从数据中生成的散列字符串。

现在,让我们看看一个简单的bcrypt Python散列程序的运行情况。

import bcrypt #importing libraries
input_password = b"YouareAwesome!" #inputting the text and b implies bytecode 
hashed_password = bcrypt.hashpw(input_password, bcrypt.gensalt())
print(hashed_password)

生成的十六进制是。b'$2b$12$ZVMHgLah4CtGM1FGIXeEWusNA23wz1dqEc27a3rwwm9Fa4XVPLVLG'</code

Bcrypt是Python中的一个软件包,可以通过简单的pip语句来安装。

pip install bcrypt

然后我们可以导入包import bcrypt ,并使用bcrypt.hashpw() 函数,该函数需要两个参数:bytesalt

Salt 是散列函数中使用的随机数据,它可以创建随机字符串并使每个散列都不可预测。

总结

在这篇文章中,你了解了密码学和加密数据的各种方法。我们还创建了一个简单的Python程序用于加密和解密。

实施密码学是非常重要的。当你在数据库中存储密码时,要确保你使用的是最新最强的密码学和散列标准。

The postImplementing cryptography with Pythonappeared first onLogRocket Blog.