[英]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.