• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > python有证书的加密解密实现方法

python有证书的加密解密实现方法

作者:shichen2014 字体:[增加 减小] 来源:互联网

shichen2014 通过本文主要向大家介绍了python证书,笨方法学 python,笨方法学python pdf,笨方法学python第四版,python 静态方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了python有证书的加密解密实现方法。分享给大家供大家参考。具体实现方法如下:

最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,刚好也有时间我就总结了一下python在加密与解密这块的代码,今后可能还能用的上。相对于php而言python这块加解密组件较多的,分别是:

python-crypto - 这个组件是基本组件,使用的函式相对比较复杂。
ezPyCrypto - 相对简单,但他作出来的公私钥无法与其他程序相兼容     SSLCrypto - 与 ezPyCrypto 是相同一个作者开发,效率上要比ezPyCrypto 好。但一样不能与其它程序相兼容。
pyopenssl - 似乎是用在https 通讯上的,而我找不到加解密的用法。
M2Crypto - 终于让我找到了,但它有一大缺点,它底层是用 SWIG 与 OpenSSL 交接的。
在Windows安装SWIG 程序是非常难的。

我选择使用的是M2Crypto,公钥与私钥证书生成有两个方式,一种采用RSA生成,另一种是X509生成。我就把这两种加解密代码分享出来,供大家参考,但转载或使用时请写明出处。

一、 RSA标准方式生成的证书

1.加密解密、加密签名、验证加密签名
import os
import M2Crypto
#随机数生成器(1024位随机)
M2Crypto.Rand.rand_seed(os.urandom(1024))
#生成一个1024位公钥与私密钥证书
Geekso = M2Crypto.RSA.gen_key(1024, 65537)
Geekso.save_key('jb51.net-private.pem', None)
Geekso.save_pub_key('jb51.net-public.pem')
#使用公钥证书加密开始
WriteRSA = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
CipherText = WriteRSA.public_encrypt("这是一个秘密消息,只能用私钥进行解密",M2Crypto.RSA.pkcs1_oaep_padding)
print "加密的串是:"
print CipherText.encode('base64')
#对加密串进行签名
MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
MsgDigest.update(CipherText)
#提示,这里也可以使用私钥签名
#WriteRSA = M2Crypto.RSA.load_key ('jb51.net-private.pem')
#Signature = WriteRSA.sign_rsassa_pss(MsgDigest.digest())
Signature = Geekso.sign_rsassa_pss(MsgDigest.digest())
print "签名的串是:"
print Signature.encode('base64')
#使用私钥证书解密开始
ReadRSA = M2Crypto.RSA.load_key ('jb51.net-private.pem')
try:
    PlainText = ReadRSA.private_decrypt (CipherText, M2Crypto.RSA.pkcs1_oaep_padding)
except:
    print "解密错误"
    PlainText = ""
if PlainText :
   print "解密出来的串是:"
   print PlainText
   # 验证加密串的签名
   MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
   MsgDigest.update(CipherText)
   #提示,如果是用私钥签名的那就用公钥验证
   #VerifyRSA = M2Crypto.RSA.load_pub_key('Alice-public.pem')
   #VerifyRSA.verify_rsassa_pss(MsgDigest.digest(), Signature)
   if Geekso.verify_rsassa_pss(MsgDigest.digest(), Signature) == 1:
       print "签名正确"
   else:
       print "签名不正确"</div>

2.字符串生成签名、验证签名
SignEVP = M2Crypto.EVP.load_key('jb51.net-private.pem')
SignEVP.sign_init()
SignEVP.sign_update('来自这一客(http://www.jb51.net)的签名串')
StringSignature = SignEVP.sign_final()
print "签名串是:"
print StringSignature.encode('base64')
#用公钥验证签名
PubKey = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
VerifyEVP = M2Crypto.EVP.PKey()
VerifyEVP.assign_rsa(PubKey)
VerifyEVP.verify_init()
VerifyEVP.verify_update('来自这一客(http://www.jb51.net)的签名串')
if VerifyEVP.verify_final(StringSignature) == 1:
    print "字符串被成功验证。"
else:
    print "字符串验证失败!"</div>

3.给证书加上密码

给证书加密码的好处是即使证书被人拿了,没有密码也用不了。
    return '4567890'</div>
生成证书时用
使用证书时用
二、 X509标准方式生成的证书

1.生成证书、公钥文件、私钥文件
from M2Crypto import X509, EVP, RSA, ASN1
def issuer_name():
    """
    证书发行人名称(专有名称)。
    Parameters:
        none
    Return:
        X509标准的发行人obj.
    """
    issuer = X509.X509_Name()
    issuer.C = "CN"                # 国家名称
    issuer.CN = "*.jb51.net"       # 普通名字
    issuer.ST = "Hunan Changsha"
    issuer.L = "Hunan Changsha"
    issuer.O = "Geekso Company Ltd"
    issuer.OU = "Geekso Company Ltd"
    issuer.Email = "123456@qq.com"
    return issuer
def make_request(bits, cn):
    """
    创建一个X509标准的请求。
    Parameters:
        bits = 证书位数
        cn = 证书名称
    Return:
        返回 X509 request 与 private key (EVP).
    """
    rsa = RSA.gen_key(bits, 65537, None)
    pk = EVP.PKey()
    pk.assign_rsa(rsa)
    req = X509.Request()
    req.set_pubkey(pk)
    name = req.get_subject()
    name.C = "US"
    name.CN = cn
    req.sign(pk,'sha256')
    return req, pk
def make_certificate_valid_time(cert, days):
    """
    从当前时间算起证书有效期几天。
    Parameters:
        cert = 证书obj
        days = 证书过期的天数
    Return:
        none
    """

您可能想查找下面的文章:

  • python有证书的加密解密实现方法
  • python有证书的加密解密实现方法

相关文章

  • python简单程序读取串口信息的方法
  • python使用PIL缩放网络图片并保存的方法
  • 简单使用Python自动生成文章
  • Python Django使用forms来实现评论功能
  • python获取指定路径下所有指定后缀文件的方法
  • Python实现快速排序和插入排序算法及自定义排序的示例
  • Python多线程编程(七):使用Condition实现复杂同步
  • python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
  • Python中type的构造函数参数含义说明
  • Python的Django应用程序解决AJAX跨域访问问题的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Python中线程编程之threading模块的使用详解
    • Python中基本的日期时间处理的学习教程
    • 简介Python的collections模块中defaultdict类型的用法
    • Python 内置函数complex详解
    • 结合Python的SimpleHTTPServer源码来解析socket通信
    • 基于python实现的抓取腾讯视频所有电影的爬虫
    • python读取Android permission文件
    • 在Python程序中操作文件之flush()方法的使用教程
    • python 装饰器功能以及函数参数使用介绍
    • Python基础教程之tcp socket编程详解及简单实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有