关于c#:没有依赖关系的简单字符串加密


Simple String Encryption without Dependencies

我需要一个简单的算法来加密/解密一个字符串。有点像base64,但有点安全。这不是关键任务。我所需要的只是一些绳子的操作。这不像复制字符串并使用简单的base 64解码器使其可读那么简单。

为什么不使用AES?

因为我的应用程序是使用.NET核心创建的,所以它在Windows和Mac上运行。我面临的问题是,为了在Mac上使用System.Security,我需要安装openssl。因为我没有sudo访问权限,所以无法安装它。

因此,要求如下:

  • 简单字符串加密
  • 不依赖System.Security.*

我读过简单不安全的双向"模糊"为C,但没有解决方案没有依赖性。


如果要查找混淆而不是安全性,可以使用常量异或字符串,或者使用常量种子初始化的prng的输出。

常量示例:

1
2
3
4
5
6
7
8
9
byte xorConstant = 0x53;

string input ="foo";
byte[] data = Encoding.UTF8.GetBytes(input);
for (int i = 0; i < data.Length; i++)
{
    data[i] = (byte)(data[i] ^ xorConstant)
}
string output = Convert.ToBase64String(data);

译码:

1
2
3
4
5
6
7
byte xorConstant = 0x53;
byte[] data = Convert.FromBase64String(input);
for (int i = 0; i < data.Length; i++)
{
    data[i] = (byte)(data[i] ^ xorConstant)
}
string plainText = Encoding.UTF8.GetString(data);


使用xtea,它实际上是相当安全的。

以下是维基百科的全部源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdint.h>

/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}


所有非对称和对称加密方法都驻留在System.Security名称空间中。从这个答案来看:

The symmetric encryption options available in .NET Core are:

  • AES (System.Security.Cryptography.Aes.Create())
  • 3DES (System.Security.Cryptography.TripleDES.Create())

And for asymmetric encryption

  • RSA (System.Security.Cryptography.RSA.Create())

所以看来你至少需要System.Security

编辑:这是一个很好的问题,有很多与加密相关的函数。注意System.Security名称空间类和方法的广泛使用。


移位的东西:

1
2
3
4
5
 var topSecret ="This is%&/(/ TopSecret 111!!";
 int shft = 5;
 string encrypted = topSecret.Select(ch => ((int) ch) << shft).Aggregate("", (current, val) => current + (char) (val*2));
 encrypted = Convert.ToBase64String(Encoding.UTF8.GetBytes(encrypted));
 string decrypted = Encoding.UTF8.GetString(Convert.FromBase64String(encrypted)).Select(ch => ((int) ch) >> shft).Aggregate("", (current, val) => current + (char) (val/2));

加密:

4ZSA4aiA4amA4bOA4KCA4amA4bOA4KWA4KaA4K+A4KiA4K+A4KCA4ZSA4a+A4bCA4ZOA4aWA4aOA4bKA4aWA4bSA4KCA4LGA4LGA4LGA4KGA4KGA

再次解密:

This is%&/(/ TopSecret 111!!

注释

不是很漂亮,也不是很小。你可以调整盐和编码以满足你的需要。

干杯