Python3의 암호화 및 복호화에 대한 자세한 설명
Python 3의 표준 라이브러리에는 암호화를 다룰 내용이 많지 않지만 해시를 처리하는 라이브러리가 있습니다. 여기서는 이에 대해 간략하게 소개하지만 초점은 두 가지 타사 소프트웨어 패키지인 PyCrypto와 암호화에 맞춰집니다. 이 두 라이브러리를 사용하여 문자열을 암호화하고 해독하는 방법을 알아봅니다.
Hash
보안 해시 알고리즘이나 메시지 다이제스트 알고리즘을 사용해야 하는 경우 표준 라이브러리의 hashlib 모듈을 사용할 수 있습니다. 이 모듈에는 SHA1, SHA224, SHA256, SHA384, SHA512 및 RSA의 MD5 알고리즘을 포함한 FIPS(Federal Information 처리 표준) 호환 보안 해싱 알고리즘이 포함되어 있습니다. Python은 adler32 및 crc32 해시 함수도 지원하지만 zlib 모듈에 있습니다.
해시의 가장 일반적인 용도 중 하나는 비밀번호 자체가 아닌 비밀번호의 해시를 저장하는 것입니다. 물론, 사용되는 해시 함수는 더욱 강력해야 합니다. 그렇지 않으면 쉽게 깨질 것입니다. 또 다른 일반적인 사용법은 파일의 해시를 계산한 다음 파일과 해당 해시를 별도로 보내는 것입니다. 파일을 받은 사람은 해당 파일의 해시값을 계산하여, 받은 해시값과 일치하는지 확인할 수 있습니다. 두 개가 일치하면 전송 중에 파일이 변조되지 않았음을 의미합니다.
md5 해시를 만들어 보겠습니다.
>>> import hashlib >>> md5 = hashlib.md5() >>> md5.update('Python rocks!') Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> md5.update('Python rocks!') TypeError: Unicode-objects must be encoded before hashing >>> md5.update(b'Python rocks!') >>> md5.digest() b'\x14\x82\xec\x1b#d\xf6N}\x16*+[\x16\xf4w'
잠시 시간을 내어 한 줄씩 설명하겠습니다. 먼저 hashlib를 가져온 다음 md5 해시 개체의 인스턴스를 만듭니다. 그런 다음 이 인스턴스에 문자열을 추가한 후 오류 메시지가 표시되었습니다. md5 해시를 계산할 때 일반 문자열 대신 바이트 형식의 문자열을 사용해야 하는 것으로 나타났습니다. 문자열을 올바르게 추가한 후 다이제스트 함수를 호출하여 해시 값을 얻습니다. 16진수 해시 값을 원할 경우 다음 방법을 사용할 수도 있습니다.
>>> md5.hexdigest() '1482ec1b2364f64e7d162a2b5b16f477'
실제로 해시를 생성하는 간소화된 방법이 있습니다. 이 방법을 사용하여 sha1 해시를 생성하는 방법을 살펴보겠습니다.
>>> sha = hashlib.sha1(b'Hello Python').hexdigest() >>> sha '422fbfbc67fe17c86642c5eaaa48f8b670cbed1b'
가능한 한 보시다시피, 해시 인스턴스를 생성하고 동시에 다이제스트 함수를 호출할 수 있습니다. 그런 다음 해시 값을 인쇄하여 살펴보겠습니다. 여기서는 sha1 해시 함수를 예로 사용하지만 특별히 안전하지는 않으며 독자는 다른 해시 함수를 자유롭게 사용해 볼 수 있습니다.
키 내보내기
Python의 표준 라이브러리는 키 내보내기에 대한 지원이 약합니다. 실제로 hashlib 라이브러리에서 제공하는 유일한 방법은 pbkdf2_hmac 함수입니다. PKCS#5의 두 번째 비밀번호 기반 키 유도 함수로, 의사 난수 함수로 HMAC를 사용합니다. "솔팅" 및 반복 작업을 지원하므로 유사한 방법을 사용하여 비밀번호를 해시할 수 있습니다. 예를 들어 SHA-256 암호화 방법을 사용하려는 경우 최소 16바이트의 "솔트"와 최소 100,000회의 반복이 필요합니다.
간단히 말하면 "소금"은 크래킹 난이도를 높이기 위해 해싱 프로세스에 추가되는 임의의 데이터입니다. 이는 기본적으로 사전 및 레인보우 테이블 공격으로부터 비밀번호를 보호합니다.
간단한 예를 살펴보겠습니다.
>>> import binascii >>> dk = hashlib.pbkdf2_hmac(hash_name='sha256', password=b'bad_password34', salt=b'bad_salt', iterations=100000) >>> binascii.hexlify(dk) b'6e97bad21f6200f9087036a71e7ca9fa01a59e1d697f7e0284cd7f9b897d7c02'
여기서는 형편없는 솔트를 사용하여 100,000번이 넘는 반복을 통해 SHA256으로 비밀번호를 해싱하고 있습니다. 물론 SHA는 실제로 비밀번호 키 생성에 권장되지 않습니다. 대신 scrypt와 같은 알고리즘을 사용해야 합니다. 또 다른 좋은 옵션은 비밀번호를 해시하도록 특별히 설계된 bcrypt라는 타사 라이브러리를 사용하는 것입니다.
PyCryptodom
PyCrypto는 아마도 Python 암호화를 위한 가장 유명한 타사 패키지일 것입니다. 안타깝게도 2012년에 개발이 중단되었습니다. 다른 사람들은 계속해서 최신 버전의 PyCrypto를 출시하고 있으며, 타사 바이너리 패키지를 사용해도 괜찮다면 Python 3.5에 해당하는 버전을 계속 얻을 수 있습니다. 예를 들어 Github(https://github.com/sfbahr/PyCrypto-Wheels)에서 Python 3.5에 해당하는 PyCrypto 바이너리 패키지를 찾았습니다.
다행히 PyCrypto를 대체하는 PyCrytodome이라는 프로젝트의 포크가 있습니다. Linux에 설치하려면 다음 pip 명령을 사용할 수 있습니다.
pip install pycryptodome
Windows에서의 설치는 약간 다릅니다.
pip install pycryptodomex
문제가 발생하면 올바른 종속성이 설치되지 않았기 때문일 수 있습니다(LCTT 번역 주석 : python-devel 등) 또는 Windows 시스템에 컴파일러가 필요합니다.
PyCryptodom이 PyCrypto의 마지막 버전에 비해 많은 개선이 이루어졌다는 점도 주목할 가치가 있습니다. 어떤 새로운 기능을 사용할 수 있는지 알아보려면 해당 홈페이지를 방문해 볼 가치가 있습니다.
암호화된 문자열
홈페이지를 방문하면 몇 가지 예를 볼 수 있습니다. 이 첫 번째 예에서는 DES 알고리즘을 사용하여 문자열을 암호화합니다.
>>> from Crypto.Cipher import DES >>> key = 'abcdefgh' >>> def pad(text): while len(text) % 8 != 0: text += ' ' return text >>> des = DES.new(key, DES.MODE_ECB) >>> text = 'Python rocks!' >>> padded_text = pad(text) >>> encrypted_text = des.encrypt(text) Traceback (most recent call last): File "<pyshell#35>", line 1, in <module> encrypted_text = des.encrypt(text) File "C:\Programs\Python\Python35-32\lib\site-packages\Crypto\Cipher\blockalgo.py", line 244, in encrypt return self._cipher.encrypt(plaintext) ValueError: Input strings must be a multiple of 8 in length >>> encrypted_text = des.encrypt(padded_text) >>> encrypted_text b'>\xfc\x1f\x16x\x87\xb2\x93\x0e\xfcH\x02\xd59VQ'
这段代码稍有些复杂,让我们一点点来看。首先需要注意的是,DES 加密使用的密钥长度为 8 个字节,这也是我们将密钥变量设置为 8 个字符的原因。而我们需要加密的字符串的长度必须是 8 的倍数,所以我们创建了一个名为 pad 的函数,来给一个字符串末尾填充空格,直到它的长度是 8 的倍数。然后,我们创建了一个 DES 的实例,以及我们需要加密的文本。我们还创建了一个经过填充处理的文本。我们尝试着对未经填充处理的文本进行加密,啊欧,报了一个 ValueError 错误!我们需要对经过填充处理的文本进行加密,然后得到加密的字符串。(LCTT 译注:encrypt 函数的参数应为 byte 类型字符串,代码为:encrypted_text = des.encrypt(padded_text.encode('utf-8')))
知道了如何加密,还要知道如何解密:
>>> des.decrypt(encrypted_text) b'Python rocks! '
幸运的是,解密非常容易,我们只需要调用 des 对象的 decrypt 方法就可以得到我们原来的 byte 类型字符串了。下一个任务是学习如何用 RSA 算法加密和解密一个文件。首先,我们需要创建一些 RSA 密钥。
创建 RSA 密钥
如果你希望使用 RSA 算法加密数据,那么你需要拥有访问 RAS 公钥和私钥的权限,否则你需要生成一组自己的密钥对。在这个例子中,我们将生成自己的密钥对。创建 RSA 密钥非常容易,所以我们将在 Python 解释器中完成。
>>> from Crypto.PublicKey import RSA >>> code = 'nooneknows' >>> key = RSA.generate(2048) >>> encrypted_key = key.exportKey(passphrase=code, pkcs=8, protection="scryptAndAES128-CBC") >>> with open('/path_to_private_key/my_private_rsa_key.bin', 'wb') as f: f.write(encrypted_key) >>> with open('/path_to_public_key/my_rsa_public.pem', 'wb') as f: f.write(key.publickey().exportKey())
首先我们从 Crypto.PublicKey 包中导入 RSA,然后创建一个傻傻的密码。接着我们生成 2048 位的 RSA 密钥。现在我们到了关键的部分。为了生成私钥,我们需要调用 RSA 密钥实例的 exportKey 方法,然后传入密码,使用的 PKCS 标准,以及加密方案这三个参数。之后,我们把私钥写入磁盘的文件中。
接下来,我们通过 RSA 密钥实例的 publickey 方法创建我们的公钥。我们使用方法链调用 publickey 和 exportKey 方法生成公钥,同样将它写入磁盘上的文件。
加密文件
有了私钥和公钥之后,我们就可以加密一些数据,并写入文件了。这里有个比较标准的例子:
from Crypto.PublicKey import RSA from Crypto.Random import get_random_bytes from Crypto.Cipher import AES, PKCS1_OAEP with open('/path/to/encrypted_data.bin', 'wb') as out_file: recipient_key = RSA.import_key( open('/path_to_public_key/my_rsa_public.pem').read()) session_key = get_random_bytes(16) cipher_rsa = PKCS1_OAEP.new(recipient_key) out_file.write(cipher_rsa.encrypt(session_key)) cipher_aes = AES.new(session_key, AES.MODE_EAX) data = b'blah blah blah Python blah blah' ciphertext, tag = cipher_aes.encrypt_and_digest(data) out_file.write(cipher_aes.nonce) out_file.write(tag) out_file.write(ciphertext)
代码的前三行导入 PyCryptodome 包。然后我们打开一个文件用于写入数据。接着我们导入公钥赋给一个变量,创建一个 16 字节的会话密钥。在这个例子中,我们将使用混合加密方法,即 PKCS#1 OAEP ,也就是最优非对称加密填充。这允许我们向文件中写入任意长度的数据。接着我们创建 AES 加密,要加密的数据,然后加密数据。我们将得到加密的文本和消息认证码。最后,我们将随机数,消息认证码和加密的文本写入文件。
顺便提一下,随机数通常是真随机或伪随机数,只是用来进行密码通信的。对于 AES 加密,其密钥长度最少是 16 个字节。随意用一个你喜欢的编辑器试着打开这个被加密的文件,你应该只能看到乱码。
现在让我们学习如何解密我们的数据。
from Crypto.PublicKey import RSA from Crypto.Cipher import AES, PKCS1_OAEP code = 'nooneknows' with open('/path/to/encrypted_data.bin', 'rb') as fobj: private_key = RSA.import_key( open('/path_to_private_key/my_rsa_key.pem').read(), passphrase=code) enc_session_key, nonce, tag, ciphertext = [ fobj.read(x) for x in (private_key.size_in_bytes(), 16, 16, -1) ] cipher_rsa = PKCS1_OAEP.new(private_key) session_key = cipher_rsa.decrypt(enc_session_key) cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce) data = cipher_aes.decrypt_and_verify(ciphertext, tag) print(data)
如果你认真看了上一个例子,这段代码应该很容易解析。在这里,我们先以二进制模式读取我们的加密文件,然后导入私钥。注意,当你导入私钥时,需要提供一个密码,否则会出现错误。然后,我们文件中读取数据,首先是加密的会话密钥,然后是 16 字节的随机数和 16 字节的消息认证码,最后是剩下的加密的数据。
接下来我们需要解密出会话密钥,重新创建 AES 密钥,然后解密出数据。
你还可以用 PyCryptodome 库做更多的事。不过我们要接着讨论在 Python 中还可以用什么来满足我们加密解密的需求。
cryptography 包
cryptography 的目标是成为“人类易于使用的密码学包cryptography for humans”,就像 requests 是“人类易于使用的 HTTP 库HTTP for Humans”一样。这个想法使你能够创建简单安全、易于使用的加密方案。如果有需要的话,你也可以使用一些底层的密码学基元,但这也需要你知道更多的细节,否则创建的东西将是不安全的。
如果你使用的 Python 版本是 3.5, 你可以使用 pip 安装,如下:
pip install cryptography
你会看到 cryptography 包还安装了一些依赖包(LCTT 译注:如 libopenssl-devel)。如果安装都顺利,我们就可以试着加密一些文本了。让我们使用 Fernet 对称加密算法,它保证了你加密的任何信息在不知道密码的情况下不能被篡改或读取。Fernet 还通过 MultiFernet 支持密钥轮换。下面让我们看一个简单的例子:
>>> from cryptography.fernet import Fernet >>> cipher_key = Fernet.generate_key() >>> cipher_key b'APM1JDVgT8WDGOWBgQv6EIhvxl4vDYvUnVdg-Vjdt0o=' >>> cipher = Fernet(cipher_key) >>> text = b'My super secret message' >>> encrypted_text = cipher.encrypt(text) >>> encrypted_text (b'gAAAAABXOnV86aeUGADA6mTe9xEL92y_m0_TlC9vcqaF6NzHqRKkjEqh4d21PInEP3C9HuiUkS9f' b'6bdHsSlRiCNWbSkPuRd_62zfEv3eaZjJvLAm3omnya8=') >>> decrypted_text = cipher.decrypt(encrypted_text) >>> decrypted_text b'My super secret message'
首先我们需要导入 Fernet,然后生成一个密钥。我们输出密钥看看它是什么样儿。如你所见,它是一个随机的字节串。如果你愿意的话,可以试着多运行 generate_key 方法几次,生成的密钥会是不同的。然后我们使用这个密钥生成 Fernet 密码实例。
现在我们有了用来加密和解密消息的密码。下一步是创建一个需要加密的消息,然后使用 encrypt 方法对它加密。我打印出加密的文本,然后你可以看到你再也读不懂它了。为了解密出我们的秘密消息,我们只需调用 decrypt 方法,并传入加密的文本作为参数。结果就是我们得到了消息字节串形式的纯文本。
小结
这一章仅仅浅显地介绍了 PyCryptodome 和 cryptography 这两个包的使用。不过这也确实给了你一个关于如何加密解密字符串和文件的简述。请务必阅读文档,做做实验,看看还能做些什么!
위 내용은 Python3의 암호화 및 복호화에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Windows 운영 체제는 세계에서 가장 인기 있는 운영 체제 중 하나이며, 새로운 버전의 Win11이 많은 주목을 받았습니다. Win11 시스템에서 관리자 권한을 얻는 것은 사용자가 시스템에서 더 많은 작업과 설정을 수행할 수 있도록 하는 중요한 작업입니다. 이번 글에서는 Win11 시스템에서 관리자 권한을 얻는 방법과 권한을 효과적으로 관리하는 방법을 자세히 소개하겠습니다. Win11 시스템에서 관리자 권한은 로컬 관리자와 도메인 관리자의 두 가지 유형으로 나뉩니다. 로컬 관리자는 로컬 컴퓨터에 대한 모든 관리 권한을 갖습니다.

OracleSQL의 나눗셈 연산에 대한 자세한 설명 OracleSQL에서 나눗셈 연산은 두 숫자를 나눈 결과를 계산하는 데 사용되는 일반적이고 중요한 수학 연산입니다. 나누기는 데이터베이스 쿼리에 자주 사용되므로 OracleSQL에서 나누기 작업과 사용법을 이해하는 것은 데이터베이스 개발자에게 필수적인 기술 중 하나입니다. 이 기사에서는 OracleSQL의 나누기 작업 관련 지식을 자세히 설명하고 독자가 참고할 수 있는 특정 코드 예제를 제공합니다. 1. OracleSQL의 Division 연산

Apple 휴대폰에서 사용자는 필요에 따라 사진 앨범을 암호화할 수 있습니다. 일부 사용자는 설정 방법을 모릅니다. 암호화해야 할 사진을 메모에 추가한 후 메모를 잠글 수 있습니다. 다음으로 관심 있는 사용자들을 위해 편집자가 모바일 사진 앨범 암호화 설정 방법을 소개합니다. Apple 휴대폰 튜토리얼 iPhone 사진 앨범 암호화 설정 방법 A: 암호화해야 할 사진을 메모에 추가한 후 자세한 소개를 위해 메모 잠금으로 이동합니다. 1. 사진 앨범에 들어가서 암호화해야 할 사진을 선택합니다. 암호화한 후 아래의 [추가]를 클릭하세요. 2. [메모에 추가]를 선택하세요. 3. 메모를 입력하고, 방금 작성한 메모를 찾아 입력한 후 오른쪽 상단의 [보내기] 아이콘을 클릭하세요. 4. 아래 [기기 잠금]을 클릭하세요.

PHP의 모듈로 연산자(%)는 두 숫자를 나눈 나머지를 구하는 데 사용됩니다. 이 글에서는 모듈로 연산자의 역할과 사용법을 자세히 논의하고 독자의 이해를 돕기 위해 구체적인 코드 예제를 제공합니다. 1. 모듈로 연산자의 역할 수학에서는 정수를 다른 정수로 나누면 몫과 나머지가 나옵니다. 예를 들어 10을 3으로 나누면 몫은 3이고 나머지는 1입니다. 이 나머지를 얻기 위해 모듈로 연산자가 사용됩니다. 2. 모듈러스 연산자의 사용법 PHP에서는 모듈러스를 나타내기 위해 % 기호를 사용합니다.

Linux 시스템 호출 system() 함수에 대한 자세한 설명 시스템 호출은 Linux 운영 체제에서 매우 중요한 부분으로 시스템 커널과 상호 작용하는 방법을 제공합니다. 그 중 system() 함수는 흔히 사용되는 시스템 호출 함수 중 하나이다. 이 기사에서는 system() 함수의 사용법을 자세히 소개하고 해당 코드 예제를 제공합니다. 시스템 호출의 기본 개념 시스템 호출은 사용자 프로그램이 운영 체제 커널과 상호 작용하는 방법입니다. 사용자 프로그램은 시스템 호출 기능을 호출하여 운영 체제를 요청합니다.

편집기에서는 세 가지 암호화 및 압축 방법을 소개합니다. 방법 1: 암호화 가장 간단한 암호화 방법은 파일을 암호화할 때 설정하려는 비밀번호를 입력하면 암호화 및 압축이 완료됩니다. 방법 2: 자동 암호화 일반 암호화 방법에서는 각 파일을 암호화할 때 비밀번호를 입력해야 합니다. 많은 수의 압축 패키지를 암호화하려는 경우 비밀번호가 동일하면 WinRAR에서 자동 암호화를 설정할 수 있습니다. 파일을 정상적으로 압축하면 WinRAR은 압축된 각 패키지에 비밀번호를 추가합니다. 방법은 다음과 같습니다: WinRAR을 열고 설정 인터페이스에서 옵션-설정을 클릭한 후 [압축]으로 전환하고 기본 구성 생성-비밀번호 설정을 클릭합니다. 여기에 설정하려는 비밀번호를 입력하고 확인을 클릭하여 설정을 완료합니다. 교정하다

EZVIZ Cloud에서 비디오를 암호화 해제하는 방법: EZVIZ Cloud에서 비디오를 암호화 해제하는 방법에는 여러 가지가 있으며 그 중 하나는 EZVIZ Cloud 모바일 앱을 사용하는 것입니다. 사용자는 장치 목록에 들어가서 암호를 해독할 카메라를 선택하고 장치 세부 정보 페이지에 들어가기만 하면 됩니다. 장치 세부 정보 페이지에서 "설정" 옵션을 찾은 다음 "비디오 암호화"를 선택하여 관련 설정을 지정합니다. 비디오 암호화 설정 인터페이스에서 비디오 암호화를 끄는 옵션을 선택하고 설정을 저장하여 암호 해독 작업을 완료할 수 있습니다. 이 간단한 단계를 통해 사용자는 쉽게 비디오의 암호를 해독할 수 있으며 카메라 사용 편의성이 향상됩니다. EZVIZ Cloud의 컴퓨터 클라이언트를 사용하는 경우 유사한 단계를 통해 비디오 암호화를 취소할 수도 있습니다. 로그인하여 해당 카메라를 선택하고 장치 세부 정보 인터페이스로 들어간 다음 설정에서 비디오 추가를 찾으세요.

원저자: Meteor, ChainCatcher 원편집자: Marco, ChainCatcher 최근 전체 체인 상호 운용성 프로토콜인 Analog가 1,600만 달러의 자금 조달을 공개하면서 대중의 주목을 받았습니다. 투자 기관으로는 TribeCapital, NGCVentures, Wintermute, GSR, NEAR, OrangeDAO가 있습니다. , Mike Novogratz의 대체 자산 관리 회사 Samara Asset Group, Balaji Srinivasan 등 2023년 말, Analog는 X 플랫폼의 공개 테스트넷 등록 이벤트에 대한 정보를 공개하여 업계에 소란을 일으켰습니다.
