flask解密前端加密数据的报错

最近在做一个登录注册页面,想要把前端提交的数据进行加密,前端使用的加密库为CryptoJS。加密方法使用的是AES.
后端web框架使用的是flask框架,后端通过pycryptodome库解密前端提交的数据。
但是后端在解密的时候出现了这个报错是什么问题呢?是哪里出现了问题呢,还请指点一下代码。

img

JS代码login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>login</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }

       .setlogin{
            text-align: center;
            margin-top: 30rem;
       }
    </style>    
</head>
<body>
    <div class="box-main">
        <form  class="setlogin" method="post">
            <input type="text" name="username" placeholder="请输入用户名" id="username"><br>
            <input type="password" name="password" placeholder="请输入密码" id="password"><br>
            <input type="submit" value="登录/注册" id="one">
        </form>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        let one=document.getElementById('one')
        let username=document.getElementById('username')
        let password=document.getElementById('password')
        /*ASE的key和初始偏移*/
        const key = CryptoJS.enc.Utf8.parse('ThisIsASecretKey111111111')
        const iv = CryptoJS.enc.Utf8.parse('ThisIsAnIV11111111111')

        one.onclick=function(event){
            event.preventDefault()
            const usernameAES = CryptoJS.AES.encrypt(username.value, key, { iv: iv }).toString()
            const passwordAES = CryptoJS.AES.encrypt(password.value, key, { iv: iv }).toString()
            $.ajax({
                url:'http://127.0.0.1:1145/login',
                type:'POST',
                data:{"username":usernameAES,"password":passwordAES},
                success:function(result){
                    alert(result)
                },
                error:function(){
                    alert('失败')
                }
            })
        }
    </script>
</body>
</html>

flask框架代码

from flask import Flask,jsonify,request,render_template
from Crypto.Cipher import AES
import base64

bp=Flask(__name__)

@bp.route('/login',methods=['GET','POST'])
def login():
    if request.method=='POST':
         # AES密钥
        key='ThisIsASecretKey111111111'
        iv='ThisIsAnIV11111111111'

        username=request.form['username']
        password=request.form['password']

        key = base64.b64decode(key)
        ciphertext = base64.b64decode(username)
        cipher = AES.new(key, AES.MODE_ECB)
        plaintext = cipher.decrypt(ciphertext)
        print(plaintext)

        return jsonify({'code':200,'message':'OK','data':'null'})
    return render_template('login.html')

if __name__=='__main__':
     bp.run(host='0.0.0.0', port=1145, debug=True)

前端通过CryptoJS加密后的用户名和密码,是以base64的形式传递给后端的,也就是说flask里面username和password是base64格式的。但是你的后端代码里b64decode的是key,key本身就不是base64格式的数据,所以就出问题了。第16、17行改成
username = base64.b64decode(username)
password = base64.b64decode(password)
之后在aes解密这两个数据,按照规则进行校验即可

有帮助的话,请点采纳该答案~

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这道题目并没有明确的问题需要解决,只是给出了一个2048小游戏的代码,要求对代码的实现进行分析和说明。根据参考资料中的代码,以下是本人的分析和说明:

    1. 代码结构

    参考资料给出的代码主要分为以下部分:

    (1)初始化棋盘

    (2)随机生成两个数字

    (3)游戏开始,进入死循环

    (4)判断游戏是否结束

    (5)获取用户输入

    (6)移动棋子

    其中,使用函数的形式封装了随机生成数字、判断游戏是否结束、移动棋子等核心代码,实现了代码的模块化,易于维护。

    1. 随机生成数字

    随机生成数字的方法是先找出棋盘中所有的空格(即值为0的元素),随机取一个空格并给其赋值2或4。此处给2和4的概率分别为0.9和0.1,可以适当地调整随机概率,增加游戏的趣味性。

    1. 判断游戏是否结束

    判断游戏是否结束的原理是先判断棋盘是否有空格(即值为0的元素),如果有,说明游戏未结束;否则,需要判断棋盘中是否有相邻的相同数字,如果有,也说明游戏未结束,反之,游戏结束。

    1. 移动棋子

    移动棋子的方法是根据用户输入的方向,将棋盘中的数字向该方向合并和滑动。具体而言,向左或向右合并的逻辑是从左至右或从右至左地扫描棋盘,将两个相邻的相同数字合并为一个,并将另一个置为0;移动棋子的逻辑是将非空格子向空格子移动,其中向左或向上移动时以小的索引方向先移动,向右或向下移动时以大的索引方向先移动。代码采用了嵌套循环遍历棋盘进行操作,逻辑清晰。

    综上所述,参考资料中给出的2048小游戏实现比较简单,代码采用了模块化和函数化的设计方式,实现了可读性和可维护性。对于玩家而言,可以通过参考这份代码,自己编写一个2048小游戏。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^