我必须加密和编码的网址使用Javascript,然后解密和解码使用C#。
如果我使用Visual Studio在Debug中运行代码。它的性能很好。但是,当我使用表单中的URL调用应用程序时,它会失败,并显示错误:“要解密的数据的长度无效”。
我在这里做错了什么?我已经检查了多个教程,但找不到并解决了这个问题。
加密Javascript代码:
function Encrypt(value){
var key = CryptoJS.enc.Utf8.parse("1234567812345678");
var iv = CryptoJS.enc.Utf8.parse("1234567812345678");
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(value), key,
{
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
var encodedValue = window.btoa(encrypted);
console.log("encodedValue: " + encodedValue);
var decodedValue = window.atob(encodedValue);
console.log("decodedValue: " + decodedValue);
return encodedValue;
}
function openAws(event) {
event.preventDefault()
var lastname = document.getElementById("lastname").value;
var firstname = document.getElementById("firstname").value;
var email = document.getElementById("email").value;
var time1 = new Date();
var hour = time1.getUTCHours();
if(hour < 10)
hour = "0" + hour;
var min = time1.getUTCMinutes();
if(min < 10)
min = "0" + min;
var sec = time1.getUTCSeconds();
if(sec < 10)
sec = "0" + sec;
var timestamp = hour.toString() + min.toString() + sec.toString();
var encryptedValues = encryptTestURL + "?lastname=" + Encrypt(lastname) + "&firstname=" + Encrypt(firstname) + "&email=" + Encrypt(email) + "×tamp=" + Encrypt(timestamp);
}
解密C#代码:
public string DecryptParams(string param)
{
var keyBytes = Encoding.UTF8.GetBytes("1234567812345678");
var iv = Encoding.UTF8.GetBytes("1234567812345678");
//Decrypt from CryptoJS
var decodedParam = HttpUtility.UrlDecode(param);
var encrypted = Convert.FromBase64String(decodedParam);
var decriptedFromJavascript = DecryptedStringFromBytes(encrypted, keyBytes, iv);
return decriptedFromJavascript;
}
public static string DecryptedStringFromBytes(byte[] cypherText, byte [] key, byte [] iv)
{
if(cypherText == null || cypherText.Length <= 0)
{
throw new ArgumentException("cypherText");
}
if(key == null || key.Length <= 0)
{
throw new ArgumentException("key");
}
if(iv == null || iv.Length <= 0)
{
throw new ArgumentException("key");
}
//Declare String to be used
string plainText = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (var rijAlg = new RijndaelManaged())
{
rijAlg.Mode = CipherMode.CBC;
rijAlg.Padding = PaddingMode.None;
rijAlg.FeedbackSize = 128;
rijAlg.Key = key;
rijAlg.IV = iv;
var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
using (var msDecrypt = new MemoryStream(cypherText))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
//Read Decrypted bytes
plainText = srDecrypt.ReadToEnd();
}
}
}
}
return plainText;
}
发布于 2018-11-05 20:56:54
我在这里猜测也许你的URL param解析器会因为'=‘填充字符而与base64解码混淆。除此之外,AES函数的输入/输出必须是块对齐的。由于您使用的是128位密钥/ IV,因此必须确保提供16字节对齐大小的加密/解密函数(除非您的框架另有明确说明)。
https://stackoverflow.com/questions/53153733
复制相似问题