2017-02-18 8 views
2

オンラインで狩りを行い、文字列を受け取り、暗号化して解読する単純な暗号化方法を見つけました。アイデアは私が計画テキストに入れることができないURLに必要なIDを持っているということです。暗号化された文字列には結果にスラッシュ(/)が含まれているため、URLに問題が発生します。

は、私が見つけたクラスは、ほとんどの時間を素晴らしいworkesが、時には、私は/それであり、暗号化された文字列で終わる:あなたが想像できるように使用された場合

OSprnGR/0os4DQpQsa0gIg== 

は、それが問題を引き起こしURL。だから私は文字列をUrlEncodeすれば問題を解決できると思った。

これはありませんでした。

私はまだURLは次のようになります場合でも、同じエラーが出ます:

http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR%2f0os4DQpQsa0gIg%3d%3d 

の代わりにこの:

http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR/0os4DQpQsa0gIg== 

HTTPエラー404.0 - が見つかりませんでした あなたが探しているリソース削除されたか、名前が変更されたか、一時的に使用できません。

ここで私が使用しているクラスの:

public static class Encryption 
{ 
    public static string keyString { get { return "6C3A231C-57B2-4BA0-AFD6-306098234B11"; } } 
    private static byte[] salt = Encoding.ASCII.GetBytes("somerandomstuff"); 

    public static string Encrypt(string plainText) 
    { 
     Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt); 
     MemoryStream ms = new MemoryStream(); 
     StreamWriter sw = new StreamWriter(new CryptoStream(ms, new RijndaelManaged().CreateEncryptor(key.GetBytes(32), key.GetBytes(16)), CryptoStreamMode.Write)); 
     sw.Write(plainText); 
     sw.Close(); 
     ms.Close(); 
     string beforeUrlEncoded = Convert.ToBase64String(ms.ToArray()); 
     string afterUrlEndcoded = HttpUtility.UrlEncode(beforeUrlEncoded); 
     return afterUrlEndcoded; 
    } 

    public static string Decrypt(string encrypted) 
    { 
     //string urlDecoded = HttpUtility.UrlDecode(encrypted); // <--- Turns out you don't need this 
     Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt); 
     ICryptoTransform d = new RijndaelManaged().CreateDecryptor(key.GetBytes(32), key.GetBytes(16)); 
     byte[] bytes = Convert.FromBase64String(encrypted); 
     return new StreamReader(new CryptoStream(new MemoryStream(bytes), d, CryptoStreamMode.Read)).ReadToEnd(); 
    } 
} 

EDIT:

は、ここでのルートです:

routes.MapRoute(
    name: "BrokerLead", 
    url: "BrokerDashboard/BuyingLeads/LeadView/{id}" 
); 
+1

あなたは 'HttpUtility.UrlEncode'の代わりに' HttpServerUtility.UrlTokenEncode'を使ってみましたか? –

+1

ちょうどあなたがすでにbade64に関するWikipediaの記事を読んでいることを確認して、そのURLの安全なバージョンを使用する可能性を捨てました。私はポストでそれを明確にすることをお勧めします。 –

+0

@AlexeiLevenkov - .NETはURL Safe Base64エンコーディングを使用できますか? –

答えて

6

/文字が予約されており、中に使用することはできませんパス部分。これは、あなたがそれを動作させるために、次のルーティングを使用することができ、あなたのURLの最後のセグメント({*id}セグメントに気づい)の場合:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{*id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

別のアプローチは、暗号化/復号化する際、いくつかの他にこの文字を置き換えではなく、一般的に構成されていURLのパス部分に特殊文字を使わないようにして、すべてを適切にURLで暗号化できるクエリ文字列として指定するだけです。

+1

しかし、OPはすでにOPERATORをスラッシュに置き換えています。 – Evk

+0

私のOPには経路を含む編集を見てください。ですから、{id}を{* id}に置き換えると問題は解決しますか? –

+0

です。 BRB –

1

おそらく、問題を解決する最善の方法ではありませんが、うまくいくはずです。この行の後

:今、あなたは冗長/せずに文字列を取得します

string replacement = "ItIsSlashReplacement"; 
beforeUrlEncoded = beforeUrlEncoded.Replace("/", replacement); 

string beforeUrlEncoded = Convert.ToBase64String(ms.ToArray()); 

あなたは、いくつかの他のシンボル(いくつかのシンボル)でスラッシュ(/)を置き換えることができます。つまり、文字列"abc/dce"をエンコードしています。交換後は"abcItIsSlashReplacementdce" - /を除きます。

あなたは文字列をデコードする必要がある場合、あなたはあなたの交換を逆にする必要があります

string replacement = "ItIsSlashReplacement"; 
string originalEncodedString = stringWithReplacement.Replace(replacement, "/"); 

あなたは"abcItIsSlashReplacementdce"を取得し、オリジナルの復元 - "abc/dce"し、それをデコードします。

注:一部の文字列を置き換えて選択し、base64にエンコードすることができます。しかし、文字列は途中で選択する必要があります。デコード後には/を含めるべきではありません。

+0

ええ、私は同じ行に沿って考えていましたが、私はすべての状況で動作することを知っている/を置き換えるために使用することを思っていた。意味...私は自然にBase64でエンコードされた文字列の中で終わることのない "置換"の文字列が必要です。 –

+0

@CaseyCrookstonの場合、 'replacement'を選択して' base64 'にエンコードすることもできますが、エンコードされた置換には '/'を付けずに '/'を置き換える必要があります。この場合、あるbase64を別のbase64に挿入します。 –

関連する問題