-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEncryptedString.cs
130 lines (106 loc) · 3.36 KB
/
EncryptedString.cs
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.IO;
using System.Security.Cryptography;
using System.Xml.Serialization;
namespace BasicTwitchSoundPlayer
{
[Serializable]
public class EncryptedString
{
private static string GetEncryptionLocationIV() => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "BasicTwitchSoundPlayer", "EncryptionIV.bin");
private static string GetEncryptionLocationKey() => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "BasicTwitchSoundPlayer", "EncryptionKey.bin");
private static Aes m_AES;
private static ICryptoTransform m_Encryptor;
private static ICryptoTransform m_Decryptor;
[XmlAttribute] public string EncryptedStr;
[NonSerialized] private string DecodedString = null;
public static implicit operator EncryptedString(string stringToEncode)
{
PrepareEncryption();
return new EncryptedString()
{
EncryptedStr = Encrypt(stringToEncode),
DecodedString = stringToEncode,
};
}
public static implicit operator string(EncryptedString str)
{
PrepareEncryption();
if(str.DecodedString == null)
{
str.DecodedString = Decrypt(str.EncryptedStr);
}
return str.DecodedString;
}
private static string Encrypt(string plainText)
{
if (plainText == null || plainText.Length <= 0)
return "";
byte[] encrypted;
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, m_Encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
}
encrypted = msEncrypt.ToArray();
}
return Convert.ToBase64String(encrypted);
}
static string Decrypt(string cipherText)
{
if (cipherText == null || cipherText.Length <= 0)
return "";
var cipherBytes = Convert.FromBase64String(cipherText);
string plaintext = null;
using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, m_Decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
plaintext = srDecrypt.ReadToEnd();
}
}
}
return plaintext;
}
private static void PrepareEncryption()
{
if (m_AES == null)
{
if (!File.Exists(GetEncryptionLocationIV()) || !File.Exists(GetEncryptionLocationKey()))
{
m_AES = Aes.Create();
m_AES.GenerateIV();
m_AES.GenerateKey();
Directory.CreateDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "BasicTwitchSoundPlayer"));
File.WriteAllBytes(GetEncryptionLocationIV(), m_AES.IV);
File.WriteAllBytes(GetEncryptionLocationKey(), m_AES.Key);
m_Encryptor = m_AES.CreateEncryptor(m_AES.Key, m_AES.IV);
m_Decryptor = m_AES.CreateDecryptor(m_AES.Key, m_AES.IV);
}
else
{
m_AES = Aes.Create();
m_AES.IV = File.ReadAllBytes(GetEncryptionLocationIV());
m_AES.Key = File.ReadAllBytes(GetEncryptionLocationKey());
m_Encryptor = m_AES.CreateEncryptor(m_AES.Key,m_AES.IV);
m_Decryptor = m_AES.CreateDecryptor(m_AES.Key, m_AES.IV);
}
}
}
public override string ToString()
{
if (DecodedString == null)
{
PrepareEncryption();
DecodedString = Decrypt(EncryptedStr);
}
return DecodedString;
}
}
}