Maison  >  Article  >  développement back-end  >  Introduction au chiffrement, au décryptage et à l'encodage et décodage base64 de Python RSA

Introduction au chiffrement, au décryptage et à l'encodage et décodage base64 de Python RSA

高洛峰
高洛峰original
2017-03-21 09:12:102711parcourir

Récemment, il est devenu nécessaire d'étudier la sécurité du cryptage et du décryptage RSA ; j'ai consulté des exemples d'articles sur Baidu en ligne, et il existe peu d'articles sur la façon de sauvegarder, de transmettre et d'imprimer des informations textuelles cryptées, et ils sont tous pareils. Directement dans un script, les informations textuelles cryptées sont affectées à la variable , puis le décryptage est immédiatement appelé. Après avoir soigneusement réfléchi au processus de cryptage et de décryptage RSA, j'ai déterminé qu'il y a deux extrémités. L'une est l'extrémité du cryptage et l'autre l'extrémité du décryptage. Généralement, elles ne sont pas sur la même machine. Ici, j'ai seulement simulé sa sauvegarde dans un fichier puis sa lecture ; la méthode de transmission via le réseau est similaire.

Le texte chiffré avec RSA ne peut pas être directement affiché sous forme de texte car certaines données binaires ne peuvent pas être affichées à l'aide du codage d'informations textuelles. Pour l'enregistrement, la transmission réseau et l'impression sans caractères tronqués, le codage base64 est requis pour la conversion ; le codage et le décodage base64 peuvent convertir certaines données binaires qui ne peuvent pas être directement codées avec les informations du fichier en données binaires normales.

#/usr/bin/env python
# -*- coding: utf-8 -*-
import rsa
import sys
import base64

# 打印 python 版本 与 windows 系统编码
print("---- 1 ----")
print(sys.version)
print(sys.getdefaultencoding())
print(sys.getfilesystemencoding())

# 先生成一对密钥,然后保存.pem格式文件,当然也可以直接使用
print("---- 2 ----")
(pubkey, privkey) = rsa.newkeys(1024)
pub = pubkey.save_pkcs1()
print(type(pub))
pubfile = open('public.pem','w+')
pubfile.write(pub.decode('utf-8'))
pubfile.close()

print("---- 3 ----")
pri = privkey.save_pkcs1()
print(type(pri))
prifile = open('private.pem','w+')
prifile.write(pri.decode('utf-8'))
prifile.close()

# load公钥和密钥
print("---- 4 ----")
message = 'dPabdbGDpFTrwwgydVafdlsadlfsal%46645645s'
print('message:',type(message))
with open('public.pem') as publickfile:
    p = publickfile.read()
    print(type(p))
    pubkey = rsa.PublicKey.load_pkcs1(p.encode('utf-8'))
with open('private.pem') as privatefile:
    p = privatefile.read()
    print(type(p))
    privkey = rsa.PrivateKey.load_pkcs1(p.encode('utf-8'))

# 用公钥加密、再用私钥解密
crypto = rsa.encrypt(message.encode('utf-8'),pubkey)
print(crypto)

print("---- 5 ----")
print('crypto:',type(crypto))
print('cry_base64:',base64.encodestring(crypto))
print('cry_base64_utf8:',base64.encodestring(crypto).decode('utf-8'))
# 保存到本地文件
cry_file = open('cry_file.txt','w+')
cry_file.write(base64.encodestring(crypto).decode('utf-8'))
cry_file.close()

print("---- 6 ----")
# 从本地文件读取
cry_file = open('cry_file.txt','r')
cry_text = ''
for i in cry_file.readlines():
    cry_text += i

print('cry_text_type:',type(cry_text))
print('cry_text:',cry_text)
print('cry_base64:',cry_text.encode('utf-8'))
crypto_tra = base64.decodestring(cry_text.encode('utf-8'))

print("---- 7 ----")
assert crypto == crypto_tra
print(crypto)

print("---- 8 ----")
plaintext = rsa.decrypt(crypto,privkey)
assert  message == plaintext.decode('utf-8')
print(plaintext.decode('utf-8'))


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn