RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1270539
Accepted
Radzhab
Radzhab
Asked:2022-04-15 19:29:11 +0000 UTC2022-04-15 19:29:11 +0000 UTC 2022-04-15 19:29:11 +0000 UTC

如何解密 AES SHA-256 CBC?

  • 772

有一个使用此算法加密的字符串。

b'{"merchantID": "XXXXXXXXXXX", "tokenID": "YYYYYY-YYYYYYYYYY-YYYY"}'

在输出中,我看到了有效载荷 25BE197FB04DAC542243AC124C3799031007417C2E214C833318C469D7D328DB889B36CDAACBB67D6F528911F3B31F7E3E4D44E3016A5A29D179998665FB4B590F42F4FEFA6771B5302AE1C067D9ACE0F8477D11BA82217B9A9F0E4941545161

在调试模式下,我看到了一条踪迹。设置 在此处输入图像描述

我正在尝试使用解密方法解密字符串 - 它给出了

from base64 import b16encode, b16decode
from os import urandom

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.hashes import SHA1
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

from gateway.exceptions import ConfigurationError

class Crypt:
    """AES-256-CBC crypto class"""

    IV_LENGTH = 16
    token = ""
    cert =  ""

    def __init__(self, conf_token, conf_cert):

        def get_repr_fp(cert):
            fingerprint = x509.load_pem_x509_certificate(
                    cert, default_backend()).fingerprint(SHA1())
            fingerprint = b16encode(fingerprint).decode()
            return ":".join(str(fingerprint[i:i+2]).upper() for i in range(
                0, len(fingerprint), 2))

        def gen_key(fp):
            token = conf_token
            return ("".join(
                    chr(ord(x) | ord(y))
                    for x, y in zip(fp, token))[:len(token)]).encode()

        try:
            with open(conf_cert, 'rb') as f:
                pub = f.read()
                f.close()
            fingerprint = get_repr_fp(pub)
            encryptkey = gen_key(fingerprint)
        except TypeError as e:
            raise ConfigurationError() from e

        aes = algorithms.AES(encryptkey)
        self.BLOCK_SIZE = aes.block_size
        self.KEY_LENGTH = int(aes.key_size / 8)

        self.__decryptkey = fingerprint[:self.KEY_LENGTH].encode()
        self.__encryptkey = encryptkey

    def __cipher(self, key, iv):
        aes = algorithms.AES(key)
        return Cipher(aes, modes.CBC(iv), backend=default_backend())

    def encryptor(self, iv):
        """Get encryptor context"""
        return self.__cipher(self.__encryptkey, iv).encryptor()

    def decryptor(self, iv):
        return self.__cipher(self.__decryptkey, iv).decryptor()

    def __pad_data(self, data):
        """Add null padding to data"""
        block_bytes = int(self.BLOCK_SIZE / 8)
        data = data + bytes((block_bytes - len(data) % block_bytes))
        return data

    def __unpad_data(self, data):
        """Remove padding from data"""
        return data.decode().strip()

    def encrypt(self, data):
        """Encrypt content"""
        iv = urandom(self.IV_LENGTH)
        encryptor = self.encryptor(iv)
        return b16encode(iv + (encryptor.update(self.__pad_data(
            data)) + encryptor.finalize()))

    def decrypt(self, data):
        """Decrypt content"""
        data = b16decode(data.upper())
        decryptor = self.decryptor(data[:self.IV_LENGTH])
        return self.__unpad_data(
            decryptor.update(data[self.IV_LENGTH:]) + decryptor.finalize())  
c = Crypt(conf_token="xxxxxxxxxxxxx+", conf_cert= "yyyy.pem")
rawtext = "zzzz"
a = rawtext.encode()
z = c.encrypt(a)
print("Encrypted - :",z)
f = c.decrypt(z)
print(f)
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mikhail Murugov
    2022-04-15T20:38:42Z2022-04-15T20:38:42Z

    AES 是一种对称密码。这意味着数据使用相同的密钥进行加密和解密。
    此外,您将“私钥”形成为某种带有冒号的难以理解的字符串。

    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5