Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 不使用正向或反向斜杠的三重DES_Asp.net Mvc_Model View Controller_Encryption_Tripledes - Fatal编程技术网

Asp.net mvc 不使用正向或反向斜杠的三重DES

Asp.net mvc 不使用正向或反向斜杠的三重DES,asp.net-mvc,model-view-controller,encryption,tripledes,Asp.net Mvc,Model View Controller,Encryption,Tripledes,是否可以修改三重DES,以便在加密/解密时不包含正向斜杠和反向斜杠 我在mvc上有一个actionlink,它不需要加密,但是当我试图加密传递给控制器方法的id时,该id被加密,并包含一些正斜杠(/vO5Ppr4+Phzx+lHD4Jp6JubZlYXK0Az9OA9J8urf+MJFw62c3Y0Q/Q=)因此,我得到一个404未找到,并且没有调用控制器方法 MVC ActionLink: <span> | </span> @Html.ActionLink("Stude

是否可以修改三重DES,以便在加密/解密时不包含正向斜杠和反向斜杠

我在mvc上有一个actionlink,它不需要加密,但是当我试图加密传递给控制器方法的id时,该id被加密,并包含一些正斜杠(
/vO5Ppr4+Phzx+lHD4Jp6JubZlYXK0Az9OA9J8urf+MJFw62c3Y0Q/Q=
)因此,我得到一个404未找到,并且没有调用控制器方法

MVC ActionLink:

<span> | </span> @Html.ActionLink("Student Rights", "StudentRights","Threads", new { id = CommonLayer.Securities.Encryption.EncryptTripleDES(item.ID) }, null)
|@Html.ActionLink(“学生权利”、“学生权利”、“学生权利”、“线程”、新的{id=CommonLayer.Securities.Encryption.EncryptTripleDES(item.id)},null)
加密方法:

private static byte[] KEY_192 = 
        {
            111,21,12,65,21,12,2,1,
            5,30,34,78,98,1,32,122,
            123,124,125,126,212,212,213,214
        };

    private static byte[] IV_192 = 
        {
            1,2,3,4,5,12,13,14,
            13,14,15,13,17,21,22,23,
            24,25,121,122,122,123,124,124
        };

    /// <summary>
    /// Encrypt using TripleDES
    /// </summary>
    /// <param name="vl">String to Encrypt</param>
    /// <returns>Encrypted String</returns>
    public static String EncryptTripleDES(String vl)
    {
        if (vl != "")
        { 
            TripleDESCryptoServiceProvider cryptoprovider = new TripleDESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, cryptoprovider.CreateEncryptor(KEY_192, IV_192), CryptoStreamMode.Write);
            StreamWriter sw = new StreamWriter(cs);
            sw.Write(vl);
            sw.Flush();
            cs.FlushFinalBlock();
            ms.Flush();
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        } 
        return "";
    } 

    /// <summary>
    /// Decrypt using TripleDES
    /// </summary>
    /// <param name="vl">String to Decrypt</param>
    /// <returns>Decrypted String</returns>
    public static String DecryptTripleDES(String vl)
    { 
        if (vl != "")
        { 
            TripleDESCryptoServiceProvider cryptoprovider = new TripleDESCryptoServiceProvider();
            Byte[] buffer = Convert.FromBase64String(vl);
            MemoryStream ms = new MemoryStream(buffer);
            CryptoStream cs = new CryptoStream(ms, cryptoprovider.CreateDecryptor(KEY_192, IV_192), CryptoStreamMode.Read);
            StreamReader sw = new StreamReader(cs);
            return sw.ReadToEnd();
        } 
        return "";
    }
private static byte[]KEY_192=
{
111,21,12,65,21,12,2,1,
5,30,34,78,98,1,32,122,
123,124,125,126,212,212,213,214
};
专用静态字节[]IV_192=
{
1,2,3,4,5,12,13,14,
13,14,15,13,17,21,22,23,
24,25,121,122,122,123,124,124
};
/// 
///使用三元组加密
/// 
///要加密的字符串
///加密字符串
公共静态字符串加密三元组(字符串vl)
{
如果(vl!=“”)
{ 
TripleDESCryptoServiceProvider cryptoprovider=新的TripleDESCryptoServiceProvider();
MemoryStream ms=新的MemoryStream();
CryptoStream cs=新的加密流(ms,cryptoprovider.CreateEncryptor(KEY_192,IV_192),CryptoStreamMode.Write);
StreamWriter sw=新StreamWriter(cs);
软件写入(vl);
sw.Flush();
cs.FlushFinalBlock();
弗拉什女士();
返回Convert.ToBase64String(ms.GetBuffer(),0,(int)ms.Length);
} 
返回“”;
} 
/// 
///使用三元组解密
/// 
///要解密的字符串
///解密字符串
公共静态字符串解密三元组(字符串vl)
{ 
如果(vl!=“”)
{ 
TripleDESCryptoServiceProvider cryptoprovider=新的TripleDESCryptoServiceProvider();
字节[]缓冲区=Convert.FromBase64String(vl);
MemoryStream ms=新的MemoryStream(缓冲区);
CryptoStream cs=新的加密流(ms,cryptoprovider.CreateDecryptor(KEY_192,IV_192),CryptoStreamMode.Read);
StreamReader sw=新StreamReader(cs);
返回sw.ReadToEnd();
} 
返回“”;
}

这不是3DES的输出,而是随机(看起来)二进制数据的Base64编码

您可以简单地(原始)URL编码结果,也可以用任何其他字符替换字符。检查一下。试着遵守共同的标准,比如用
-
替换
+
,用标准化的
-
替换
/


您可能还需要删除结尾处的
=
字符。如果您的base 64库可以解码这样的base 64,则可以使用此方法,否则您只需再次附加它们,直到得到一个具有4个base 64字符倍数的字符串。

以下函数适用于另一篇文章


就像owlstead建议的那样,使用RFC4648中描述的url安全Base64编码

我的实现产生了一点垃圾,但对于短字符串,只要每秒不调用一百万次,它就不重要了

public static string ToUrlSafeBase64(byte[] bytes)
{
    return Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_').Replace("=","");
}

public static byte[] FromUrlSafeBase64(string s)
{
    while (s.Length % 4 != 0)
        s += "=";
    s = s.Replace('-', '+').Replace('_', '/');
    return Convert.FromBase64String(s);
}
用作:

var str = ToUrlSafeBase64(bytes);

var bytes = FromUrlSafeBase64(str);

如何将其应用于我的方法?考虑另一种编码不是一个好主意,最好使用RFC4648编码。函数是用PHP编写的。你需要把它们改成c。实际上,它们的意思是将“+”替换为“,”,将“/”替换为“-”,这在URL中是有效的。然后在解码时替换回来。Convert.ToBase64String为BASE64编码,Convert.FromBase64String为BASE64解码。目前没有时间在C#.@keiv.fly中写下剽窃投诉是荒谬的。Owlstead建议使用4648中的url安全字母表,这是解决这个问题的标准方法。你可以假设他已经熟悉了这种方法,而不是从你的帖子中得到的。在你指责我抄袭之前,先检查一下我的答案,答案已经有一年多了。除此之外,我甚至没有投反对票。我认为答案很接近,而且使用起来很实用,但不符合标准。这个问题与加密完全无关。这是关于如何使用ASP.NET MVC将带有斜杠的字符串放入URL。可能重复的我不理解您的答案。我如何应用我的方法?
var str = ToUrlSafeBase64(bytes);

var bytes = FromUrlSafeBase64(str);