如何使用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 库?

如何使用Rijndael加密与.Net Core类库

Delphi DEC 库 (Rijndael) 加密

JAVA如何解密用PHP加密的base64编码和RIJNDAEL 256的数据?

python:如何加密文件?

使用Python进行AES加密和解密