5

電子メール アドレスや数値などの文字列値を暗号化および復号化する必要がありますが、暗号化された文字列に「/」を含めないでください。これは、URL でそれを使用し、セパレーターに「/」を使用して値を取得するためです。

現在、次の方法を使用しています。

    string passPhrase = "Pas5pr@se";        // can be any string
    string saltValue = "s@1tValue";        // can be any string
    string hashAlgorithm = "SHA1";             // can be "MD5"
    int passwordIterations = 2;                  // can be any number
    string initVector = "@1B2c3D4e5F6g7H8"; // must be 16 bytes
    int keySize = 256;                // can be 192 or 128

    public string Encrypt(string plainText)
    {            
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);         
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);
        byte[] keyBytes = password.GetBytes(keySize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;            
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,initVectorBytes);
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);           
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);            
        cryptoStream.FlushFinalBlock();
        byte[] cipherTextBytes = memoryStream.ToArray();
        memoryStream.Close();
        cryptoStream.Close();
        string cipherText = Convert.ToBase64String(cipherTextBytes);
        return cipherText;
    }
4

3 に答える 3

11

URL のみを渡すためにこれを行っている場合は、暗号化された文字列を生成することをお勧めします (存在するかどうかに関係/なく)。

var sanitized = HttpUtility.UrlEncode(encryptedString);

/となります%2f。次に、次のように簡単に実行できます。

var encryptedString = HttpUtility.UrlDecode(sanitized)

そして、同じ文字列を再び取得します。

編集: アセンブリHttpUtilityにあります。System.Web

于 2013-02-27T10:11:47.947 に答える
4

暗号化自体は、文字ではなくバイトを出力するだけです。したがって、この質問は暗号化/復号化とはまったく関係ありません。実際の問題は、任意のバイトを URL で使用できる文字列に変換することです。これには、通常の Base64 よりも URL セーフな Base64 を使用することをお勧めします。

これらの/文字は、暗号文に適用する Base64 エンコーディングによって生成されます。Base64 は ASCII 文字と数字 (合計 62 個) を使用/+、最後=にパディングとして使用します。

パディングはかなり役に立たないので、削除します。

次に、/_に置き換えます。これはURL セーフ Base64またはbase64urlと呼ばれます。RFC4648で説明されています。+-

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

public static byte[] Base64UrlDecode(string s)
{
    s = s.Replace('-', '+').Replace('_', '/');
    string padding = new String('=', 3 - (s.Length + 3) % 4);
    s += padding;
    return Convert.FromBase64String(s);
}
于 2013-02-27T10:20:04.337 に答える
2

Convert.ToBase64String+文字、数字を使用するため、文字、数字、または ではないものに/切り替えるだけです。/+

エンコーディング:

// ...
string cipherText = Convert.ToBase64String(cipherTextBytes);
string ctWithoutSlashes = cipherText.Replace("/", "-");

デコード

string cipherText = ctWithoutSlashes.Replace("-", "/");
// ...
于 2013-02-27T10:12:23.397 に答える