最近在做一个登录注册页面,想要把前端提交的数据进行加密,前端使用的加密库为CryptoJS。加密方法使用的是AES.
后端web框架使用的是flask框架,后端通过pycryptodome库解密前端提交的数据。
但是后端在解密的时候出现了这个报错是什么问题呢?是哪里出现了问题呢,还请指点一下代码。
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解密这两个数据,按照规则进行校验即可
不知道你这个问题是否已经解决, 如果还没有解决的话:有帮助的话,请点采纳该答案~
这道题目并没有明确的问题需要解决,只是给出了一个2048小游戏的代码,要求对代码的实现进行分析和说明。根据参考资料中的代码,以下是本人的分析和说明:
参考资料给出的代码主要分为以下部分:
(1)初始化棋盘
(2)随机生成两个数字
(3)游戏开始,进入死循环
(4)判断游戏是否结束
(5)获取用户输入
(6)移动棋子
其中,使用函数的形式封装了随机生成数字、判断游戏是否结束、移动棋子等核心代码,实现了代码的模块化,易于维护。
随机生成数字的方法是先找出棋盘中所有的空格(即值为0的元素),随机取一个空格并给其赋值2或4。此处给2和4的概率分别为0.9和0.1,可以适当地调整随机概率,增加游戏的趣味性。
判断游戏是否结束的原理是先判断棋盘是否有空格(即值为0的元素),如果有,说明游戏未结束;否则,需要判断棋盘中是否有相邻的相同数字,如果有,也说明游戏未结束,反之,游戏结束。
移动棋子的方法是根据用户输入的方向,将棋盘中的数字向该方向合并和滑动。具体而言,向左或向右合并的逻辑是从左至右或从右至左地扫描棋盘,将两个相邻的相同数字合并为一个,并将另一个置为0;移动棋子的逻辑是将非空格子向空格子移动,其中向左或向上移动时以小的索引方向先移动,向右或向下移动时以大的索引方向先移动。代码采用了嵌套循环遍历棋盘进行操作,逻辑清晰。
综上所述,参考资料中给出的2048小游戏实现比较简单,代码采用了模块化和函数化的设计方式,实现了可读性和可维护性。对于玩家而言,可以通过参考这份代码,自己编写一个2048小游戏。