-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

owlstead が示唆するように、RFC 4648 で説明されている URL セーフな Base64 エンコーディングを使用してください。

私の実装では少しゴミが生成されますが、短い文字列の場合、これを 1 秒間に 100 万回呼び出さない限り、それほど問題にはなりません。

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 に答える
2

これは 3DES の出力ではなく、ランダムな (見た目の) バイナリ データの Base 64 エンコードです。

結果を単純に (生で) URL エンコードするか、文字を他の文字に置き換えることができます。ウィキペディアの Base 64 ページでアイデアを確認してください。RFC 4648で標準化されているように、 を に置き換え+ たり、 に置き換えたりするなど、共通の標準に従うようにしてください。-/_

=末尾の文字を削除することもできます。これは、base 64 ライブラリがそのような base 64 をデコードできる場合に機能します。それ以外の場合は、4 の倍数の base 64 文字を持つ文字列が得られるまで、単純にそれらを追加できます。

于 2014-05-25T12:51:53.260 に答える
0

次の関数は別の投稿で機能しまし

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 に答える