资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

加密解密函数python 编一个加密和解密的函数过程

python3.6 AES 加密解密

本来以为这是个比较简单的东西,网上一搜一大把。搜索结果气的我自己看文档写了一个。

创新互联长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为淮北企业提供专业的成都网站制作、成都网站建设,淮北网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

首先安装pycryptodome或者pycryptodomex 用pip 安装,安装之后需要修改包名crypto改为Crypto

我是采用ECB模式加密你也可以用其他模式加密,模式区别可以看这篇 。

秘钥加密解密需要统一。

如何使用Python进行Rijndael方式的加密解密

Rijndael,在高级加密标准(AES)中使用的基本密码算法。

概述 (美国)国家标准技术研究所(NIST)选择Rijndael作为美国政府加密标准(AES)的加密算法,AES取代早期的数据加密标准(DES)。Rijndael由比利时计算机科学家Vincent Rijmen和Joan Daemen开发,它可以使用128位,192位或者256位的密钥长度,使得它比56位的DES更健壮可靠。Rijndael也有一个非常小的版本(52位),合适用在蜂窝电话、个人数字处理器(PDA)和其他的小设备上。

近似读音:Rijn [rain] dael [del] (莱恩戴尔) Rijn 来源 Rhine [莱茵河]的荷兰语(Dutch)发音。

dael 是常用的人名 这词是两个科学家的名字各出一段拼成的。

Rijndael.h

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma once

#include exception

#include string.h

using namespace std;

class CRijndael

{

public:

enum { ECB=0, CBC=1, CFB=2 };

private:

enum { DEFAULT_BLOCK_SIZE=16 };

enum { MAX_BLOCK_SIZE=32, MAX_ROUNDS=14, MAX_KC=8, MAX_BC=8 };

static int Mul(int a, int b)

{

return (a != 0 b != 0) ? sm_alog[(sm_log[a 0xFF] + sm_log[b 0xFF]) % 255] : 0;

}

static int Mul4(int a, char b[])

{

if(a == 0)

return 0;

a = sm_log[a 0xFF];

int a0 = (b[0] != 0) ? sm_alog[(a + sm_log[b[0] 0xFF]) % 255] 0xFF : 0;

int a1 = (b[1] != 0) ? sm_alog[(a + sm_log[b[1] 0xFF]) % 255] 0xFF : 0;

int a2 = (b[2] != 0) ? sm_alog[(a + sm_log[b[2] 0xFF]) % 255] 0xFF : 0;

int a3 = (b[3] != 0) ? sm_alog[(a + sm_log[b[3] 0xFF]) % 255] 0xFF : 0;

return a0 24 | a1 16 | a2 8 | a3;

}

public:

CRijndael();

virtual ~CRijndael();

void MakeKey(char const* key, char const* chain,

int keylength=DEFAULT_BLOCK_SIZE, int blockSize=DEFAULT_BLOCK_SIZE);

private:

void Xor(char* buff, char const* chain)

{

if(false==m_bKeyInit)

throw exception(sm_szErrorMsg1);

for(int i=0; im_blockSize; i++)

*(buff++) ^= *(chain++);

}

void DefEncryptBlock(char const* in, char* result);

void DefDecryptBlock(char const* in, char* result);

public:

void EncryptBlock(char const* in, char* result);

void DecryptBlock(char const* in, char* result);

void Encrypt(char const* in, char* result, size_t n, int iMode=ECB);

void Decrypt(char const* in, char* result, size_t n, int iMode=ECB);

int GetKeyLength()

{

if(false==m_bKeyInit)

throw exception(sm_szErrorMsg1);

return m_keylength;

}

int GetBlockSize()

{

if(false==m_bKeyInit)

throw exception(sm_szErrorMsg1);

return m_blockSize;

}

int GetRounds()

{

if(false==m_bKeyInit)

throw exception(sm_szErrorMsg1);

return m_iROUNDS;

}

void ResetChain()

{

memcpy(m_chain, m_chain0, m_blockSize);

}

public:

static char const* sm_chain0;

private:

static const int sm_alog[256];

static const int sm_log[256];

static const char sm_S[256];

static const char sm_Si[256];

static const int sm_T1[256];

static const int sm_T2[256];

static const int sm_T3[256];

static const int sm_T4[256];

static const int sm_T5[256];

static const int sm_T6[256];

static const int sm_T7[256];

static const int sm_T8[256];

static const int sm_U1[256];

static const int sm_U2[256];

static const int sm_U3[256];

static const int sm_U4[256];

static const char sm_rcon[30];

static const int sm_shifts[3][4][2];

static char const* sm_szErrorMsg1;

static char const* sm_szErrorMsg2;

bool m_bKeyInit;

int m_Ke[MAX_ROUNDS+1][MAX_BC];

int m_Kd[MAX_ROUNDS+1][MAX_BC];

int m_keylength;

int m_blockSize;

int m_iROUNDS;

char m_chain0[MAX_BLOCK_SIZE];

char m_chain[MAX_BLOCK_SIZE];

int tk[MAX_KC];

int a[MAX_BC];

int t[MAX_BC];

};

Python编程实现加密解密读取文件

对 Python 加密时可能会有两种形式,一种是对Python转成的exe进行保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程。

1、 对 python转exe加壳

下载最新版Virbox Protector加壳工具,使用加壳工具直接对demo.exe进行加壳操作

2、对.py/.pyc加密

第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。

第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。

安全技术:

l 虚拟机外壳:精锐5的外壳保护工具,创新性的引入了预分析和自动优化引擎,有效的解决了虚拟化保护代码时的安全性和性能平衡问题。

l 碎片代码执行:利用自身成熟的外壳中的代码提取技术,抽取大量、大段代码,加密混淆后在安全环境中执行,最大程度上减少加密锁底层技术和功能的依赖,同时大量大段地移植又保证了更高的安全性。

l Virbox加密编译引擎:集编译、混淆等安全功能于一身,由于在编译阶段介入,可优化空间是普遍虚拟化技术无法比拟的,对代码、变量的混淆程度也有了根本的提升。

l 反黑引擎:内置R0级核心态反黑引擎,基于黑客行为特征 的(反黑数据库)反制手段。精准打击调试、注入、内存修改等黑客行为,由被动挨打到主动防护。

加密效果:

加密之前

以pyinstall 的打包方式为例,使用pyinstxtractor.py文件对log_322.exe进行反编译,执行后会生成log_322.exe_extracted文件夹,文件夹内会生成pyc文件。

成功之后会在同目录下生成一个文件夹

使用010 Editor添加几个字节,重命名为pyc文件

注【此处和python的版本有关,Python27的可以直接解压为pyc文件,Python34还需要添加几个字节】

然后使用EasyPython Decompiler 工具反编译pyc

成功之后通目录下会生成dis文件,生成出的dis文件可以用文本编辑器打开,看到源码

反编译后的log_322.exe的源码

加密之后:

【注:不同的打包方式原理不同,源码存放的位置也不同,所以需要保护的具体模块也是不同的】

加密之后再尝试解压log322.exe失败,已经无法进行反编译,使用常规反编译工具也是无法进行分析的。

python的加密方式: rsa加密和解密

RSA加密是一种非对称加密,通常使用公钥加密,私钥解密。

生成文件如下图:

可以将生成的公钥、私钥粘贴复制存储起来,以便使用:

在使用中, 通常会先对数据进行bas64加密, 再对加密后的内容使用rsa加密, 最后对rsa解密后的内容进行bas64解密.

用Python2.7.10编写凯撒密码加密和解密程序

s = raw_input('[开始加密]please input your str:')

s = list(s)

n = 0

for sw in s:

s[n] = chr(ord(sw)+3)

n = n + 1

sout = ''

for sw2 in s:

sout = sout + sw2

print '[加密结果]:',sout

解密的类似,主要用到ord、chr函数。

Python加密与解密 No module named 'Crypto'

python版本:python3,系统:win

会安装很多包:chardet, certifi, urllib3, idna, requests, pyyaml, Naked, shellescape, crypto

这时你会看到有crypto文件夹,将其重命名为Crypto即可;

pip uninstall pycrypto,然后安装pycryptodome,pip install pycryptodome,即可。

你会发现site-packages下的该模块的目录名已经是大写了-Crypto

这个时候pycryptodome就来了,它是pycrypto的延伸版本,用法和pycrypto是一模一样的

Python\Python36\Lib\site-packages,找到这个路径,下面有一个文件夹叫做crypto,将小写c改成大写C就ok了。


文章题目:加密解密函数python 编一个加密和解密的函数过程
转载源于:http://cdkjz.cn/article/doddioi.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220