-1

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

我在 mvc 上有这个动作链接,它在没有加密的情况下工作,但是当我尝试加密传递给控制器​​方法的 id 时,id 被加密并包含一些正斜杠(/vO5Ppr4+Phzx+lHD4Jp6JubZlYXK0Az9OA9J8urf+MJFw62c3Y0Q/Q==)因此我得到一个 404 未找到并且控制器方法不是被调用。

MVC 动作链接:

<span> | </span> @Html.ActionLink("Student Rights", "StudentRights","Threads", new { 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 "";
    }
4

3 回答 3

2

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

您可以简单地(原始)对结果进行 URL 编码,也可以将字符替换为任何其他字符。检查Wikipedia 上的 Base 64 页面以获取想法。尝试并遵守通用标准,例如将 替换为+-并按照RFC 4648的标准/替换为。_

您可能还想删除最后的=字符。如果您的 base 64 库可以解码此类 base 64,则此方法有效,否则您可以简单地再次附加它们,直到您得到一个包含 4 个 base 64 字符的倍数的字符串。

于 2014-05-25T12:51:53.260 回答
2

就像 owlstead 建议的那样,使用 RFC 4648 中描述的 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);
于 2014-05-25T16:53:00.400 回答
0

以下函数适用于另一篇文章为什么是base64-encode-adding-a-slash-in-the-result

function mybase64_encode($s) {
    return str_replace(array('+', '/'), array(',', '-'), base64_encode($s));
}


function mybase64_decode($s) {
    return base64_decode(str_replace(array(',', '-'), array('+', '/'), $s));
}
于 2014-05-25T12:55:33.167 回答