Simple String Encryption without Dependencies
我需要一个简单的算法来加密/解密一个字符串。有点像base64,但有点安全。这不是关键任务。我所需要的只是一些绳子的操作。这不像复制字符串并使用简单的base 64解码器使其可读那么简单。
为什么不使用AES?因为我的应用程序是使用.NET核心创建的,所以它在Windows和Mac上运行。我面临的问题是,为了在Mac上使用
因此,要求如下:
- 简单字符串加密
- 不依赖
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; } |
所有非对称和对称加密方法都驻留在
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())
所以看来你至少需要
编辑:这是一个很好的问题,有很多与加密相关的函数。注意
移位的东西:
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!!
注释
不是很漂亮,也不是很小。你可以调整盐和编码以满足你的需要。
干杯