获取值错误:尝试解密消息时,MAC 检查失败,使用 pycryptodome 进行 AES 加密

如何解决获取值错误:尝试解密消息时,MAC 检查失败,使用 pycryptodome 进行 AES 加密

嗨,我正在使用套接字和 pycryptodome 制作一个程序,该程序可以将加密消息传输到另一个“客户端”,而无需预先共享密钥。

目前,我将我的程序设置为客户端和服务器都生成 RSA 密钥并相互共享公钥。然后他们使用这些密钥相互发送随机字节,最后使用 AES 加密和解密相互接收和发送消息

我的代码:

'服务器'端:

import os
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP


def rsa_key_generate():
    key = RSA.generate(4096)
    private_key = key.exportKey()
    public_key = key.publickey().export_key()
    del key
    return private_key,public_key


def rsa_encrypt_data(data,public_key):
    recipient_key = RSA.import_key(public_key)
    cipher_rsa = PKCS1_OAEP.new(recipient_key)
    del recipient_key
    encrypted_data = cipher_rsa.encrypt(data)
    del cipher_rsa,data
    return encrypted_data


def rsa_decrypt_data(encrypted_data,private_key):
    private_key = RSA.import_key(private_key)
    rsa_cipher = PKCS1_OAEP.new(private_key)
    del private_key
    decrypted_data = rsa_cipher.decrypt(encrypted_data)
    del rsa_cipher
    return decrypted_data


def aes_key_generate():
    random_bytes = os.urandom(32)
    cipher = AES.new(random_bytes,AES.MODE_EAX)
    return cipher,random_bytes


def aes_encrypt_data(text,cipher):
    text = text.encode()
    ciphertext,tag = cipher.encrypt_and_digest(text)
    encrypted = str(cipher.nonce + tag + ciphertext).encode()
    return encrypted


def aes_decrypt_data(encrypted,key):
    encrypted = encrypted
    key = key
    nonce,tag,ciphertext = encrypted[:16],encrypted[16:32],encrypted[32:]
    cipher = AES.new(key,AES.MODE_EAX,nonce)
    decrypted = cipher.decrypt_and_verify(ciphertext,tag)
    return decrypted.decode()


if __name__ == '__main__':
    HOST = '127.0.0.1'
    PORT = 65432
    rsa_key = rsa_key_generate()
    aes_key = aes_key_generate()
    with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as socks:
        socks.bind((HOST,PORT))
        while 1:
            socks.listen()
            conn,addr = socks.accept()
            with conn:
                print('Connected by: ',addr)
                conn.sendall(rsa_key[1])
                client_rsa_public_key = conn.recv(4096)
                encrypted_urandom = rsa_encrypt_data(aes_key[1],client_rsa_public_key)
                client_encrypted_urandom = conn.recv(4096)
                conn.sendall(encrypted_urandom)
                client_urandom = rsa_decrypt_data(client_encrypted_urandom,rsa_key[0])


                def encrypted_send(socket_name,to_send,cipher):
                    to_send = aes_encrypt_data(to_send,cipher)
                    socket_name.sendall(to_send)


                def encrypted_receive(socket_name,urandom):
                    data_received = socket_name.recv(4096)
                    decrypted_data = aes_decrypt_data(data_received,urandom)
                    return decrypted_data


                encrypted_send(conn,"AAAAAAAAAAA",aes_key[0])

'客户端':

import os
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP


def rsa_key_generate():
    key = RSA.generate(4096)
    private_key = key.exportKey()
    public_key = key.publickey().export_key()
    del key
    return private_key,socket.SOCK_STREAM) as socks:
        socks.connect((HOST,PORT))
        server_rsa_public_key = socks.recv(4096)
        socks.sendall(rsa_key[1])
        encrypted_urandom = rsa_encrypt_data(aes_key[1],server_rsa_public_key)
        socks.sendall(encrypted_urandom)
        server_encrypted_urandom = socks.recv(4096)
        server_urandom = rsa_decrypt_data(server_encrypted_urandom,rsa_key[0])


        def encrypted_send(socket_name,cipher):
            to_send = aes_encrypt_data(to_send,cipher)
            socket_name.sendall(to_send)


        def encrypted_receive(socket_name,urandom):
            data_received = socket_name.recv(4096)
            if len(data_received) != 0:
                decrypted_data = aes_decrypt_data(data_received,urandom)
                return decrypted_data
            else:
                return False


        print(encrypted_receive(socks,server_urandom))

我得到的错误(在客户端):

Traceback (most recent call last):
  File "P:/Python/Pycharm/Work-In-Progress/socks/cs_key_ex_2/client.py",line 85,in <module>
    print(encrypted_receive(socks,server_urandom))
  File "P:/Python/Pycharm/Work-In-Progress/socks/cs_key_ex_2/client.py",line 79,in encrypted_receive
    decrypted_data = aes_decrypt_data(data_received,urandom)
  File "P:/Python/Pycharm/Work-In-Progress/socks/cs_key_ex_2/client.py",line 52,in aes_decrypt_data
    decrypted = cipher.decrypt_and_verify(ciphertext,tag)
  File "C:\Python39\lib\site-packages\Crypto\Cipher\_mode_eax.py",line 368,in decrypt_and_verify
    self.verify(received_mac_tag)
  File "C:\Python39\lib\site-packages\Crypto\Cipher\_mode_eax.py",line 309,in verify
    raise ValueError("MAC check failed")
ValueError: MAC check failed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-