簡體   English   中英

Encrypt \ Decrypt an Integer,其中加密值為 Integer

[英]Encrypt \ Decrypt an Integer where the encrypted value is an Integer

我有一個數字 1、2、3、4、5 等的順序列表。這些數字存儲為一個整數,將通過 Api 即 3 返回。我想要某種方法來加密數字,而不是返回 3將是 5832(或其他一些整數),然后我可以解密以恢復為 3。
我看過各種提到 AES、Feistel 密碼等的加密帖子,但它們似乎都返回字母數字字符串而不是整數。
有沒有辦法實現這一點,以便我可以加密整數並將加密值也作為整數?

例如,可以使用以下過程。 這些數字以二進制形式寫入流中,並根據設置的密碼使用 AES 方法加密。 生成的字節作為數字讀入加密形式。 然后可以通過將數字重寫到流中並通過解密器讀取它們來讀回。 唯一的缺點是加密的數字包含兩個額外的數字,因為 AES 存儲密鑰(不是密碼,它沒有存儲在任何地方)。

var data = new int[10];
for (int i = 0; i < data.Length; i++)
    data[i] = Random.Shared.Next(100);
Console.WriteLine("input data: {0}", String.Join(", ", data));

var encData = Encrypt(data, "1");
Console.WriteLine("encrypted data: {0}", String.Join(", ", encData));

var decData = Decrypt(encData, "1");
Console.WriteLine("decrypted data: {0}", String.Join(", ", decData));


int[] Encrypt(int[] inputData, string password)
{
    using (Aes aes = Aes.Create())   // System.Security.Cryptography
    {
        aes.Key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
        aes.IV = new byte[16];
        var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
        var result = new List<int>();
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write, true))
            using (var bw = new BinaryWriter(cs))
                foreach (var i in inputData)
                    bw.Write(i);
            ms.Seek(0, SeekOrigin.Begin);
            using (var br = new BinaryReader(ms))
                while (ms.Position < ms.Length)
                    result.Add(br.ReadInt32());
        }
        return result.ToArray();
    }
}

int[] Decrypt(int[] encryptedData, string password)
{
    using (Aes aes = Aes.Create())  
    {
        aes.Key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
        aes.IV = new byte[16];
        var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
        var result = new List<int>();
        using (var ms = new MemoryStream())
        {
            using (var bw = new BinaryWriter(ms, Encoding.UTF8, true))
                foreach (var i in encryptedData)
                    bw.Write(i);
            ms.Seek(0, SeekOrigin.Begin);
            using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            using (var br = new BinaryReader(cs))
                    try
                    {
                        while (true)
                            result.Add(br.ReadInt32());
                    } catch (EndOfStreamException) { }
        }
        return result.ToArray();
    }
}

暫無
暫無

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

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