吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1381|回复: 4
收起左侧

[求助] python 实现aes cbc 加密效果不对

[复制链接]
pwp 发表于 2022-11-7 21:13
[Python] 纯文本查看 复制代码
import base64
import ast
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


class AesCBC:
    key = '2v4T2aTDnXzkCEV7'.encode('utf-8')    #16位
    iv = b'abcdefghijklmnop'   # 16位

    # 如果text不足16位的倍数就用空格补足为16位
    def add_to_16(self, text):
        if len(text.encode('utf-8')) % 16:
            add = 16 - (len(text.encode('utf-8')) % 16)
        else:
            add = 0
        text = text + ('\0' * add)
        return text.encode('utf-8')

    def encrypt(self, text) -> str:
        # 加密函数
        mode = AES.MODE_CBC
        text = self.add_to_16(text)
        cryptos = AES.new(self.key, mode, self.iv)
        cipher_text = cryptos.encrypt(text)
        # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
        print(cipher_text)
        return str(base64.b64encode(b2a_hex(cipher_text)), encoding='utf-8')

    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, text):
        text = base64.b64decode(text)
        mode = AES.MODE_CBC
        cryptos = AES.new(self.key, mode, self.iv)
        plain_text = cryptos.decrypt(a2b_hex(text))
        return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
    k = '1667822543031;3033_6282_254;2v4T2aTDnXzkCEV7'
    e = AesCBC().encrypt(k)  # 加密

    d = AesCBC().decrypt(e)  # 解密
    print("加密:", e)
    print("解密:", d)
    # print(type(d))
#    print(ast.literal_eval(d)['username'])


已知
key = '2v4T2aTDnXzkCEV7'.encode('utf-8') #16位
iv = b'abcdefghijklmnop' # 16位

加密的结果是ODdhMzg1MGE5N2UyNDBlN2FlZjM4MzA3YzhkY2JkZDc0MjExYjZmYjAwZDdmNTM3OGFiNWY4M2IxODcyMmNjYjRhMDQ2OWM3YjgzYzkxZmRiMzczNThkYjdmMGNlYzk0
但是,
我在网页 https://www.qtool.net/aes 加密得到的字符串是 h6OFCpfiQOeu84MHyNy910IRtvsA1/U3irX4OxhyLMubZS/Ofpyb0kP/GhSTRTPP

怎么改我上面的代码,能得到网页的加密效果呢

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| pwp 发表于 2022-11-7 21:43
python AES CBC 128位Noppadding加密算法
def decrypt(text):
    padding = '\0'
    key = 'yourkey'
    iv = 'youriv'
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return cipher.decrypt(binascii.a2b_base64(text).rstrip(padding))


对应的JS算法(依赖CryptoJS):

var key = CryptoJS.enc.Utf8.parse('yourkey');
var iv = CryptoJS.enc.Utf8.parse('youriv');
var decrypt = CryptoJS.AES.decrypt(url, key, {
   iv: iv,
   mode: CryptoJS.mode.CBC,
   padding: CryptoJS.pad.ZeroPadding
});
var result = CryptoJS.enc.Utf8.stringify(decrypt).toString();

就为了这么一个算法,我忙活了一下午,坑死老子了!

坑:系统是win10,C++ Compiler for python 2.7不好使,导致编译pycrypto各种不服,百度爬文三小时,最后放弃了。使用linux不存在这个问题。

既然pycrypto不能用,能不能找到替代的库呢?谷歌一下后还真找到了,pycryptodome,这个是编译好了的库,直接pip install即可。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
liyitong + 1 + 1 我很赞同!

查看全部评分

yangand 发表于 2022-11-7 22:27
padding 不对吧,你这个是zeropadding 即不足16位以0填充。一般是pkcs7padding
androllen 发表于 2022-11-7 23:25
pwp 发表于 2022-11-7 21:43
python AES CBC 128位Noppadding加密算法
def decrypt(text):
    padding = '\0'

pycrypto 早就不维护了,咋还用阿?
pycryptodome 这个库是替换 pycrypto的
hebeijianke 发表于 2022-11-7 23:52
本帖最后由 hebeijianke 于 2022-11-8 01:44 编辑

https://www.52pojie.cn/forum.php?mod=viewthread&tid=1566703
这里有大佬的代码
28行 return str(base64.b64encode(b2a_hex(cipher_text)), encoding='utf-8')修改成return str(base64.b64encode(cipher_text), encoding='utf-8')
35行 plain_text = cryptos.decrypt(a2b_hex(text))修改成plain_text = cryptos.decrypt(text)
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-12 02:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表