1. 程式人生 > >python Crypto AES-256-ECB 與PHP之間完成加解密

python Crypto AES-256-ECB 與PHP之間完成加解密

openss 固定 base aes ecb 世界 and brush mode

AES算法描述:
  首先AES是一種對稱加密算法。

算法特點:

  1、AES的區塊長度固定為128 比特(16字節)。
    # 因此在加密前需要對待加密字符串進行填充,長度填充至128bit整數倍。

  2、密鑰長度可以是128(AES-128-ECB),192(AES-192-ECB)或256(AES-256-ECB)比特。
    # 在加解密前需要對加密密鑰進行填充,填充至對應位數。

1、php:aes-256-ecb解密:

<?php
$encryptString = base64_decode($encryptString);
$iv = openssl_random_pseudo_bytes(16);
$decryptedpass = rtrim(openssl_decrypt($enpass,‘aes-256-ecb‘, "16位密鑰" ,OPENSSL_RAW_DATA, $iv), "\0\4");

2、python:aes-256-ecb加解密(1、代碼是從別的博客搬過來後修改的;2、python是基於python2.7.2)

import base64
from Crypto.Cipher import AES

class AESCipher():
    def __init__(self, key):
        self.key = key
        self.key = key + (32-len(key)) * chr(0)
        # self.key = key + (24-len(key)) * chr(0) # AES-192-ECB
        # self.key = key + (16-len(key)) * chr(0) # AES-128-ECB
        self.BLOCK_SIZE = 16  # Bytes
        self.pad = lambda s: s + (self.BLOCK_SIZE - len(s) % self.BLOCK_SIZE) * chr(self.BLOCK_SIZE - len(s) % self.BLOCK_SIZE)
        self.unpad = lambda s: s[:-ord(s[len(s) - 1:])]

    def encrypt(self, raw):
        raw = self.pad(raw)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return base64.b64encode(cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return self.unpad(cipher.decrypt(enc)) 

3、openssl 命令行:
cat "加密串" | openssl enc -aes-256-ecb -e -K base64encode("16位加密密鑰") -iv 000 -a -nopad

# 其中在ECB模式下是不需要初始化向量IV,(ECB是直接按照拆分後數據塊加解密的),但是不接IV是會在命令行報錯的,(上述PHP代碼中的IV其實是可以省略的)

總結:
  AES-ECB,是將原始字符串分成128bit的若幹數據塊進行加解密的、當密鑰長度為192時為AES-192-ECB模式;密鑰長度為256時為AES-256-ECB模式。

  坑:
    當密鑰長度為16字節時,在PHP與OpenSSL命令行中,只要修改加解密模式,原始密鑰不需要進行修改就能完成相應功能,但是python作為世界上第二號的語言,只能自己修改密鑰長度、自己擴充輸入源。

python Crypto AES-256-ECB 與PHP之間完成加解密