首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >要解密的数据长度无效。用Javascript加密,用c#解密

要解密的数据长度无效。用Javascript加密,用c#解密
EN

Stack Overflow用户
提问于 2018-11-05 19:43:33
回答 1查看 323关注 0票数 0

我必须加密和编码的网址使用Javascript,然后解密和解码使用C#。

如果我使用Visual Studio在Debug中运行代码。它的性能很好。但是,当我使用表单中的URL调用应用程序时,它会失败,并显示错误:“要解密的数据的长度无效”。

我在这里做错了什么?我已经检查了多个教程,但找不到并解决了这个问题。

加密Javascript代码:

代码语言: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) + "&timestamp=" + Encrypt(timestamp);
}

解密C#代码:

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-11-05 20:56:54

我在这里猜测也许你的URL param解析器会因为'=‘填充字符而与base64解码混淆。除此之外,AES函数的输入/输出必须是块对齐的。由于您使用的是128位密钥/ IV,因此必须确保提供16字节对齐大小的加密/解密函数(除非您的框架另有明确说明)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53153733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档