【问题标题】:Triple DES without using forward or backward slashes不使用正斜杠或反斜杠的三重 DES
【发布时间】:2014-05-25 12:44:46
【问题描述】:

是否可以修改三重 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 "";
    }

【问题讨论】:

标签: asp.net-mvc model-view-controller encryption tripledes


【解决方案1】:

就像 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);

【讨论】:

    【解决方案2】:

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

    您可以简单地(原始)对结果进行 URL 编码,也可以将字符替换为任何其他字符。检查Base 64 page on Wikipedia for ideas。尝试并遵守通用标准,例如将+ 替换为-,并将/ 替换为_,由RFC 4648 标准化。

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

    【讨论】:

    • 我不明白你的回答。如何应用我的方法?
    【解决方案3】:

    以下函数在另一个帖子 why-is-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));
    }
    

    【讨论】:

    • 如何将它应用到我的方法中?
    • 考虑 yet 其他编码不是一个好主意,最好使用 RFC 4648 编码。
    • 函数是用 PHP 编写的。您需要将它们更改为 c#。实际上,它们的意思是您将 '+' 替换为 ',' 和 '/' 替换为 '-',这在 url 中是有效的。然后在您解码时更换回来。 Convert.ToBase64String 是 base64encode,Convert.FromBase64String 是 base64decode。目前没有时间用 C# 编写它们。
    • @keiv.fly 剽窃投诉是荒谬的。 Owlstead 建议使用 4648 的 url 安全字母表是该问题的标准解决方案。您可以假设他已经熟悉这种方法并且没有从您的帖子中得到它。在你也指责我抄袭之前,请查看我对Need an Encryption/decryption method does not have a '/' in the encrypted string 的回复,该回复已超过一年。
    • 除此之外,我什至没有投反对票。我认为答案足够接近,实用,但不符合标准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2015-01-27
    • 2021-05-29
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多