├── .gitattributes ├── .idea ├── encodings.xml ├── flaskTest.iml ├── misc.xml ├── modules.xml ├── scopes │ └── scope_settings.xml ├── vcs.xml └── workspace.xml ├── .vscode ├── launch.json └── settings.json ├── README.md ├── __init__.py ├── app.py ├── app.pyc ├── cer ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── config.py ├── csr ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── des ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── feis ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── hashs ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── requirements.txt ├── rsa ├── __init__.py ├── __init__.pyc ├── app.py ├── app.pyc ├── base.py ├── base.pyc ├── views.py └── views.pyc ├── run.py ├── static ├── cm-font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.svg.bak │ ├── iconfont.ttf │ └── iconfont.woff ├── common.css ├── images │ ├── float_img1.png │ └── pay │ │ ├── alibaba.png │ │ └── weixin.png └── layui-v2.2.45 │ └── layui │ ├── css │ ├── layui.css │ ├── layui.mobile.css │ └── modules │ │ ├── code.css │ │ ├── laydate │ │ └── default │ │ │ └── laydate.css │ │ └── layer │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ ├── font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ └── iconfont.woff │ ├── images │ └── face │ │ ├── 0.gif │ │ ├── 1.gif │ │ ├── 10.gif │ │ ├── 11.gif │ │ ├── 12.gif │ │ ├── 13.gif │ │ ├── 14.gif │ │ ├── 15.gif │ │ ├── 16.gif │ │ ├── 17.gif │ │ ├── 18.gif │ │ ├── 19.gif │ │ ├── 2.gif │ │ ├── 20.gif │ │ ├── 21.gif │ │ ├── 22.gif │ │ ├── 23.gif │ │ ├── 24.gif │ │ ├── 25.gif │ │ ├── 26.gif │ │ ├── 27.gif │ │ ├── 28.gif │ │ ├── 29.gif │ │ ├── 3.gif │ │ ├── 30.gif │ │ ├── 31.gif │ │ ├── 32.gif │ │ ├── 33.gif │ │ ├── 34.gif │ │ ├── 35.gif │ │ ├── 36.gif │ │ ├── 37.gif │ │ ├── 38.gif │ │ ├── 39.gif │ │ ├── 4.gif │ │ ├── 40.gif │ │ ├── 41.gif │ │ ├── 42.gif │ │ ├── 43.gif │ │ ├── 44.gif │ │ ├── 45.gif │ │ ├── 46.gif │ │ ├── 47.gif │ │ ├── 48.gif │ │ ├── 49.gif │ │ ├── 5.gif │ │ ├── 50.gif │ │ ├── 51.gif │ │ ├── 52.gif │ │ ├── 53.gif │ │ ├── 54.gif │ │ ├── 55.gif │ │ ├── 56.gif │ │ ├── 57.gif │ │ ├── 58.gif │ │ ├── 59.gif │ │ ├── 6.gif │ │ ├── 60.gif │ │ ├── 61.gif │ │ ├── 62.gif │ │ ├── 63.gif │ │ ├── 64.gif │ │ ├── 65.gif │ │ ├── 66.gif │ │ ├── 67.gif │ │ ├── 68.gif │ │ ├── 69.gif │ │ ├── 7.gif │ │ ├── 70.gif │ │ ├── 71.gif │ │ ├── 8.gif │ │ └── 9.gif │ ├── lay │ └── modules │ │ ├── carousel.js │ │ ├── code.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── table.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js │ ├── layui.all.js │ └── layui.js ├── templates ├── abort.html ├── console.html ├── feis │ ├── asysi.html │ ├── asysi_result.html │ ├── jiajiemi.html │ ├── jiaoyan.html │ ├── jiaoyan_result.html │ ├── priv_xiugai.html │ ├── priv_xiugai_result.html │ ├── pub_priv_double.html │ ├── pub_priv_double_result.html │ ├── tiqu.html │ └── tiqu_result.html ├── gmssl.html ├── index.html ├── logs.html ├── ssl │ ├── ssl_deep.html │ ├── ssl_suites.html │ ├── ssl_woshou.html │ └── vuls_check.html └── tools │ ├── 3des_cipher.html │ ├── aes_cipher.html │ ├── cer_check.html │ ├── cer_check_result.html │ ├── cert_create.html │ ├── cert_create_result.html │ ├── cipher_result.html │ ├── csr_check.html │ ├── csr_check_result.html │ ├── csr_create.html │ ├── csr_create_result.html │ ├── des_cipher.html │ ├── hash.html │ ├── hash_result.html │ ├── pre_cer.html │ ├── pre_cer_result.html │ ├── rsa_check.html │ └── rsa_check_result.html ├── test ├── base.py ├── cer.py ├── create_key.py ├── create_key.pyc ├── csr.pem ├── csr.py ├── csr.txt ├── flaskTest.py ├── key.py ├── rsa.py ├── suites.py ├── test.py ├── whcrc.cer └── x509.py ├── views.py ├── views.pyc ├── wossld.service ├── wsgi.py └── wsgi_config.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=Python 2 | *.css linguist-language=Python 3 | *.html linguist-language=Python 4 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/flaskTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | File Watchers 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Buildout 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 43 | 46 | 47 | 48 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 48 | 49 | 60 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.linting.pylintEnabled": false 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##

OpenSSL管理平台

2 | ### 简介 3 | OpenSSL管理平台为OpenSSL操作提供可视化的界面,方便快捷地完成对称算法、哈希校验、非对称算法、证书管理、SSL安全等操作。 4 | ##### 功能模块: 5 | - 对称算法:AES、DES、Triple DES。 6 | - 哈希校验:MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512、RIPEMD、RIPEMD160、HMAC。 7 | - 非对称算法:私钥的加解密、公钥的解析提取、公私钥对的生成以及加密私钥的密码修改等。 8 | - 证书工具:证书查看、CSR查看、CSR生成、私钥校验、证书格式转换、自签名证书生成。 9 | - SSL检测:握手过程探测、协议/加密套件、SSL常见漏洞扫描。 10 | ##### 开发环境: 11 | 基于Python2.7,具体依赖库请参考requirements或pip install -r requirements在线安装。 12 | ##### 托管 13 | - 官网:http://www.ssleye.com 14 | - 码云:https://gitee.com/wossl33/wossl 15 | - Github:https://github.com/wossl33/wossl 16 | - 交流群:364788699 17 | ### 预览 18 | ![浏览1](https://gitee.com/uploads/images/2018/0102/120319_153356a7_1700467.png "浏览1") 19 | ![浏览2](https://gitee.com/uploads/images/2018/0102/120339_8f796ee9_1700467.png "浏览2") 20 | ![浏览3](https://gitee.com/uploads/images/2018/0102/120352_90554ee3_1700467.png "浏览3") 21 | ### 项目部署 22 | ##### 测试环境 23 | 切换至工作目录,运行python run.py 24 | ##### 生产环境 25 | 推荐:nginx + gunicorn + flask 26 |
例如Centos 7.0下,建立系统服务wossld.service: 27 | ``` 28 | [Unit] 29 | Description=Gunicorn Demo 30 | After=network.target 31 | 32 | [Service] 33 | User=root 34 | Group=root 35 | PIDFile=/tmp/gunicorn.pid 36 | WorkingDirectory=/root/wossl 项目路径 37 | ExecStart=/usr/bin/gunicorn -c wsgi_config.py wsgi:app 38 | ExecReload=/bin/kill -s HUP $MAINPID 39 | ExecStop=/bin/kill -s TERM $MAINPID 40 | 41 | [Install] 42 | WantedBy=multi-user.target 43 | ``` 44 |
服务启动:service wossld start 45 |
服务停止:service wossld stop 46 |
flask生产环境部署请参考:http://docs.jinkan.org/docs/flask/deploying/wsgi-standalone.html 47 | ##### 获取客户端IP: 48 | views.py: 49 | ``` 50 | # 首页 51 | @app.route('/') 52 | def index(): 53 | # 测试环境下获取客户端IP 54 | client_ip=request.remote_addr 55 | # 生产环境下获取客户端IP 56 | ''' 57 | if request.headers['X-Real-IP']: 58 | client_ip=request.headers['X-Real-IP'] 59 | else: 60 | client_ip=request.headers['X-Forwarded-For'] 61 | ''' 62 | return render_template('index.html',client_ip=client_ip) 63 | ``` 64 | ### 更新日志 65 | ###### v1.1.0 66 | - 实现pem格式CSR的结构查看功能,可导出public_key明文。 67 | - 实现pem格式CSR生成功能,可根据RSA、DSA、ECDSA等不同的加密算法,以及加密强度和签名算法,生成CSR和私钥对。 68 | - 实现pem格式证书的结构查看功能,可导出public_key明文。 69 | - 实现公私钥校验功能,可校验证书与私钥、证书与CSR以及CSR与私钥之间的匹配关系。 70 | - 实现私钥的加解密功能,对私钥进行加密,对加密后私钥进行解密。 71 | ###### v1.1.1 72 | - 实现AES、DES、Triple DES加解密。 73 | - 实现MD5、SHA1、SHA256、SHA512等Hash计算。 74 | ###### v1.1.2 75 | - 更改主题颜色 76 | - 实现非对称算法模块中公钥的提取、公钥解析。 77 | - 修复AES、DES和3DES对称算法中CTR模式BUG。 78 | - 实现非对称算法模块中公私钥校验、密码对生成、私钥密码修改。 79 | - 实现证书管理工具模块中自签名证书,支持生成根证书。 80 | ###### v1.2.2 81 | - 增加AES的认证加密算法,支持CCM、EAX、GCM、SIV、OCB等多种加解密模式。 82 | - 增加ChaCha20和Salsa20对称算法。 83 | - 增加公私钥之间PKCS1、PKCS8相互转换 84 | - 增加PEM、PKCS12、JKS证书格式之间相互转换 85 | - 增加AES、DES、3DES及AES加密认证算法中5种填充模式ZeroPadding、Pkcs5Padding、Pkcs7Padding、Iso7816Padding、Ansix923Padding。 86 | ###### v2.1.0 87 | - 增加SSL检测模块中,探测服务端支持的SSL协议及加密套件,并凸显不安全的协议或加密套件。 88 | - 请前往http://www.ssleye.com 89 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | 该文件为程序所在的包,初始化相关信息, 4 | 对执行程序进行模块化处理: 5 | config.py 配置模块 6 | run.py 导入Flask生成的实例并运行 7 | app.py 定义Flask实例,加载配置信息及相关插件引用. 8 | views.py 定义URL路由与执行体的关系 9 | ''' -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Flask 3 | from cer import cer 4 | from csr import csr 5 | from rsa import rsa 6 | from des import des 7 | from hashs import hashs 8 | from feis import feis 9 | 10 | app=Flask(__name__) 11 | 12 | # 加载配置文件 13 | app.config.from_pyfile('config.py') 14 | 15 | # 注册蓝图 16 | app.register_blueprint(cer,url_prefix='/cer') 17 | app.register_blueprint(csr,url_prefix='/csr') 18 | app.register_blueprint(rsa,url_prefix='/rsa') 19 | app.register_blueprint(des,url_prefix='/des') 20 | app.register_blueprint(hashs,url_prefix='/hashs') 21 | app.register_blueprint(feis,url_prefix='/feis') -------------------------------------------------------------------------------- /app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/app.pyc -------------------------------------------------------------------------------- /cer/__init__.py: -------------------------------------------------------------------------------- 1 | from app import cer 2 | import views -------------------------------------------------------------------------------- /cer/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/cer/__init__.pyc -------------------------------------------------------------------------------- /cer/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | cer=Blueprint('cer',__name__,static_folder='static',\ 5 | template_folder='templates') -------------------------------------------------------------------------------- /cer/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/cer/app.pyc -------------------------------------------------------------------------------- /cer/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/cer/base.pyc -------------------------------------------------------------------------------- /cer/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import cer 3 | from base import readCER 4 | from flask import render_template,request 5 | 6 | # 证书查看 7 | @cer.route('/cer_check',methods=['POST']) 8 | def cer_check(): 9 | pem_data=request.form['cer_content'].encode('utf-8') 10 | return render_template('tools/cer_check_result.html',cer_content=readCER(pem_data)) -------------------------------------------------------------------------------- /cer/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/cer/views.pyc -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | #禁止调试模式 4 | DEBUG=True -------------------------------------------------------------------------------- /csr/__init__.py: -------------------------------------------------------------------------------- 1 | from app import csr 2 | import views -------------------------------------------------------------------------------- /csr/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/csr/__init__.pyc -------------------------------------------------------------------------------- /csr/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | csr=Blueprint('csr',__name__,static_folder='static',\ 5 | template_folder='templates') -------------------------------------------------------------------------------- /csr/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/csr/app.pyc -------------------------------------------------------------------------------- /csr/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/csr/base.pyc -------------------------------------------------------------------------------- /csr/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import csr 3 | from base import readCSR,create_csr,create_cert 4 | from flask import render_template,request 5 | 6 | # CSR查看 7 | @csr.route('/csr_check',methods=['POST']) 8 | def csr_check(): 9 | pem_data=request.form['csr_content'].encode('utf-8') 10 | return render_template('tools/csr_check_result.html',csr_content=readCSR(pem_data)) 11 | 12 | # CSR创建 13 | @csr.route('/csr_create',methods=['POST']) 14 | def csr_create(): 15 | com_name=request.form['com_name'].encode('utf-8').decode('utf-8') 16 | bumen_name=request.form['bumen_name'].encode('utf-8').decode('utf-8') 17 | zuzhi_name=request.form['zuzhi_name'].encode('utf-8').decode('utf-8') 18 | city_name=request.form['city_name'].encode('utf-8').decode('utf-8') 19 | shengfen_name=request.form['shengfen_name'].encode('utf-8').decode('utf-8') 20 | guojia_name=request.form['guojia_name'].encode('utf-8').decode('utf-8') 21 | beiyong_name=request.form['beiyong_name'].encode('utf-8').decode('utf-8') 22 | mysf=str(request.form['mysf']) 23 | if str(request.form['myqd']): 24 | myqd=str(request.form['myqd']) 25 | elif mysf == 'ECDSA' and not str(request.form['myqd']): 26 | myqd='P256' 27 | else: 28 | myqd='2048' 29 | 30 | if str(request.form['qmsf']): 31 | qmsf=str(request.form['qmsf']) 32 | else: 33 | qmsf='SHA1' 34 | key_pass=str(request.form['key_pass']) 35 | return render_template('tools/csr_create_result.html',result=create_csr(com_name,bumen_name,zuzhi_name,city_name,shengfen_name,guojia_name,mysf,beiyong_name,myqd,qmsf,key_pass)) 36 | 37 | 38 | # 自签名证书 39 | @csr.route('/cert_create_hander',methods=['POST']) 40 | def cert_create_hander(): 41 | # 主题信息 42 | subject_com_name=request.form['subject_com_name'].encode('utf-8').decode('utf-8') 43 | subject_bumen_name=request.form['subject_bumen_name'].encode('utf-8').decode('utf-8') 44 | subject_zuzhi_name=request.form['subject_zuzhi_name'].encode('utf-8').decode('utf-8') 45 | subject_city_name=request.form['subject_city_name'].encode('utf-8').decode('utf-8') 46 | subject_shengfen_name=request.form['subject_shengfen_name'].encode('utf-8').decode('utf-8') 47 | subject_guojia_name=request.form['subject_guojia_name'].encode('utf-8').decode('utf-8') 48 | beiyong_name=request.form['beiyong_name'].encode('utf-8').decode('utf-8') 49 | # 颁布者信息 50 | issuer_com_name=request.form['issuer_com_name'].encode('utf-8').decode('utf-8') 51 | issuer_zuzhi_name=request.form['issuer_zuzhi_name'].encode('utf-8').decode('utf-8') 52 | issuer_guojia_name=request.form['issuer_guojia_name'].encode('utf-8').decode('utf-8') 53 | # 证书信息 54 | before_time=str(request.form['before_time']) 55 | after_time=str(request.form['after_time']) 56 | mysf=str(request.form['mysf']) 57 | if str(request.form['myqd']): 58 | myqd=str(request.form['myqd']) 59 | elif mysf == 'ECDSA' and not str(request.form['myqd']): 60 | myqd='P256' 61 | else: 62 | myqd='2048' 63 | 64 | if str(request.form['qmsf']): 65 | qmsf=str(request.form['qmsf']) 66 | else: 67 | qmsf='SHA1' 68 | key_pass=str(request.form['key_pass']) 69 | try: 70 | root=request.form['root'] 71 | return render_template('tools/cert_create_result.html',result=create_cert(subject_com_name,subject_bumen_name,subject_zuzhi_name,subject_city_name,subject_shengfen_name,subject_guojia_name,issuer_com_name,issuer_zuzhi_name,issuer_guojia_name,True,before_time,after_time,mysf,beiyong_name,myqd,qmsf,key_pass)) 72 | except Exception,e: 73 | return render_template('tools/cert_create_result.html',result=create_cert(subject_com_name,subject_bumen_name,subject_zuzhi_name,subject_city_name,subject_shengfen_name,subject_guojia_name,issuer_com_name,issuer_zuzhi_name,issuer_guojia_name,False,before_time,after_time,mysf,beiyong_name,myqd,qmsf,key_pass)) 74 | -------------------------------------------------------------------------------- /csr/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/csr/views.pyc -------------------------------------------------------------------------------- /des/__init__.py: -------------------------------------------------------------------------------- 1 | from app import des 2 | import views -------------------------------------------------------------------------------- /des/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/des/__init__.pyc -------------------------------------------------------------------------------- /des/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | des=Blueprint('des',__name__,static_folder='static',\ 5 | template_folder='templates') -------------------------------------------------------------------------------- /des/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/des/app.pyc -------------------------------------------------------------------------------- /des/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/des/base.pyc -------------------------------------------------------------------------------- /des/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import des 3 | from base import encrypt,decrypt 4 | from flask import render_template,request 5 | 6 | @des.route('/aes_encrypt',methods=['POST']) 7 | def aes_encrypt(): 8 | text=bytes(request.form['text'].encode('utf-8')) 9 | key=bytes(request.form['key']) 10 | mode=request.form['mode'] 11 | iv=bytes(request.form['iv']) 12 | out_mode=request.form['out_mode'] 13 | return render_template('tools/cipher_result.html',flag='AES',aes_result=encrypt(text,'AES',key,mode,iv,out_mode)) 14 | 15 | @des.route('/aes_decrypt',methods=['POST']) 16 | def aes_decrypt(): 17 | text=bytes(request.form['text']) 18 | key=bytes(request.form['key']) 19 | mode=request.form['mode'] 20 | iv=bytes(request.form['iv']) 21 | out_mode=request.form['out_mode'] 22 | return render_template('tools/cipher_result.html',flag='AES',aes_result=decrypt(text,'AES',key,mode,iv,out_mode)) 23 | 24 | @des.route('/des_encrypt',methods=['POST']) 25 | def des_encrypt(): 26 | text=bytes(request.form['text'].encode('utf-8')) 27 | key=bytes(request.form['key']) 28 | mode=request.form['mode'] 29 | iv=bytes(request.form['iv']) 30 | out_mode=request.form['out_mode'] 31 | return render_template('tools/cipher_result.html',flag='DES',aes_result=encrypt(text,'DES',key,mode,iv,out_mode)) 32 | 33 | @des.route('/des_decrypt',methods=['POST']) 34 | def des_decrypt(): 35 | text=bytes(request.form['text']) 36 | key=bytes(request.form['key']) 37 | mode=request.form['mode'] 38 | iv=bytes(request.form['iv']) 39 | out_mode=request.form['out_mode'] 40 | return render_template('tools/cipher_result.html',flag='DES',aes_result=decrypt(text,'DES',key,mode,iv,out_mode)) 41 | 42 | @des.route('/tdes_encrypt',methods=['POST']) 43 | def tdes_encrypt(): 44 | text=bytes(request.form['text'].encode('utf-8')) 45 | key=bytes(request.form['key']) 46 | mode=request.form['mode'] 47 | iv=bytes(request.form['iv']) 48 | out_mode=request.form['out_mode'] 49 | return render_template('tools/cipher_result.html',flag='3DES',aes_result=encrypt(text,'3DES',key,mode,iv,out_mode)) 50 | 51 | @des.route('/tdes_decrypt',methods=['POST']) 52 | def tdes_decrypt(): 53 | text=bytes(request.form['text']) 54 | key=bytes(request.form['key']) 55 | mode=request.form['mode'] 56 | iv=bytes(request.form['iv']) 57 | out_mode=request.form['out_mode'] 58 | return render_template('tools/cipher_result.html',flag='3DES',aes_result=decrypt(text,'3DES',key,mode,iv,out_mode)) 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /des/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/des/views.pyc -------------------------------------------------------------------------------- /feis/__init__.py: -------------------------------------------------------------------------------- 1 | from app import feis 2 | import views 3 | -------------------------------------------------------------------------------- /feis/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/feis/__init__.pyc -------------------------------------------------------------------------------- /feis/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | feis=Blueprint('feis',__name__,static_folder='static',\ 5 | template_folder='templates') 6 | -------------------------------------------------------------------------------- /feis/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/feis/app.pyc -------------------------------------------------------------------------------- /feis/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/feis/base.pyc -------------------------------------------------------------------------------- /feis/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import feis 3 | from base import pubkey_tiqu,pubkey_asysi,pub_priv_checker,pub_priv_creater,private_xiugai 4 | from flask import request,render_template 5 | 6 | # 公钥提取 7 | @feis.route('/pub_tiqu') 8 | def pub_tiqu(): 9 | return render_template('feis/tiqu.html') 10 | # 公钥提取处理 11 | @feis.route('/tiqu_hander',methods=['POST']) 12 | def tiqu_hander(): 13 | key_content=request.form['key_content'].encode('utf-8') 14 | key=str(request.form['key']) 15 | if key: 16 | return render_template('feis/tiqu_result.html',tiqu_result=pubkey_tiqu(key_content,key)) 17 | else: 18 | return render_template('feis/tiqu_result.html',tiqu_result=pubkey_tiqu(key_content)) 19 | 20 | @feis.route('/web_pub_get',methods=['POST']) 21 | def web_pub_get(): 22 | key_content=request.form['key_content'].encode('utf-8') 23 | key=str(request.form['key']) 24 | if key: 25 | return render_template('web/public_get_result.html',tiqu_result=pubkey_tiqu(key_content,key)) 26 | else: 27 | return render_template('web/public_get_result.html',tiqu_result=pubkey_tiqu(key_content)) 28 | 29 | 30 | # 公钥解析 31 | @feis.route('/pub_asysi') 32 | def pub_asysi(): 33 | return render_template('feis/asysi.html') 34 | # 公钥解析处理 35 | @feis.route('/asysi_hander',methods=['POST']) 36 | def asysi_hander(): 37 | public_key_content=request.form['public_key_content'].encode('utf-8') 38 | return render_template('feis/asysi_result.html',rep_result=pubkey_asysi(public_key_content)) 39 | 40 | @feis.route('/web_pub_asysi',methods=['POST']) 41 | def web_pub_asysi(): 42 | public_key_content=request.form['public_key_content'].encode('utf-8') 43 | return render_template('web/public_asysi_result.html',rep_result=pubkey_asysi(public_key_content)) 44 | 45 | # 公私钥校验 46 | @feis.route('/pub_priv') 47 | def pub_priv(): 48 | return render_template('feis/jiaoyan.html') 49 | 50 | # 公私钥校验处理 51 | @feis.route('/pub_priv_hander',methods=['POST']) 52 | def pub_priv_hander(): 53 | public_key=request.form['public_key'].encode('utf-8') 54 | private_key=request.form['private_key'].encode('utf-8') 55 | key=str(request.form['key']) 56 | if key: 57 | return render_template('feis/jiaoyan_result.html',jy_result=pub_priv_checker(public_key,private_key,key)) 58 | else: 59 | return render_template('feis/jiaoyan_result.html',jy_result=pub_priv_checker(public_key,private_key)) 60 | 61 | # 公私钥校验处理 62 | @feis.route('/web_pub_priv_hander',methods=['POST']) 63 | def web_pub_priv_hander(): 64 | public_key=request.form['public_key'].encode('utf-8') 65 | private_key=request.form['private_key'].encode('utf-8') 66 | key=str(request.form['key']) 67 | if key: 68 | return render_template('web/pub_priv_jy_result.html',jy_result=pub_priv_checker(public_key,private_key,key)) 69 | else: 70 | return render_template('web/pub_priv_jy_result.html',jy_result=pub_priv_checker(public_key,private_key)) 71 | 72 | # 密钥对生成 73 | @feis.route('/pub_key_create') 74 | def pub_key_create(): 75 | return render_template('feis/pub_priv_double.html') 76 | 77 | @feis.route('/pub_priv_create_hander',methods=['POST']) 78 | def pub_priv_create_hander(): 79 | mysf=str(request.form['mysf']) 80 | if str(request.form['myqd']): 81 | myqd=str(request.form['myqd']) 82 | elif mysf == 'ECDSA' and not str(request.form['myqd']): 83 | myqd='P256' 84 | else: 85 | myqd='2048' 86 | key_pass=str(request.form['key_pass']) 87 | return render_template('feis/pub_priv_double_result.html',result=pub_priv_creater(mysf,myqd,key_pass)) 88 | 89 | 90 | @feis.route('/web_pass_hander',methods=['POST']) 91 | def web_pass_hander(): 92 | mysf=str(request.form['mysf']) 93 | if str(request.form['myqd']): 94 | myqd=str(request.form['myqd']) 95 | elif mysf == 'ECDSA' and not str(request.form['myqd']): 96 | myqd='P256' 97 | else: 98 | myqd='2048' 99 | key_pass=str(request.form['key_pass']) 100 | return render_template('web/pass_double_result.html',result=pub_priv_creater(mysf,myqd,key_pass)) 101 | 102 | # 私钥密码修改 103 | @feis.route('/priv_xiugai') 104 | def priv_xiugai(): 105 | return render_template('feis/priv_xiugai.html') 106 | 107 | @feis.route('/priv_xg_hander',methods=['POST']) 108 | def priv_xg_hander(): 109 | private_key=request.form['priv_content'].encode('utf-8') 110 | old_key=str(request.form['old_key']) 111 | new_key=str(request.form['new_key']) 112 | return render_template('feis/priv_xiugai_result.html',key_reuslt=private_xiugai(private_key,old_key,new_key)) 113 | 114 | @feis.route('/web_priv_xg',methods=['POST']) 115 | def web_priv_xg(): 116 | private_key=request.form['priv_content'].encode('utf-8') 117 | old_key=str(request.form['old_key']) 118 | new_key=str(request.form['new_key']) 119 | return render_template('web/priv_xg_result.html',key_reuslt=private_xiugai(private_key,old_key,new_key)) -------------------------------------------------------------------------------- /feis/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/feis/views.pyc -------------------------------------------------------------------------------- /hashs/__init__.py: -------------------------------------------------------------------------------- 1 | from app import hashs 2 | import views -------------------------------------------------------------------------------- /hashs/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/hashs/__init__.pyc -------------------------------------------------------------------------------- /hashs/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | hashs=Blueprint('hash',__name__,static_folder='static',\ 5 | template_folder='templates') -------------------------------------------------------------------------------- /hashs/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/hashs/app.pyc -------------------------------------------------------------------------------- /hashs/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from Crypto.Hash import HMAC,MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384,SHA512,RIPEMD,RIPEMD160 3 | 4 | def md_sha_hash(flag,text): 5 | hash_text=None 6 | if flag == 'MD2': 7 | h=MD2.new() 8 | h.update(text) 9 | hash_text=h.hexdigest() 10 | elif flag == 'MD4': 11 | h=MD4.new() 12 | h.update(text) 13 | hash_text=h.hexdigest() 14 | elif flag == 'MD5': 15 | h=MD5.new() 16 | h.update(text) 17 | hash_text=h.hexdigest() 18 | elif flag == 'SHA1': 19 | h=SHA1.new() 20 | h.update(text) 21 | hash_text=h.hexdigest() 22 | elif flag == 'SHA224': 23 | h=SHA224.new() 24 | h.update(text) 25 | hash_text=h.hexdigest() 26 | elif flag == 'SHA256': 27 | h=SHA256.new() 28 | h.update(text) 29 | hash_text=h.hexdigest() 30 | elif flag == 'SHA384': 31 | h=SHA384.new() 32 | h.update(text) 33 | hash_text=h.hexdigest() 34 | elif flag == 'SHA512': 35 | h=SHA512.new() 36 | h.update(text) 37 | hash_text=h.hexdigest() 38 | elif flag == 'RIPEMD': 39 | h=RIPEMD.new() 40 | h.update(text) 41 | hash_text=h.hexdigest() 42 | elif flag == 'RIPEMD160': 43 | h=RIPEMD160.new() 44 | h.update(text) 45 | hash_text=h.hexdigest() 46 | else: 47 | return {'error':False,'msg':u'未知hash算法!'} 48 | return {'error':True,'msg':hash_text} 49 | 50 | def hmac_hash(text,key): 51 | h=HMAC.new(key) 52 | h.update(text) 53 | return {'error':True,'msg':h.hexdigest()} 54 | -------------------------------------------------------------------------------- /hashs/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/hashs/base.pyc -------------------------------------------------------------------------------- /hashs/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import hashs 3 | from base import md_sha_hash,hmac_hash 4 | from flask import render_template,request 5 | 6 | @hashs.route('/cry_hash') 7 | def cry_hash(): 8 | return render_template('tools/hash.html') 9 | 10 | @hashs.route('/sha_hash',methods=['POST']) 11 | def sha_hash(): 12 | text=bytes(request.form['text'].encode('utf-8')) 13 | hash_flag=str(request.form['hash']) 14 | if hash_flag == 'HMAC': 15 | key=bytes(request.form['key']) 16 | return render_template('tools/hash_result.html',flag=hash_flag,hash_result=hmac_hash(text,key)) 17 | return render_template('tools/hash_result.html',flag=hash_flag,hash_result=md_sha_hash(hash_flag,text)) -------------------------------------------------------------------------------- /hashs/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/hashs/views.pyc -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | pycrypto 3 | cryptography 4 | gunicorn 5 | -------------------------------------------------------------------------------- /rsa/__init__.py: -------------------------------------------------------------------------------- 1 | from app import rsa 2 | import views -------------------------------------------------------------------------------- /rsa/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/rsa/__init__.pyc -------------------------------------------------------------------------------- /rsa/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Blueprint 3 | #声明定义蓝图,初始化静态文件和模版的加载目录 4 | rsa=Blueprint('rsa',__name__,static_folder='static',\ 5 | template_folder='templates') -------------------------------------------------------------------------------- /rsa/app.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/rsa/app.pyc -------------------------------------------------------------------------------- /rsa/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from cryptography import x509 3 | from cryptography.hazmat.backends import default_backend 4 | from cryptography.hazmat.primitives import serialization 5 | 6 | def cer_csr(cer_pem_data,csr_pem_data): 7 | cer=None 8 | csr=None 9 | try: 10 | cer=x509.load_pem_x509_certificate(cer_pem_data,default_backend()) 11 | except Exception,e: 12 | print e 13 | return {'error':False,'msg':u'证书内容错误!'} 14 | 15 | try: 16 | csr=x509.load_pem_x509_csr(csr_pem_data,default_backend()) 17 | except Exception,e: 18 | print e 19 | return {'error':False,'msg':u'CSR内容错误!'} 20 | 21 | if isinstance(cer,x509.Certificate) and isinstance(csr,x509.CertificateSigningRequest): 22 | # 公钥明文 23 | cer_public_key=cer.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 24 | csr_public_key=csr.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 25 | if cer_public_key == csr_public_key: 26 | return {'error':True,'msg':u'匹配成功!'} 27 | else: 28 | return {'error':False,'msg':u'匹配失败!'} 29 | else: 30 | return {'error':False,'msg':u'证书/CSR内容错误!'} 31 | 32 | def csr_key(csr_pem_data,key_pem_data,key_passwd=None): 33 | csr=None 34 | key=None 35 | 36 | try: 37 | csr=x509.load_pem_x509_csr(csr_pem_data,default_backend()) 38 | except Exception,e: 39 | print e 40 | return {'error':False,'msg':u'CSR内容错误!'} 41 | 42 | try: 43 | key=serialization.load_pem_private_key(key_pem_data,password=key_passwd,backend=default_backend()) 44 | except Exception,e: 45 | print e 46 | return {'error':False,'msg':u'私钥内容错误!'} 47 | if isinstance(csr,x509.CertificateSigningRequest): 48 | csr_public_key=csr.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 49 | key_public_key=key.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 50 | if csr_public_key == key_public_key: 51 | return {'error':True,'msg':u'匹配成功!'} 52 | else: 53 | return {'error':False,'msg':u'匹配失败!'} 54 | else: 55 | return {'error':False,'msg':u'CSR/私钥内容错误!'} 56 | 57 | def cer_key(cer_pem_data,key_pem_data,key_passwd=None): 58 | cer=None 59 | key=None 60 | try: 61 | cer=x509.load_pem_x509_certificate(cer_pem_data,default_backend()) 62 | except Exception,e: 63 | print e 64 | return {'error':False,'msg':u'证书内容错误!'} 65 | try: 66 | key=serialization.load_pem_private_key(key_pem_data,password=key_passwd,backend=default_backend()) 67 | except Exception,e: 68 | print e 69 | return {'error':False,'msg':u'私钥内容错误!'} 70 | if isinstance(cer,x509.Certificate): 71 | # 公钥明文 72 | cer_public_key=cer.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 73 | key_public_key=key.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 74 | if csr_public_key == key_public_key: 75 | return {'error':True,'msg':u'匹配成功!'} 76 | else: 77 | return {'error':False,'msg':u'匹配失败!'} 78 | else: 79 | return {'error':False,'msg':u'证书/私钥内容错误!'} 80 | 81 | def jjm_1(key_pem_data,pass_key): 82 | try: 83 | key=serialization.load_pem_private_key(key_pem_data,password=None,backend=default_backend()) 84 | except Exception,e: 85 | print e 86 | return {'error':False,'msg':u'私钥内容/密码错误!'} 87 | result={} 88 | try: 89 | result['key_string']=key.private_bytes( 90 | encoding=serialization.Encoding.PEM, 91 | format=serialization.PrivateFormat.PKCS8, 92 | encryption_algorithm=serialization.BestAvailableEncryption(pass_key) 93 | ) 94 | except Exception,e: 95 | print e 96 | return {'error':False,'msg':u'密码错误!'} 97 | result['key']=pass_key 98 | return {'error':True,'msg':result} 99 | 100 | def jjm_2(key_pem_data,pass_key): 101 | try: 102 | key=serialization.load_pem_private_key(key_pem_data,password=pass_key,backend=default_backend()) 103 | except Exception,e: 104 | print e 105 | return {'error':False,'msg':u'私钥内容/密码错误!'} 106 | result={} 107 | try: 108 | result['key_string']=key.private_bytes( 109 | encoding=serialization.Encoding.PEM, 110 | format=serialization.PrivateFormat.PKCS8, 111 | encryption_algorithm=serialization.NoEncryption() 112 | ) 113 | except Exception,e: 114 | print e 115 | return {'error':False,'msg':u'密码错误!'} 116 | result['key']=pass_key 117 | return {'error':True,'msg':result} 118 | -------------------------------------------------------------------------------- /rsa/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/rsa/base.pyc -------------------------------------------------------------------------------- /rsa/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import rsa 3 | from base import cer_csr,cer_key,csr_key,jjm_1,jjm_2 4 | from flask import render_template,request 5 | 6 | @rsa.route('/rsa_check',methods=['POST']) 7 | def rsa_check(): 8 | req_cer_csr=request.form['cer_csr'].encode('utf-8') 9 | csr_pri=request.form['csr_pri'].encode('utf-8') 10 | key=str(request.form['key']) 11 | if int(request.form['suite_type']) == 1: 12 | if key: 13 | return render_template('tools/rsa_check_result.html',rsa_check_r=cer_key(req_cer_csr,csr_pri,key)) 14 | else: 15 | return render_template('tools/rsa_check_result.html',rsa_check_r=cer_key(req_cer_csr,csr_pri)) 16 | elif int(request.form['suite_type']) == 2: 17 | return render_template('tools/rsa_check_result.html',rsa_check_r=cer_csr(req_cer_csr,csr_pri)) 18 | elif int(request.form['suite_type']) == 3: 19 | if key: 20 | return render_template('tools/rsa_check_result.html',rsa_check_r=csr_key(req_cer_csr,csr_pri,key)) 21 | else: 22 | return render_template('tools/rsa_check_result.html',rsa_check_r=csr_key(req_cer_csr,csr_pri)) 23 | else: 24 | return render_template('tools/rsa_check_result.html',rsa_check_r={'msg':u'校验类型有误!'}) 25 | 26 | @rsa.route('/pre_cer',methods=['POST']) 27 | def pre_cer(): 28 | priv_content=request.form['priv_content'].encode('utf-8') 29 | key=str(request.form['key']) 30 | if int(request.form['jjm_type']) == 1: 31 | return render_template('tools/pre_cer_result.html',key_reuslt=jjm_1(priv_content,key)) 32 | elif int(request.form['jjm_type']) == 2: 33 | return render_template('tools/pre_cer_result.html',key_reuslt=jjm_2(priv_content,key)) 34 | else: 35 | return render_template('tools/pre_cer_result.html',key_reuslt={'error':True,'msg':u'异常错误!'}) -------------------------------------------------------------------------------- /rsa/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/rsa/views.pyc -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from app import app 3 | from views import * 4 | 5 | # 测试环境 6 | if __name__ == '__main__': 7 | app.run(host='127.0.0.1',port=8888) -------------------------------------------------------------------------------- /static/cm-font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/cm-font/iconfont.eot -------------------------------------------------------------------------------- /static/cm-font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/cm-font/iconfont.ttf -------------------------------------------------------------------------------- /static/cm-font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/cm-font/iconfont.woff -------------------------------------------------------------------------------- /static/common.css: -------------------------------------------------------------------------------- 1 | html,body{ 2 | margin: 0; 3 | padding: 0; 4 | height: 100%; 5 | } 6 | a.header-logo{ 7 | font-weight:400; 8 | color:#f2f2f2; 9 | } 10 | a.header-logo:hover{ 11 | font-weight:400; 12 | color:#f2f2f2; 13 | } 14 | .div_footer{ 15 | width: 100%; 16 | text-align: center; 17 | height: 120px; 18 | background-color: #393D49; 19 | display:table; 20 | margin-top: 20px; 21 | } 22 | .div_footer_div{ 23 | color: rgba(255,255,255,.7); 24 | display:table-cell; 25 | vertical-align:middle; 26 | } 27 | .fly_header{ 28 | position: fixed; 29 | left: 0; 30 | top: 0; 31 | z-index: 10000; 32 | width: 100%; 33 | height: 60px; 34 | border-radius: 0; 35 | } 36 | .layui-btn{ 37 | background-color:#00c1de; 38 | } 39 | .layui-nav-child{ 40 | top:60px; 41 | padding: 0 0 42 | } 43 | .layui-nav .layui-nav-child a:hover{ 44 | background-color:#00c1de; 45 | color: #f2f2f2; 46 | } 47 | .layui-nav .layui-nav-child dd.layui-this a, .layui-nav-child dd.layui-this{ 48 | background-color:#00c1de; 49 | color: #f2f2f2; 50 | } 51 | .layui-form-checked, .layui-form-checked:hover { 52 | border-color: #00c1de; 53 | } 54 | .layui-form-checked span, .layui-form-checked:hover span { 55 | background-color: #00c1de; 56 | } 57 | .layui-form-checked i, .layui-form-checked:hover i { 58 | color: #00c1de; 59 | } 60 | .layui-form-danger:focus{ 61 | border-color: #00c1de !important; 62 | box-shadow: 0 0 5px rgba(81, 203, 238, 1); 63 | -webkit-box-shadow: 0 0 5px rgba(81, 203, 238, 1); 64 | -moz-box-shadow: 0 0 5px rgba(81, 203, 238, 1); 65 | } 66 | .layui-form-radio i:hover, .layui-form-radioed i{ 67 | color: #00c1de; 68 | } 69 | .footer_a a{ 70 | color: #777; 71 | } 72 | .layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after { 73 | background: none; 74 | } 75 | .layui-form-item-input { 76 | margin-bottom: 0px; 77 | clear: both; 78 | *zoom: 1; 79 | } 80 | .zhong_biaoti{ 81 | color:#00c1de; 82 | } 83 | .zhong_biaoti_index{ 84 | color:#393D49; 85 | } 86 | .layui-textarea { 87 | min-height: 100px; 88 | height: auto; 89 | padding: 6px 10px; 90 | resize: vertical; 91 | color: #393D49; 92 | } 93 | .layui-form-select dl dd.layui-this { 94 | background-color: #00c1de; 95 | color: #fff; 96 | } 97 | .layui-col-space10{ 98 | margin-bottom: -20px; 99 | } -------------------------------------------------------------------------------- /static/images/float_img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/images/float_img1.png -------------------------------------------------------------------------------- /static/images/pay/alibaba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/images/pay/alibaba.png -------------------------------------------------------------------------------- /static/images/pay/weixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/images/pay/weixin.png -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/font/iconfont.eot -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/font/iconfont.woff -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/0.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/1.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/10.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/11.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/12.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/13.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/14.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/15.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/16.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/17.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/18.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/19.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/2.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/20.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/21.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/22.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/23.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/24.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/25.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/26.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/27.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/28.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/29.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/3.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/30.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/31.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/32.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/33.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/34.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/35.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/36.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/37.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/38.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/39.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/4.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/40.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/41.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/42.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/43.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/44.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/45.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/46.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/47.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/48.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/49.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/5.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/50.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/51.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/52.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/53.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/54.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/55.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/56.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/57.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/58.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/59.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/6.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/60.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/61.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/62.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/63.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/64.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/65.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/66.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/67.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/68.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/69.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/7.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/70.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/71.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/8.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/static/layui-v2.2.45/layui/images/face/9.gif -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('
'+d+"
");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),skip:function(){return['到第','','页',""].join("")}()};return['
',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
"].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
    '),s=o(["
  • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
  • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
    '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /static/layui-v2.2.45/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.45 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,o,a="layui-fixbar",r="layui-fixbar-top",n=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
      ',e.bar1?'
    • '+c[0]+"
    • ":"",e.bar2?'
    • '+c[1]+"
    • ":"",'
    • '+c[2]+"
    • ","
    "].join("")),s=g.find("."+r),u=function(){var t=n.scrollTop();t>=e.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&g.css(e.css),l.append(g),u(),g.find("li").on("click",function(){var i=t(this),o=i.attr("lay-type");"top"===o&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,o)}),n.on("scroll",function(){clearTimeout(o),o=setTimeout(function(){u()},100)}))},countdown:function(e,t,i){var o=this,a="function"==typeof t,r=new Date(e).getTime(),n=new Date(!t||a?(new Date).getTime():t).getTime(),l=r-n,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var g=setTimeout(function(){o.countdown(e,n+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,o=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>6912e5?(a=new Date(e),o[0][0]=i.digit(a.getFullYear(),4),o[0][1]=i.digit(a.getMonth()+1),o[0][2]=i.digit(a.getDate()),t||(o[1][0]=i.digit(a.getHours()),o[1][1]=i.digit(a.getMinutes()),o[1][2]=i.digit(a.getSeconds())),o[0].join("-")+" "+o[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var o=e.length;o0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?p.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var p=this,y=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(p.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(y.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),p;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?y+"lay/":/^\{\/\}/.test(p.modules[f])?"":o.base||"")+(p.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return p},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,p=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function y(){return++p>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(y,100))}(),a)},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,"").replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o){if(t=t||"layui",e.JSON&&e.JSON.parse){if(null===o)return delete localStorage[t];o="object"==typeof o?o:{key:o};try{var n=JSON.parse(localStorage[t])}catch(r){var n={}}return"value"in o&&(n[o.key]=o.value),o.remove&&delete n[o.key],localStorage[t]=JSON.stringify(n),o.key?n[o.key]:n}},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r 2 | /* 宫格 */ 3 | .site-doc-icon{margin-bottom: 50px; font-size: 0;color: #393D49;} 4 | .site-doc-icon li{display: inline-block; vertical-align: middle; width: 127px; line-height: 40px; padding: 30px; margin-right: -1px; margin-bottom: -1px; border: 1px solid #e2e2e2; font-size: 14px; text-align: center; color: #00c1de; transition: all .3s; -webkit-transition: all .3s;} 5 | .site-doc-icon li .layui-icon{display: inline-block; font-size: 36px;} 6 | 7 | .site-doc-icon li .fontclass{display: none;} 8 | .site-doc-icon li:hover{background-color: #F0F0F0; color: #00c1de;} 9 | .site-doc-icon li a:hover{color: #00c1de;} 10 | 11 | @font-face {font-family: "iconfont"; 12 | src: url('../static/cm-font/iconfont.eot'); /* IE9*/ 13 | src: url('../static/cm-font/iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ 14 | url('../static/cm-font/iconfont.woff') format('woff'), /* chrome, firefox */ 15 | url('../static/cm-font/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 16 | url('../static/cm-font/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ 17 | } 18 | 19 | .iconfont { 20 | font-family:"iconfont" !important; 21 | font-size:45px; 22 | font-style:normal; 23 | -webkit-font-smoothing: antialiased; 24 | -webkit-text-stroke-width: 0.2px; 25 | -moz-osx-font-smoothing: grayscale; 26 | } 27 | 28 | 29 |
    30 |
    31 |
    32 |
    33 |
    34 |
    35 | 66 |
    67 |
    68 |
    69 |
    70 |
    71 | -------------------------------------------------------------------------------- /templates/feis/asysi.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                         
    10 |
    11 |
    12 | 13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 | 20 | 21 | 53 | -------------------------------------------------------------------------------- /templates/feis/asysi_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if rep_result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    详细信息
    20 | {% if rep_result['msg']['public_key']=='RSA' %} 21 |
    22 |
    密钥类型
    23 |
    {{ rep_result['msg']['public_key'] }}
    24 |
    25 |
    26 |
    密钥强度
    27 |
    {{ rep_result['msg']['public_key_size'] }}
    28 |
    29 |
    30 |
    PN(e)
    31 |
    {{ rep_result['msg']['public_key_e'] }}
    32 |
    33 |
    34 |
    PN(n)
    35 |
    36 |
    {{ rep_result['msg']['public_key_n'] }}
    37 |
    38 |
    39 |
    40 |
    DER值
    41 |
    42 |
    {{ rep_result['msg']['public_key_der'] }}
    43 |
    44 |
    45 | {% elif rep_result['msg']['public_key']=='DSA' %} 46 |
    47 |
    密钥类型
    48 |
    {{ rep_result['msg']['public_key'] }}
    49 |
    50 |
    51 |
    密钥强度
    52 |
    {{ rep_result['msg']['public_key_size'] }}
    53 |
    54 |
    55 |
    PN(y)
    56 |
    57 |
    {{ rep_result['msg']['public_key_y'] }}
    58 |
    59 |
    60 |
    61 |
    DER值
    62 |
    63 |
    {{ rep_result['msg']['public_key_der'] }}
    64 |
    65 |
    66 | {% elif rep_result['msg']['public_key']=='ECDSA' %} 67 |
    68 |
    密钥类型
    69 |
    {{ rep_result['msg']['public_key'] }}
    70 |
    71 |
    72 |
    密钥强度
    73 |
    {{ rep_result['msg']['public_key_size'] }}
    74 |
    75 |
    76 |
    PN(x)
    77 |
    78 |
    {{ rep_result['msg']['public_key_x'] }}
    79 |
    80 |
    81 |
    82 |
    PN(y)
    83 |
    84 |
    {{ rep_result['msg']['public_key_y'] }}
    85 |
    86 |
    87 |
    88 |
    DER值
    89 |
    90 |
    {{ rep_result['msg']['public_key_der'] }}
    91 |
    92 |
    93 | {% endif %} 94 |
    95 |
     
    96 |
    97 |
    98 | {% else %} 99 | 104 |
    105 |
    106 |
      {{ rep_result['msg'] }}
    107 |
    108 |
    109 | {% endif %} 110 | 111 | 122 | -------------------------------------------------------------------------------- /templates/feis/jiajiemi.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                       
    10 |
    11 |
    12 | 13 |
    14 |
    15 | 16 | 17 |
    18 |
    19 | 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 | 27 | 61 | -------------------------------------------------------------------------------- /templates/feis/jiaoyan.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
     7 |                         
     8 |                         
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |                         
    15 |                         
    16 |
    17 |
    18 |
    19 |
    20 |
    21 | 22 |
    23 |
    24 |
    25 |
    26 | 27 |
    28 |
    29 |
    30 |
    31 | 32 | 37 | 38 | 71 | -------------------------------------------------------------------------------- /templates/feis/jiaoyan_result.html: -------------------------------------------------------------------------------- 1 | 2 | 7 |
    8 |
    9 | {% if jy_result['error'] %} 10 |
      {{ jy_result['msg'] }}
    11 | {% else %} 12 |
      {{ jy_result['msg'] }}
    13 | {% endif %} 14 |
    15 |
    16 | 17 | -------------------------------------------------------------------------------- /templates/feis/priv_xiugai.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                       
    10 |
    11 |
    12 |
    13 | 14 |
    15 |
    16 | 17 |
    18 |
    19 |
    20 | 21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    27 | 28 | -------------------------------------------------------------------------------- /templates/feis/priv_xiugai_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if key_reuslt['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    私钥信息
    20 |
    21 |
    新密码
    22 |
    {{ key_reuslt['new_pass'] }}
    23 |
    24 |
    25 |
    明文
    26 |
    27 |
    28 |
    {{ key_reuslt['new_key'] }}
    29 |
    30 |
    31 |
    32 |
    33 |
     
    34 |
    35 |
    36 | {% else %} 37 | 42 |
    43 |
    44 |
      {{ key_reuslt['msg'] }}
    45 |
    46 |
    47 | {% endif %} 48 | 49 | -------------------------------------------------------------------------------- /templates/feis/pub_priv_double.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 | 8 |
    9 | 15 |
    16 |
    17 |
    18 | 19 |
    20 | 23 |
    24 |
    25 |
    26 | 27 |
    28 | 29 |
    30 |
    31 |
    32 | 33 |
    34 |
    35 |
    36 |
    37 |
    38 |
    39 | 40 | -------------------------------------------------------------------------------- /templates/feis/pub_priv_double_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    20 |
    公钥明文
    21 |
    22 |
    23 |
    {{ result['pub_key'] }}
    24 |
    25 |
    26 |
    27 |
    28 |
    私钥明文
    29 |
    30 |
    31 |
    {{ result['priv_key'] }}
    32 |
    33 |
    34 |
    35 |
    36 |
     
    37 |
    38 |
    39 | {% else %} 40 | 45 |
    46 |
    47 |
      {{ result['msg'] }}
    48 |
    49 |
    50 | {% endif %} 51 | 52 | -------------------------------------------------------------------------------- /templates/feis/tiqu.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                         
    10 |
    11 |
    12 | 13 |
    14 |
    15 | 16 |
    17 |
    18 |
    19 |
    20 |
    21 |
    22 | 23 | 24 | 56 | -------------------------------------------------------------------------------- /templates/feis/tiqu_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if tiqu_result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    公钥
    20 |
    21 |
    PEM值
    22 |
    23 |
    {{ tiqu_result['public_key_pem'] }}
    24 |
    25 |
    26 |
    27 |
    DER值
    28 |
    29 |
    {{ tiqu_result['public_key_der'] }}
    30 |
    31 |
    32 |
    33 |
     
    34 |
    35 |
    36 | {% else %} 37 | 42 |
    43 |
    44 |
      {{ tiqu_result['msg'] }}
    45 |
    46 |
    47 | {% endif %} 48 | 49 | 60 | -------------------------------------------------------------------------------- /templates/gmssl.html: -------------------------------------------------------------------------------- 1 | 暂无此功能! -------------------------------------------------------------------------------- /templates/logs.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/templates/logs.html -------------------------------------------------------------------------------- /templates/ssl/ssl_deep.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
    8 |
    9 | 10 |
    11 |
    12 |
    13 |
    14 | 15 |
    16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    27 |
    28 |
    29 | 获取服务端支持的协议/加密套件、是否存在SSL常见漏洞、证书及证书链等。 30 |
    31 |
    32 |
    33 |
    34 |
    35 | 36 | 37 | -------------------------------------------------------------------------------- /templates/ssl/ssl_suites.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
    8 |
    9 | 10 |
    11 |
    12 |
    13 |
    14 | 15 |
    16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    27 |
    28 |
    29 | 检测服务端支持的加密协议,如TLS1.0,SSL3.0等;以及支持的加密套件,如TLS_RSA_WITH_AES_256_CBC_SHA256。 30 |
    31 |
    32 |
    33 |
    34 |
    35 | 36 | 37 | -------------------------------------------------------------------------------- /templates/ssl/ssl_woshou.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
    8 |
    9 | 10 |
    11 |
    12 |
    13 |
    14 | 15 |
    16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    27 |
    28 |
    29 | 模拟Wireshark对SSL握手过程抓包,对SSL握手过程进行分析,快速定位问题。 30 |
    31 |
    32 |
    33 |
    34 |
    35 | 36 | 37 | -------------------------------------------------------------------------------- /templates/ssl/vuls_check.html: -------------------------------------------------------------------------------- 1 | 4 |
    5 |
    6 |
    7 |
    8 |
    9 |
    10 |
    11 | 12 |
    13 |
    14 |
    15 |
    16 | 17 |
    18 |
    19 |
    20 |
    21 | 22 |
    23 |
    24 |
    25 |
    26 |
    27 |
    28 |
    29 |
    30 |
    31 | 57 |
    58 |
    59 |
    60 |
    61 |
    62 | 63 | 64 | -------------------------------------------------------------------------------- /templates/tools/aes_cipher.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
      8 |                         
      9 |                         
    10 |
    11 |
    12 |
    13 | 14 |
    15 | 22 |
    23 |
    24 |
    25 | 26 |
    27 | 28 |
    29 |
    30 |
    31 | 32 |
    33 | 34 |
    35 |
    36 |
    37 | 38 |
    39 | 43 |
    44 |
    45 |
    46 |
    47 |
    48 |
    49 | 50 |
    51 |
    52 |
    53 |
    54 | 55 |
    56 |
    57 |
    58 |
    59 |
    60 |
    61 |
    62 |
    63 | 64 | 65 | -------------------------------------------------------------------------------- /templates/tools/cer_check.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                     
     9 |                     
    10 |
    11 |
    12 | 13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/tools/cert_create_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    20 |
    证书明文
    21 |
    22 |
    23 |
    {{ result['cert'] }}
    24 |
    25 |
    26 |
    27 |
    28 |
    私钥明文
    29 |
    30 |
    31 |
    {{ result['priv_key'] }}
    32 |
    33 |
    34 |
    35 |
    36 |
     
    37 |
    38 |
    39 | {% else %} 40 | 45 |
    46 |
    47 |
      {{ result['msg'] }}
    48 |
    49 |
    50 | {% endif %} 51 | 52 | -------------------------------------------------------------------------------- /templates/tools/cipher_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if aes_result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    {{ flag }}
    20 |
    21 |
    明/密文
    22 |
    23 |
    {{ aes_result['msg'] }}
    24 |
    25 |
    26 |
    27 |
     
    28 |
    29 |
    30 | {% else %} 31 | 36 |
    37 |
    38 |
      {{ aes_result['msg'] }}
    39 |
    40 |
    41 | {% endif %} 42 | 43 | -------------------------------------------------------------------------------- /templates/tools/csr_check.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                         
    10 |
    11 |
    12 | 13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/tools/csr_create_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    20 |
    CSR明文
    21 |
    22 |
    23 |
    {{ result['csr'] }}
    24 |
    25 |
    26 |
    27 |
    28 |
    私钥明文
    29 |
    30 |
    31 |
    {{ result['priv_key'] }}
    32 |
    33 |
    34 |
    35 |
    36 |
     
    37 |
    38 |
    39 | {% else %} 40 | 45 |
    46 |
    47 |
      {{ result['msg'] }}
    48 |
    49 |
    50 | {% endif %} 51 | 52 | -------------------------------------------------------------------------------- /templates/tools/des_cipher.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
      8 |                         
      9 |                         
    10 |
    11 |
    12 |
    13 | 14 |
    15 | 22 |
    23 |
    24 |
    25 | 26 |
    27 | 28 |
    29 |
    30 |
    31 | 32 |
    33 | 34 |
    35 |
    36 |
    37 | 38 |
    39 | 43 |
    44 |
    45 |
    46 |
    47 |
    48 |
    49 | 50 |
    51 |
    52 |
    53 |
    54 | 55 |
    56 |
    57 |
    58 |
    59 |
    60 |
    61 |
    62 |
    63 | 64 | 65 | -------------------------------------------------------------------------------- /templates/tools/hash.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                         
     9 |                         
    10 |
    11 |
    12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
    24 |
    25 | 26 |
    27 |
    28 |
    29 | 30 |
    31 |
    32 |
    33 |
    34 |
    35 |
    36 |
    37 | 42 | 43 | -------------------------------------------------------------------------------- /templates/tools/hash_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if hash_result['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    {{ flag }}
    20 |
    21 |
    22 |
    23 |
    {{ hash_result['msg'] }}
    24 |
    25 |
    26 |
    27 |
     
    28 |
    29 |
    30 | {% else %} 31 | 36 |
    37 |
    38 |
      {{ hash_result['msg'] }}
    39 |
    40 |
    41 | {% endif %} 42 | 43 | -------------------------------------------------------------------------------- /templates/tools/pre_cer.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
    7 |
     8 |                     
     9 |                   
    10 |
    11 |
    12 | 13 |
    14 |
    15 | 16 | 17 |
    18 |
    19 | 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 | 27 | -------------------------------------------------------------------------------- /templates/tools/pre_cer_result.html: -------------------------------------------------------------------------------- 1 | 2 | {% if key_reuslt['error'] %} 3 | 15 |
    16 |
    17 |
     
    18 |
    19 |
    私钥信息
    20 |
    21 |
    密码
    22 |
    {{ key_reuslt['msg']['key'] }}
    23 |
    24 |
    25 |
    明文
    26 |
    27 |
    28 |
    {{ key_reuslt['msg']['key_string'] }}
    29 |
    30 |
    31 |
    32 |
    33 |
     
    34 |
    35 |
    36 | {% else %} 37 | 42 |
    43 |
    44 |
      {{ key_reuslt['msg'] }}
    45 |
    46 |
    47 | {% endif %} 48 | 49 | -------------------------------------------------------------------------------- /templates/tools/rsa_check.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    6 |
     7 |                     
     8 |                     
    9 |
    10 |
    11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |
    18 |
    19 |                     
    20 |                     
    21 |
    22 |
    23 | 24 |
    25 |
    26 |
    27 |
    28 | 29 |
    30 | 31 |
    32 |
    33 |
    34 |
    35 | 36 | 41 | 42 | -------------------------------------------------------------------------------- /templates/tools/rsa_check_result.html: -------------------------------------------------------------------------------- 1 | 2 | 7 |
    8 |
    9 | {% if rsa_check_r['error'] %} 10 |
      {{ rsa_check_r['msg'] }}
    11 | {% else %} 12 |
      {{ rsa_check_r['msg'] }}
    13 | {% endif %} 14 |
    15 |
    16 | 17 | -------------------------------------------------------------------------------- /test/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | # 对字符串进行按长度分割 4 | def split_string(string,width): 5 | if isinstance(string,str): 6 | string=string 7 | else: 8 | string=str(int(string)) 9 | return '\n'.join([string[i:i+width] for i in range(0,len(string),width)]) -------------------------------------------------------------------------------- /test/create_key.py: -------------------------------------------------------------------------------- 1 | from cryptography.hazmat.backends import default_backend 2 | from cryptography.hazmat.primitives import serialization 3 | from cryptography.hazmat.primitives.asymmetric import rsa,dsa,ec 4 | 5 | key=ec.generate_private_key( 6 | curve=ec.SECP192R1(), 7 | backend=default_backend() 8 | ) 9 | 10 | if __name__ == '__main__': 11 | try: 12 | with open('./key.pem','wb') as f: 13 | f.write(key.private_bytes( 14 | encoding=serialization.Encoding.PEM, 15 | format=serialization.PrivateFormat.PKCS8, 16 | encryption_algorithm=serialization.NoEncryption(), 17 | )) 18 | print('private key is ok') 19 | except Exception as e: 20 | print(e) -------------------------------------------------------------------------------- /test/create_key.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/test/create_key.pyc -------------------------------------------------------------------------------- /test/csr.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIBWTCCAQ4CAQAwbjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQH 3 | DA1TYW4gRnJhbmNpc2NvMRMwEQYDVQQKDApNeSBDb21wYW55MRAwDgYDVQQLDAdD 4 | b21wYW55MRMwEQYDVQQDDApteXNpdGUuY29tMEkwEwYHKoZIzj0CAQYIKoZIzj0D 5 | AQEDMgAEQ7phe563jhXWZaivHGeg2k1F3wI3TKMc8jvBI8LhjYMcYGl18Ab7ejI7 6 | 3LqXASRXoE4wTAYJKoZIhvcNAQkOMT8wPTA7BgNVHREENDAyggpteXNpdGUuY29t 7 | gg53d3cubXlzaXRlLmNvbYIUc3ViZG9tYWluLm15c2l0ZS5jb20wCgYIKoZIzj0E 8 | AwIDOQAwNgIZALVCga5VRIQ792Wz22hh0yiizFEzaN2MzQIZAO/lRmZXxyywZ6sV 9 | zpTzKZp0LmQoztUe1Q== 10 | -----END CERTIFICATE REQUEST----- 11 | -------------------------------------------------------------------------------- /test/csr.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from cryptography import x509 3 | from cryptography.hazmat.backends import default_backend 4 | from cryptography.hazmat.primitives import hashes,serialization 5 | from cryptography.hazmat.primitives.asymmetric import rsa,dsa,ec 6 | from base import split_string 7 | import binascii 8 | 9 | # 读取CSR内容 10 | def readCSR(pem_req_data): 11 | csr=None 12 | try: 13 | csr=x509.load_pem_x509_csr(pem_req_data,default_backend()) 14 | except Exception,e: 15 | print e 16 | return {'error':False,'msg':u'CSR内容错误!'} 17 | # csr句柄获取 18 | if isinstance(csr,x509.CertificateSigningRequest): 19 | rep_reuslt={} 20 | # 获取subject基本信息 21 | subject_check=['commonName','countryName','stateOrProvinceName','localityName','organizationName','organizationalUnitName'] 22 | for attr in csr.subject: 23 | if attr.oid._name in subject_check: 24 | rep_reuslt[attr.oid._name]=attr.value 25 | subject_check.remove(attr.oid._name) 26 | 27 | for i in subject_check: 28 | rep_reuslt[i]="" 29 | # csr扩展信息 30 | public_extensions=[] 31 | if csr.extensions: 32 | try: 33 | for extension in csr.extensions: 34 | for value in extension.value: 35 | if isinstance(value,x509.DNSName): 36 | public_extensions.append(value.value) 37 | rep_reuslt['extension']=','.join(public_extensions) 38 | except Exception,e: 39 | print e 40 | return {'error':False,'msg':u'CSR扩展错误!'} 41 | else: 42 | rep_reuslt['extension']='' 43 | # 获取密钥强度 44 | rep_reuslt['public_key_size']=str(csr.public_key().key_size) 45 | # 密钥类型 46 | if isinstance(csr.public_key(),rsa.RSAPublicKey): 47 | rep_reuslt['public_key']="RSA" 48 | rep_reuslt['public_key_n']=split_string(csr.public_key().public_numbers().n,64) 49 | rep_reuslt['public_key_e']=csr.public_key().public_numbers().e 50 | elif isinstance(csr.public_key(),dsa.DSAPublicKey): 51 | rep_reuslt['public_key']="DSA" 52 | rep_reuslt['public_key_y']=split_string(csr.public_key().public_numbers().y,64) 53 | elif isinstance(csr.public_key(),ec.EllipticCurvePublicKey): 54 | rep_reuslt['public_key']="ECDSA" 55 | rep_reuslt['public_key_x']=split_string(csr.public_key().public_numbers().x,64) 56 | rep_reuslt['public_key_y']=split_string(csr.public_key().public_numbers().y,64) 57 | else: 58 | rep_reuslt['public_key']="" 59 | # 签名算法 60 | if isinstance(csr.signature_hash_algorithm,hashes.MD5): 61 | rep_reuslt['sign_with']="MD5" 62 | elif isinstance(csr.signature_hash_algorithm,hashes.SHA1): 63 | rep_reuslt['sign_with']="SHA1" 64 | elif isinstance(csr.signature_hash_algorithm,hashes.SHA224): 65 | rep_reuslt['sign_with']="SHA224" 66 | elif isinstance(csr.signature_hash_algorithm,hashes.SHA256): 67 | rep_reuslt['sign_with']="SHA256" 68 | elif isinstance(csr.signature_hash_algorithm,hashes.SHA384): 69 | rep_reuslt['sign_with']="SHA384" 70 | elif isinstance(csr.signature_hash_algorithm,hashes.SHA512): 71 | rep_reuslt['sign_with']="SHA512" 72 | elif isinstance(csr.signature_hash_algorithm,hashes.BLAKE2b): 73 | rep_reuslt['sign_with']="BLAKE2b" 74 | elif isinstance(csr.signature_hash_algorithm,hashes.BLAKE2s): 75 | rep_reuslt['sign_with']="BLAKE2s" 76 | else: 77 | rep_reuslt['sign_with']="" 78 | # 签名信息及是否有效 79 | rep_reuslt['csr_signture']=split_string(binascii.hexlify(csr.signature),64) 80 | if csr.is_signature_valid: 81 | rep_reuslt['csr_sign_valid']=u"是" 82 | else: 83 | rep_reuslt['csr_sign_valid']=u"否" 84 | # 公钥明文 85 | rep_reuslt['public_key_string']=csr.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 86 | return {'error':True,'msg':rep_reuslt} 87 | else: 88 | return {'error':False,'msg':u'对象类型错误!'} 89 | 90 | if __name__=='__main__': 91 | pem_data=b'' 92 | try: 93 | with open('./csr.pem','rb') as f: 94 | pem_data=f.read() 95 | except Exception as e: 96 | print(e) 97 | 98 | print readCSR(pem_data) -------------------------------------------------------------------------------- /test/csr.txt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICwDCCAagCAQAwezELMAkGA1UEBhMCQ04xDzANBgNVBAgMBua5luWMlzEPMA0G 3 | A1UEBwwG5q2m5rGJMTMwMQYDVQQKDCrmrabmsYnph5Hono3nlLXlrZDnu5Pnrpfk 4 | uK3lv4PmnInpmZDlhazlj7gxFTATBgNVBAMMDHd3dy53aGNyYy5jbjCCASIwDQYJ 5 | KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7Qkbk8cSFI3NIym4dNjvzlp+CGlvM4 6 | ga9QhQ6OBl39JBfqucAQQ5PLC95nAkMbc8+YPHEkPCrTar1Z46dOuGxQyzDTAWz9 7 | p3OKvfjTT5tUvtHw8GeMod03w3+WRDyWXchRSIRNjjAYnJcO3NiKpM8SgYp+BDhg 8 | K6kNkkgp4k7+FfmpJsypMJ0j3JEd+0GNpdy+Uj/2ryT9LuQQxpMhn1fHU+qmMYQZ 9 | jtf1J8vpT6HpzraNmiaFcS2MOMmVI2uMUg8mIvNjsBQmCgfUACDNQcKni/tQlbCY 10 | Ek/XjE8M+xS+nEg6hH2wRtIHybO4MolnDughPH+RRrOgYyLlQ/Z5Z5cCAwEAAaAA 11 | MA0GCSqGSIb3DQEBCwUAA4IBAQBVpuObR9zvz8NRcvzWNy1i9tLbcsq9XZ7Q8i1P 12 | bG/IuR+Vb6A6gQAOO0qtS/BFNKHIpMxTy41iGT38F3KcWFT9QMoYPxAU19T5CK1R 13 | UDL8Cj69sM8FimbJ3mpw2ddzfnqpNWiFnCzTs8pBLZw+VPvrd19+oucecimw+ymk 14 | pT8415xrEnBlAGi0yE7brN84gEoGJg5FaBr2/jdtsS5uQraJ029b65YVifbhmwsz 15 | +h1Mx8aOTILVLvdUE5i+kw0Pf7mNXfsn3f4oMC/93yWLG2Y2yULVQ0rPFgsAnlA7 16 | QkDgf9SiyenavEJxR720mGET6uuqGt9R0WaxP3jxsi0XsWY0 17 | -----END CERTIFICATE REQUEST----- 18 | -------------------------------------------------------------------------------- /test/flaskTest.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Flask,render_template,request 3 | import csr 4 | import cer 5 | import rsa 6 | import key 7 | 8 | app = Flask(__name__) 9 | 10 | # 首页 11 | @app.route('/') 12 | def index(): 13 | client_ip=request.remote_addr 14 | return render_template('index.html',client_ip=client_ip) 15 | # gmssl项目 16 | @app.route('/gmssl') 17 | def gmssl(): 18 | return render_template('gmssl.html') 19 | # 控制台 20 | @app.route('/this_console') 21 | def this_console(): 22 | return render_template('console.html') 23 | 24 | # 登录日志 25 | @app.route('/log') 26 | def log(): 27 | return render_template('logs.html') 28 | 29 | # 版本信息 30 | @app.route('/banner') 31 | def banner(): 32 | return render_template('banner.html') 33 | 34 | ''' 35 | SSL工具集 36 | ''' 37 | @app.route('/csr_check') 38 | def csr_check(): 39 | return render_template('tools/csr_check.html') 40 | @app.route('/csr_create') 41 | def csr_create(): 42 | return render_template('tools/csr_create.html') 43 | @app.route('/cer_check') 44 | def cer_check(): 45 | return render_template('tools/cer_check.html') 46 | @app.route('/rsa_check') 47 | def rsa_check(): 48 | return render_template('tools/rsa_check.html') 49 | @app.route('/pre_cer') 50 | def pre_cer(): 51 | return render_template('tools/pre_cer.html') 52 | @app.route('/pro_suites') 53 | def pro_suites(): 54 | return render_template('tools/pro_suites.html') 55 | ''' 56 | SSL漏洞检测 57 | ''' 58 | @app.route('/vuls_check') 59 | def vuls_check(): 60 | return render_template('vules/vuls_check.html') 61 | @app.route('/heart_bleed') 62 | def heart_bleed(): 63 | return render_template('vules/heart_bleed.html') 64 | @app.route('/freak_attack') 65 | def freak_attack(): 66 | return render_template('vules/freak_attack.html') 67 | @app.route('/ssl_poodle') 68 | def ssl_poodle(): 69 | return render_template('vules/ssl_poodle.html') 70 | @app.route('/ccs_injection') 71 | def ccs_injection(): 72 | return render_template('vules/ccs_injection.html') 73 | @app.route('/cbc_padding') 74 | def cbc_padding(): 75 | return render_template('vules/cbc_padding.html') 76 | @app.route('/csr_check_show',methods=['POST']) 77 | def csr_check_show(): 78 | pem_data=request.form['csr_content'].encode('utf-8') 79 | return render_template('tools/csr_check_result.html',csr_content=csr.readCSR(pem_data)) 80 | @app.route('/cer_check_show',methods=['POST']) 81 | def cer_check_show(): 82 | pem_data=request.form['cer_content'].encode('utf-8') 83 | return render_template('tools/cer_check_result.html',cer_content=cer.readCER(pem_data)) 84 | @app.route('/rsa_check_show',methods=['POST']) 85 | def rsa_check_show(): 86 | req_cer_csr=request.form['cer_csr'].encode('utf-8') 87 | csr_pri=request.form['csr_pri'].encode('utf-8') 88 | key=str(request.form['key']) 89 | if int(request.form['suite_type']) == 1: 90 | if key: 91 | return render_template('tools/rsa_check_result.html',rsa_check_r=rsa.cer_key(req_cer_csr,csr_pri,key)) 92 | else: 93 | return render_template('tools/rsa_check_result.html',rsa_check_r=rsa.cer_key(req_cer_csr,csr_pri)) 94 | elif int(request.form['suite_type']) == 2: 95 | return render_template('tools/rsa_check_result.html',rsa_check_r=rsa.cer_csr(req_cer_csr,csr_pri)) 96 | elif int(request.form['suite_type']) == 3: 97 | if key: 98 | return render_template('tools/rsa_check_result.html',rsa_check_r=rsa.csr_key(req_cer_csr,csr_pri,key)) 99 | else: 100 | return render_template('tools/rsa_check_result.html',rsa_check_r=rsa.csr_key(req_cer_csr,csr_pri)) 101 | else: 102 | return render_template('tools/rsa_check_result.html',rsa_check_r={'msg':u'校验类型有误!'}) 103 | @app.route('/pre_cer_result',methods=['POST']) 104 | def pre_cer_result(): 105 | priv_content=request.form['priv_content'].encode('utf-8') 106 | key=str(request.form['key']) 107 | if int(request.form['jjm_type']) == 1: 108 | return render_template('tools/pre_cer_result.html',key_reuslt=rsa.jjm_1(priv_content,key)) 109 | elif int(request.form['jjm_type']) == 2: 110 | return render_template('tools/pre_cer_result.html',key_reuslt=rsa.jjm_2(priv_content,key)) 111 | else: 112 | return render_template('tools/pre_cer_result.html',key_reuslt={'error':True,'msg':u'异常错误!'}) 113 | 114 | @app.route('/create_csr',methods=['POST']) 115 | def create_csr(): 116 | com_name=request.form['com_name'].encode('utf-8').decode('utf-8') 117 | bumen_name=request.form['bumen_name'].encode('utf-8').decode('utf-8') 118 | zuzhi_name=request.form['zuzhi_name'].encode('utf-8').decode('utf-8') 119 | city_name=request.form['city_name'].encode('utf-8').decode('utf-8') 120 | shengfen_name=request.form['shengfen_name'].encode('utf-8').decode('utf-8') 121 | guojia_name=request.form['guojia_name'].encode('utf-8').decode('utf-8') 122 | beiyong_name=request.form['beiyong_name'].encode('utf-8').decode('utf-8') 123 | mysf=str(request.form['mysf']) 124 | if str(request.form['myqd']): 125 | myqd=str(request.form['myqd']) 126 | elif mysf == 'ECDSA' and not str(request.form['myqd']): 127 | myqd='P256' 128 | else: 129 | myqd='2048' 130 | 131 | if str(request.form['qmsf']): 132 | qmsf=str(request.form['qmsf']) 133 | else: 134 | qmsf='SHA1' 135 | key_pass=str(request.form['key_pass']) 136 | return render_template('tools/csr_create_result.html',result=key.create_csr(com_name,bumen_name,zuzhi_name,city_name,shengfen_name,guojia_name,mysf,beiyong_name,myqd,qmsf,key_pass)) 137 | 138 | if __name__ == '__main__': 139 | app.debug=True 140 | app.run() 141 | -------------------------------------------------------------------------------- /test/rsa.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from cryptography import x509 3 | from cryptography.hazmat.backends import default_backend 4 | from cryptography.hazmat.primitives import serialization 5 | 6 | def cer_csr(cer_pem_data,csr_pem_data): 7 | cer=None 8 | csr=None 9 | try: 10 | cer=x509.load_pem_x509_certificate(cer_pem_data,default_backend()) 11 | except Exception,e: 12 | print e 13 | return {'error':False,'msg':u'证书内容错误!'} 14 | 15 | try: 16 | csr=x509.load_pem_x509_csr(csr_pem_data,default_backend()) 17 | except Exception,e: 18 | print e 19 | return {'error':False,'msg':u'CSR内容错误!'} 20 | 21 | if isinstance(cer,x509.Certificate) and isinstance(csr,x509.CertificateSigningRequest): 22 | # 公钥明文 23 | cer_public_key=cer.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 24 | csr_public_key=csr.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 25 | if cer_public_key == csr_public_key: 26 | return {'error':True,'msg':u'匹配成功!'} 27 | else: 28 | return {'error':False,'msg':u'匹配失败!'} 29 | else: 30 | return {'error':False,'msg':u'证书/CSR内容错误!'} 31 | 32 | def csr_key(csr_pem_data,key_pem_data,key_passwd=None): 33 | csr=None 34 | key=None 35 | 36 | try: 37 | csr=x509.load_pem_x509_csr(csr_pem_data,default_backend()) 38 | except Exception,e: 39 | print e 40 | return {'error':False,'msg':u'CSR内容错误!'} 41 | 42 | try: 43 | key=serialization.load_pem_private_key(key_pem_data,password=key_passwd,backend=default_backend()) 44 | except Exception,e: 45 | print e 46 | return {'error':False,'msg':u'私钥内容错误!'} 47 | if isinstance(csr,x509.CertificateSigningRequest): 48 | csr_public_key=csr.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 49 | key_public_key=key.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 50 | if csr_public_key == key_public_key: 51 | return {'error':True,'msg':u'匹配成功!'} 52 | else: 53 | return {'error':False,'msg':u'匹配失败!'} 54 | else: 55 | return {'error':False,'msg':u'CSR/私钥内容错误!'} 56 | 57 | def cer_key(cer_pem_data,key_pem_data,key_passwd=None): 58 | cer=None 59 | key=None 60 | try: 61 | cer=x509.load_pem_x509_certificate(cer_pem_data,default_backend()) 62 | except Exception,e: 63 | print e 64 | return {'error':False,'msg':u'证书内容错误!'} 65 | try: 66 | key=serialization.load_pem_private_key(key_pem_data,password=key_passwd,backend=default_backend()) 67 | except Exception,e: 68 | print e 69 | return {'error':False,'msg':u'私钥内容错误!'} 70 | if isinstance(cer,x509.Certificate): 71 | # 公钥明文 72 | cer_public_key=cer.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 73 | key_public_key=key.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo) 74 | if csr_public_key == key_public_key: 75 | return {'error':True,'msg':u'匹配成功!'} 76 | else: 77 | return {'error':False,'msg':u'匹配失败!'} 78 | else: 79 | return {'error':False,'msg':u'证书/私钥内容错误!'} 80 | 81 | def jjm_1(key_pem_data,pass_key): 82 | try: 83 | key=serialization.load_pem_private_key(key_pem_data,password=None,backend=default_backend()) 84 | except Exception,e: 85 | print e 86 | return {'error':False,'msg':u'私钥内容/密码错误!'} 87 | result={} 88 | try: 89 | result['key_string']=key.private_bytes( 90 | encoding=serialization.Encoding.PEM, 91 | format=serialization.PrivateFormat.PKCS8, 92 | encryption_algorithm=serialization.BestAvailableEncryption(pass_key) 93 | ) 94 | except Exception,e: 95 | print e 96 | return {'error':False,'msg':u'密码错误!'} 97 | result['key']=pass_key 98 | return {'error':True,'msg':result} 99 | 100 | def jjm_2(key_pem_data,pass_key): 101 | try: 102 | key=serialization.load_pem_private_key(key_pem_data,password=pass_key,backend=default_backend()) 103 | except Exception,e: 104 | print e 105 | return {'error':False,'msg':u'私钥内容/密码错误!'} 106 | result={} 107 | try: 108 | result['key_string']=key.private_bytes( 109 | encoding=serialization.Encoding.PEM, 110 | format=serialization.PrivateFormat.PKCS8, 111 | encryption_algorithm=serialization.NoEncryption() 112 | ) 113 | except Exception,e: 114 | print e 115 | return {'error':False,'msg':u'密码错误!'} 116 | result['key']=pass_key 117 | return {'error':True,'msg':result} 118 | 119 | if __name__=='__main__': 120 | cer_pem_data=b'' 121 | try: 122 | with open('./key.pem','rb') as f: 123 | cer_pem_data=f.read() 124 | except Exception as e: 125 | print(e) 126 | 127 | print jjm_2(cer_pem_data,'123456') 128 | -------------------------------------------------------------------------------- /test/suites.py: -------------------------------------------------------------------------------- 1 | from cryptography import x509 2 | from cryptography.x509.oid import NameOID 3 | from cryptography.hazmat.primitives import hashes 4 | from create_key import key,default_backend,serialization 5 | #create a csr 6 | csr=x509.CertificateSigningRequestBuilder().subject_name(x509.Name([ 7 | # Provide various details about who we are. 8 | x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"), 9 | x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"CA"), 10 | x509.NameAttribute(NameOID.LOCALITY_NAME, u"San Francisco"), 11 | x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"My Company"), 12 | x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, u"Company"), 13 | x509.NameAttribute(NameOID.COMMON_NAME, u"mysite.com"), 14 | ])).add_extension(x509.SubjectAlternativeName([ 15 | # Describe what sites we want this certificate for. 16 | x509.DNSName(u"mysite.com"), 17 | x509.DNSName(u"www.mysite.com"), 18 | x509.DNSName(u"subdomain.mysite.com"), 19 | ]), 20 | critical=False, 21 | # Sign the CSR with our private key. 22 | ).sign(key,hashes.SHA256(),default_backend()) 23 | 24 | def create_csr(com_name,bumen_name,zuzhi_name,city_name,shengfen_name,guojia_name,mysf,beiyong_name,myqd,qmsf,key_pass): 25 | private_key=None 26 | if mysf == 'RSA': 27 | csr_subject_name=x509.CertificateSigningRequestBuilder().subject_name(x509.Name([ 28 | # Provide various details about who we are. 29 | x509.NameAttribute(NameOID.COUNTRY_NAME, guojia_name), 30 | x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, shengfen_name), 31 | x509.NameAttribute(NameOID.LOCALITY_NAME, city_name), 32 | x509.NameAttribute(NameOID.ORGANIZATION_NAME, zuzhi_name), 33 | x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, bumen_name), 34 | x509.NameAttribute(NameOID.COMMON_NAME, com_name), 35 | ])) 36 | csr.add_extension() 37 | #create a csr 38 | csr=x509.CertificateSigningRequestBuilder().subject_name(x509.Name([ 39 | # Provide various details about who we are. 40 | x509.NameAttribute(NameOID.COUNTRY_NAME, guojia_name), 41 | x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, shengfen_name), 42 | x509.NameAttribute(NameOID.LOCALITY_NAME, city_name), 43 | x509.NameAttribute(NameOID.ORGANIZATION_NAME, zuzhi_name), 44 | x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, bumen_name), 45 | x509.NameAttribute(NameOID.COMMON_NAME, com_name), 46 | ])).add_extension(x509.SubjectAlternativeName([ 47 | # Describe what sites we want this certificate for. 48 | x509.DNSName(u"mysite.com"), 49 | x509.DNSName(u"www.mysite.com"), 50 | x509.DNSName(u"subdomain.mysite.com"), 51 | ]), 52 | critical=False, 53 | # Sign the CSR with our private key. 54 | ).sign(key,hashes.SHA256(),default_backend()) 55 | return None 56 | if __name__ == '__main__': 57 | try: 58 | with open("./csr.pem","wb") as f: 59 | f.write(csr.public_bytes(serialization.Encoding.PEM)) 60 | print("csr create is ok") 61 | except Exception as e: 62 | print(e) 63 | 64 | try: 65 | with open('./key.pem','wb') as f: 66 | f.write(key.private_bytes( 67 | encoding=serialization.Encoding.PEM, 68 | format=serialization.PrivateFormat.PKCS8, 69 | encryption_algorithm=serialization.NoEncryption(), 70 | )) 71 | print('private key is ok') 72 | except Exception as e: 73 | print(e) 74 | -------------------------------------------------------------------------------- /test/test.py: -------------------------------------------------------------------------------- 1 | from OpenSSL import crypto 2 | 3 | def gen_pkcs12(cert_pem=None,key_pem=None,ca_pem=None,friendly_name=None): 4 | p12=crypto.PKCS12() 5 | if cert_pem: 6 | ret = p12.set_certificate(crypto.load_certificate(crypto.FILETYPE_PEM, cert_pem)) 7 | assert ret is None 8 | if key_pem: 9 | ret = p12.set_privatekey(crypto.load_privatekey(crypto.FILETYPE_PEM, key_pem)) 10 | assert ret is None 11 | if ca_pem: 12 | ret = p12.set_ca_certificates( 13 | (crypto.load_certificate(crypto.FILETYPE_PEM, ca_pem),) 14 | ) 15 | assert ret is None 16 | if friendly_name: 17 | ret = p12.set_friendlyname(friendly_name) 18 | assert ret is None 19 | return p12 20 | 21 | if __name__=='__main__': 22 | cer_pem_data=b'' 23 | key_pem_data=b'' 24 | try: 25 | with open('./whcrc.cer','rb') as f: 26 | cer_pem_data=f.read() 27 | except Exception as e: 28 | print(e) 29 | 30 | try: 31 | with open('./key.pem','rb') as f: 32 | key_pem_data=f.read() 33 | except Exception as e: 34 | print(e) 35 | 36 | print gen_pkcs12(cer_pem_data,key_pem_data).export() -------------------------------------------------------------------------------- /test/whcrc.cer: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIE4zCCA8ugAwIBAgIQIBUBPyhX/Ic0hkZ12DrpfTANBgkqhkiG9w0BAQsFADBV 3 | MQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmlj 4 | YXRpb24gQXV0aG9yaXR5MRQwEgYDVQQDDAtDRkNBIE9WIE9DQTAeFw0xNzExMjgw 5 | OTI4NTNaFw0xODExMjgwOTI4NTNaMHsxCzAJBgNVBAYTAkNOMQ8wDQYDVQQIDAbm 6 | uZbljJcxDzANBgNVBAcMBuatpuaxiTEzMDEGA1UECgwq5q2m5rGJ6YeR6J6N55S1 7 | 5a2Q57uT566X5Lit5b+D5pyJ6ZmQ5YWs5Y+4MRUwEwYDVQQDDAx3d3cud2hjcmMu 8 | Y24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+0JG5PHEhSNzSMpuH 9 | TY785afghpbzOIGvUIUOjgZd/SQX6rnAEEOTywveZwJDG3PPmDxxJDwq02q9WeOn 10 | TrhsUMsw0wFs/adzir3400+bVL7R8PBnjKHdN8N/lkQ8ll3IUUiETY4wGJyXDtzY 11 | iqTPEoGKfgQ4YCupDZJIKeJO/hX5qSbMqTCdI9yRHftBjaXcvlI/9q8k/S7kEMaT 12 | IZ9Xx1PqpjGEGY7X9SfL6U+h6c62jZomhXEtjDjJlSNrjFIPJiLzY7AUJgoH1AAg 13 | zUHCp4v7UJWwmBJP14xPDPsUvpxIOoR9sEbSB8mzuDKJZw7oITx/kUazoGMi5UP2 14 | eWeXAgMBAAGjggGHMIIBgzAJBgNVHRMEAjAAMGwGCCsGAQUFBwEBBGAwXjAoBggr 15 | BgEFBQcwAYYcaHR0cDovL29jc3AuY2ZjYS5jb20uY24vb2NzcDAyBggrBgEFBQcw 16 | AoYmaHR0cDovL2d0Yy5jZmNhLmNvbS5jbi9vdm9jYS9vdm9jYS5jZXIwFwYDVR0R 17 | BBAwDoIMd3d3LndoY3JjLmNuMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQU9imGOVDM 18 | tNE2w10qb0dZwcOImZAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMB8G 19 | A1UdIwQYMBaAFGaz7/tUlYfprKWWVq7mfe060EPRMEYGA1UdIAQ/MD0wOwYGZ4EM 20 | AQICMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMt 21 | MTIuaHRtMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwuY2ZjYS5jb20uY24v 22 | T1ZPQ0EvUlNBL2NybDI0LmNybDANBgkqhkiG9w0BAQsFAAOCAQEAgBjhyLmsxqGk 23 | lthjD+45z1/CdF/gg0lQZvJeEmP7dLQbfN5hENPiyYHQCwGkd3+XkrP0LmROJ1xr 24 | i64WxSqh5XKreq+Pg7unVJqOUj6sjYdOFsjuMeoDSN/nYg4kbcocMuQ4yhSAnpVa 25 | 2QdBlnHCiSTv7g/mp7Afki2bo/eX+UU2lttgqxB57pNzr/9sv/j593sqqGA27gbI 26 | FwIjCXdI5PvmxiTx6Yz79ASAiq7h7AHMosHaqJPekVLHx9iCBSkThyMJ/u47UFnv 27 | nKmgSTVQol3iYZiI21al2CQ+c2LCE/rUkjHnGwSK1sYrmJ+ET4+eNUjfaSOt+HoS 28 | p8qZr3tXeg== 29 | -----END CERTIFICATE----- -------------------------------------------------------------------------------- /test/x509.py: -------------------------------------------------------------------------------- 1 | x=u'中国,日本' 2 | print x.split(',') 3 | 4 | 5 | ''' 6 | subject_check=['commonName','countryName','stateOrProvinceName','localityName','organizationName','organizationalUnitName'] 7 | for i in cert.subject: 8 | if isinstance(i,x509.NameAttribute): 9 | print i.oid._name 10 | ''' 11 | 'commonName','countryName','stateOrProvinceName','localityName','organizationName','organizationalUnitName' 12 | ''' 13 | def extensions_type(exten): 14 | if isinstance(exten,x509.extensions.SubjectAlternativeName): 15 | pass 16 | elif isinstance(exten,x509.extensions.BasicConstraints): 17 | pass 18 | elif isinstance(exten,x509.extensions.KeyUsage): 19 | pass 20 | elif isinstance(exten,x509.extensions.CRLDistributionPoints): 21 | pass 22 | elif isinstance(exten,x509.extensions.CertificatePolicies): 23 | pass 24 | elif isinstance(exten,x509.extensions.ExtendedKeyUsage): 25 | pass 26 | elif isinstance(exten,x509.extensions.AuthorityKeyIdentifier): 27 | pass 28 | elif isinstance(exten,x509.extensions.AuthorityInformationAccess): 29 | pass 30 | elif isinstance(exten,x509.extensions.UnrecognizedExtension): 31 | pass 32 | elif isinstance(exten,x509.extensions.AuthorityKeyIdentifier): 33 | pass 34 | elif isinstance(exten,x509.extensions.AuthorityKeyIdentifier): 35 | pass 36 | print cert.serial_number 37 | print binascii.hexlify(cert.fingerprint(hashes.SHA256())) 38 | print cert.not_valid_before 39 | print cert.not_valid_before 40 | print cert.version 41 | for i in cert.extensions: 42 | print type(i) 43 | 44 | x509.AccessDescription 45 | x509.AuthorityInformationAccess 46 | x509.AuthorityInformationAccessOID 47 | x509.AuthorityKeyIdentifier 48 | x509.BasicConstraints 49 | x509.CRLDistributionPoints 50 | x509.CRLEntryExtensionOID 51 | x509.CRLNumber 52 | x509.CRLReason 53 | x509.DirectoryName 54 | x509.DistributionPoint 55 | x509.DuplicateExtension 56 | x509.DNSName 57 | x509.ExtendedKeyUsage 58 | 59 | x509.ExtendedKeyUsageOID 60 | x509.ExtensionNotFound 61 | x509.GeneralName 62 | x509.GeneralNames 63 | x509.InhibitAnyPolicy 64 | x509.InvalidityDate 65 | x509.InvalidVersion 66 | x509.IPAddress 67 | x509.IssuerAlternativeName 68 | x509.KeyUsage 69 | x509.Name 70 | x509.NameAttribute 71 | x509.NameConstraints 72 | x509.NoticeReference 73 | 74 | x509.ObjectIdentifier 75 | x509.OCSPNoCheck 76 | x509.UserNotice 77 | x509.UnsupportedGeneralNameType 78 | x509.UnsupportedExtension 79 | x509.UnrecognizedExtension 80 | x509.UniformResourceIdentifier 81 | x509.SubjectKeyIdentifier 82 | x509.SubjectAlternativeName 83 | x509.SignatureAlgorithmOID 84 | x509.RFC822Name 85 | x509.RelativeDistinguishedName 86 | x509.ReasonFlags 87 | x509.PolicyInformation 88 | x509.PolicyConstraints 89 | x509.OtherName 90 | ''' -------------------------------------------------------------------------------- /views.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from flask import Flask,render_template,request 3 | from app import app 4 | from cer import views as cer_views 5 | 6 | # 首页 7 | @app.route('/') 8 | def index(): 9 | # 测试环境下获取客户端IP 10 | client_ip=request.remote_addr 11 | # 生产环境下获取客户端IP 12 | ''' 13 | if request.headers['X-Real-IP']: 14 | client_ip=request.headers['X-Real-IP'] 15 | else: 16 | client_ip=request.headers['X-Forwarded-For'] 17 | ''' 18 | return render_template('index.html',client_ip=client_ip) 19 | 20 | # 控制台 21 | @app.route('/this_console') 22 | def this_console(): 23 | return render_template('console.html') 24 | 25 | # SSL深度检查 26 | @app.route('/gmssl') 27 | def gmssl(): 28 | return render_template('gmssl.html') 29 | 30 | # 登录日志 31 | @app.route('/log') 32 | def log(): 33 | return render_template('logs.html') 34 | 35 | # 关于 36 | @app.route('/abort') 37 | def abort(): 38 | return render_template('abort.html') 39 | 40 | # 主页侧边栏--AES加解密 41 | @app.route('/aes_cipher') 42 | def aes_cipher(): 43 | return render_template('tools/aes_cipher.html') 44 | @app.route('/des_cipher') 45 | def des_cipher(): 46 | return render_template('tools/des_cipher.html') 47 | @app.route('/tdes_cipher') 48 | def tdes_cipher(): 49 | return render_template('tools/3des_cipher.html') 50 | 51 | # 主页侧边栏--证书工具 52 | @app.route('/csr_check') 53 | def csr_check(): 54 | return render_template('tools/csr_check.html') 55 | @app.route('/csr_create') 56 | def csr_create(): 57 | return render_template('tools/csr_create.html') 58 | @app.route('/cer_check') 59 | def cer_check(): 60 | return render_template('tools/cer_check.html') 61 | @app.route('/rsa_check') 62 | def rsa_check(): 63 | return render_template('tools/rsa_check.html') 64 | @app.route('/pre_cer') 65 | def pre_cer(): 66 | return render_template('tools/pre_cer.html') 67 | @app.route('/cert_create') 68 | def cert_create(): 69 | return render_template('tools/cert_create.html') 70 | 71 | # 主页侧边栏--漏洞检测 72 | @app.route('/vuls_check') 73 | def vuls_check(): 74 | return render_template('ssl/vuls_check.html') 75 | @app.route('/ssl_woshou') 76 | def ssl_woshou(): 77 | return render_template('ssl/ssl_woshou.html') 78 | @app.route('/ssl_xieyi_taojian') 79 | def ssl_xieyi_taojian(): 80 | return render_template('ssl/ssl_suites.html') 81 | @app.route('/ssl_deep') 82 | def ssl_deep(): 83 | return render_template('ssl/ssl_deep.html') 84 | 85 | # 底栏 -------------------------------------------------------------------------------- /views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wossl33/wossl/e0e55fe87235ad02ea67f8797cf4f6469d3bf78d/views.pyc -------------------------------------------------------------------------------- /wossld.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Gunicorn Demo 3 | After=network.target 4 | 5 | [Service] 6 | User=root 7 | Group=root 8 | PIDFile=/tmp/gunicorn.pid 9 | WorkingDirectory=/root/wossl 10 | ExecStart=/usr/bin/gunicorn -c wsgi_config.py wsgi:app 11 | ExecReload=/bin/kill -s HUP $MAINPID 12 | ExecStop=/bin/kill -s TERM $MAINPID 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /wsgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | # 生产环境Gunicorn部署Flask应用 3 | from app import app 4 | from views import * 5 | 6 | if __name__ == '__main__': 7 | from werkzeug.contrib.fixers import ProxyFix 8 | app.wsgi_app=ProxyFix(app.wsgi_app) 9 | app.run() -------------------------------------------------------------------------------- /wsgi_config.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | # wossl.service加载配置文件 3 | import os 4 | import gevent.monkey 5 | gevent.monkey.patch_all() 6 | 7 | import multiprocessing 8 | 9 | debug=True 10 | loglevel='debug' 11 | bind='192.168.85.81:8080' 12 | pidfile='/tmp/gunicorn.pid' 13 | logfile='/tmp/debug.log' 14 | # 多核多线程 15 | workers = multiprocessing.cpu_count()*2 + 1 16 | worker_class = 'gunicorn.workers.ggevent.GeventWorker' 17 | --------------------------------------------------------------------------------