如何使用Python进行Rijndael方式的加密解密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用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; i<m_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];
; 参考技术A 以下是使用php进行Rijndael方式加密的例子:
function encrypt($data)
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256 ,'oqufXQ(?bc=6_hR2I3sMZChDpb6dDlw4', $data , MCRYPT_MODE_CBC, utf8_encode('fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA')));
我曾找到这个代码,里面的答案的确可行,但如何自定义iv?(即utf8_encode('fOaiIOkD8*9Xeu_s4_bb87Ox_UG+D9GA'))
另,block_size、key_size和iv_size均需要为32(字节)。
编译mcrypt.c,GCC提示错误如下:
mcrypt.c: In function 'initmcrypt':
mcrypt.c:1714:2: error: incompatible type for argument 1 of 'PyString_FromString
'
In file included from C:\Python27\include/Python.h:94:0,
from mcrypt.c:24:
C:\Python27\include/stringobject.h:63:24: note: expected 'const char *' but argu
ment is of type 'double'
error: command 'gcc' failed with exit status 1本回答被提问者和网友采纳
以上是关于如何使用Python进行Rijndael方式的加密解密的主要内容,如果未能解决你的问题,请参考以下文章
是否有像 PHP 一样进行 Rijndael 256 位加密的 JavaScript 库?