簡體   English   中英

將整數轉換為加密的字符串,反之亦然

[英]convert integer into encrypted string and vice versa

我想將pid作為URL中的querystring參數傳遞,但我不想像?pid = 102或?pid = 493這樣的int傳遞,而是要以諸如?pid = D109150A13F0EA4或其他加密字符串之類的加密形式傳遞這些pid。 我嘗試了內置的Encrypt方法,但它們給出了較長的字符串,如?pid = F3D165BAF8D84FB17CF8E5B4A04AC9022BFF5F987A6EDC42D109150A13F0EA4D847527287C8013154E2E8A2D8DAB6B686751C079092713C0D3E2E2E64B

我想要像?pid = D109150A13F0EA4或類似的小字母數字字符串

您是否嘗試過使用Guid

var g = Guid.NewGuid(productId.ToString());

它將產生38個字符的結果:8個十六進制數字,然后是三組,每組四個4個十六進制數字,然后是一組12個十六進制數字。

指南的示例: 6B29FC40-CA47-1067-B31D-00DD010662DA

因此,與您的示例相比,它實際上很短。 Guid的唯一缺點是您無法將其解密回int(但是您可以比較兩個Guid是否表示相同的int值)。

如果既需要加密又需要解密,除了內置加密(我假設您在上面的示例中使用了Encrypt方法)之外, System.Security.Cryptography命名空間還提供了許多其他加密算法,例如:

  • DES ,例如:2120357ccd3e0142
  • Aes ,例如:73054ef012f6ea6d47757a37a84381f7
  • HMACSHA256 ,例如:6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767

對於那些事情,我使用一個小的EncryptDecrypt類,也許對您的方法有所幫助。

EncryptDecrypt.ToEncrypt(yourstring)EncryptDecrypt.ToDecrypt(yourEncryptedString)這樣的用法。 因此,您應該能夠在添加到查詢字符串之前進行加密。 整數和數字等,然后必須先轉換為字符串。

希望這可以幫助。

using System;
using System.Security.Cryptography;
using System.IO;

namespace YourNameSpace

{
    public class EncryptDecrypt
    {
        #region Declaration

        static readonly byte[] TripleDesKey1 = new byte[] { 15, 11, 7, 21, 34, 32, 33, 5, 23, 13, 23, 41, 43, 41, 7, 19, 91, 91, 47, 7, 37, 13, 19, 41 };
        static readonly byte[] TripleDesiv1 = new byte[] { 5, 23, 13, 23, 41, 43, 41, 7 };

        #endregion


        /// <summary>
        /// To Encrypt String
        /// </summary>
        /// <param name="value">String To Encrypt</param>
        /// <returns>Returns Encrypted String</returns>
        public static string ToEncrypt(string value)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider
                                                     {
                                                         Key = TripleDesKey1,
                                                         IV = TripleDesiv1
                                                     };

            MemoryStream ms;

            if (value.Length >= 1)
                ms = new MemoryStream(((value.Length * 2) - 1));
            else
                ms = new MemoryStream();

            ms.Position = 0;
            CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            byte[] plainBytes = System.Text.Encoding.UTF8.GetBytes(value);
            encStream.Write(plainBytes, 0, plainBytes.Length);
            encStream.FlushFinalBlock();
            encStream.Close();

            return Convert.ToBase64String(plainBytes);
        }

        /// <summary>
        /// To Decrypt Data Encrypted From TripleDEC Algoritham
        /// </summary>
        /// <param name="value">String Value To Decrypt</param>
        /// <returns>Return Decrypted Data</returns>
        public static string ToDecrypt(string value)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            //System.IO.MemoryStream ms = new System.IO.MemoryStream(((value.Length * 2) - 1));
            MemoryStream ms;
            if (value.Length >= 1)
                ms = new MemoryStream(((value.Length * 2) - 1));
            else
                ms = new MemoryStream();

            ms.Position = 0;
            CryptoStream encStream = new CryptoStream(ms, des.CreateDecryptor(TripleDesKey1, TripleDesiv1), CryptoStreamMode.Write);
            byte[] plainBytes = Convert.FromBase64String(value);
            encStream.Write(plainBytes, 0, plainBytes.Length);
            return System.Text.Encoding.UTF8.GetString(plainBytes);
        }

    }
}

此方法用於生成隨機字符串

private string GetRandomString(int iStringLength)
    {
        string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-";
        char[] chars = new char[iStringLength];           
            Random rd = new Random();    
            for (int i = 0; i < iStringLength; i++)
            {
                chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
            }       
            return new string(chars);           
    }

或使用

var gid = Guid.NewGuid(productId.ToString());

下面的方法加密一個字符串。 只需傳遞一個普通/隨機字符串來加密該字符串即可。

 protected string EncryptString(String strString)
    {            
            UnicodeEncoding uEncode = new UnicodeEncoding();
            Byte[] bytstrString = uEncode.GetBytes(strString);
            SHA256Managed sha1 = new SHA256Managed();
            Byte[] hash = sha1.ComputeHash(bytstrString);

            return Convert.ToBase64String(hash);

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM