注意:有可能会出现后端解密出来的数据为空的情况,所以需要前端先验证一下是否可以正常解密。
前端代码
<script src="http://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
<script>
function AES_ECB_ENCRYPT(text, secretKey) {
var keyHex = CryptoJS.enc.Base64.parse(secretKey);
var messageHex = CryptoJS.enc.Utf8.parse(text);
var encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {
"mode": CryptoJS.mode.ECB,
"padding": CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
function AES_ECB_DECRYPT(textBase64, secretKey) {
var keyHex = CryptoJS.enc.Base64.parse(secretKey);
var decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, {
"mode": CryptoJS.mode.ECB,
"padding": CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypt);
}
function initValidate() {
var loginForm = $("#LoginForm");
var validForm = loginForm.validate({
errorClass: "validate-inline",
rules: {
UserName: {
required: true,
},
Password: {
required: true,
}
},
messages: {
UserName: {
required: "请输入用户名!",
},
Password: {
required: "请输入密码!",
},
Code: {
required:"请输入验证码!"
}
},
highlight: function (element) { // hightlight error inputs
$(element)
.closest('.control-group').removeClass('success').addClass('error'); // set error class to the control group
},
unhighlight: function (element) { // revert the change dony by hightlight
$(element).closest('.control-group').removeClass('error'); // set error class to the control group
},
success: function (label) {
label.closest('.control-group').removeClass('error').addClass('success'); // set success class to the control group
},
submitHandler: function (form) {
var message = $("#Password").val().toString();
console.log(message);
//前后端key值需要保持一致
var key = "12345678900000001234567890000000";
// 测试AES-256-ECB
var ecbEncrypt = AES_ECB_ENCRYPT(message, key);
console.log("ecb加密", ecbEncrypt);
var ecbDecrypt = AES_ECB_DECRYPT(ecbEncrypt, key);
console.log("ecb结果比较---", ecbDecrypt)
var data = {
UserName: $("#UserName").val(),
Password: ecbEncrypt,//$("#Password").val()
Code: $("#Code").val()
};
$.ajax({
type: 'post',
url: '@Url.Action("Login", "AccountApi")',
data: data,
success: function (data) {
if (data.success) {
$("#logging").text("登录成功,正在跳转...");
window.location.href = "@Url.Action("Switch","Home")?ReturnUrl=@Url.Action("Home", "Meeting")";
}
else {
validForm.showErrors({ Password: data.msg });
$("#login").show();
$("#logging").hide();
}
},
beforeSend: function () {
$("#logging").show();
$("#login").hide();
},
error: function () {
$("#login").show();
$("#logging").hide();
validForm.showErrors({ Password: "出现错误,请重试!" });
},
complete: function () {}
})
}
})
</script>
后端代码
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
var a = model.Password;
model.Password = AesDecryptor_Base64(a, "12345678900000001234567890000000");
//省略..................
}
public static string AesDecryptor_Base64(string DecryptStr, string Key)
{
try
{
//byte[] keyArray = Encoding.UTF8.GetBytes(Key);
byte[] keyArray = Convert.FromBase64String(Key);
byte[] toEncryptArray = Convert.FromBase64String(DecryptStr);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);// UTF8Encoding.UTF8.GetString(resultArray);
}
catch (Exception ex)
{
return null;
}
}