-
Notifications
You must be signed in to change notification settings - Fork 185
/
two-way-encrypt-decrypt-PHP-C_sharp
117 lines (99 loc) · 5.29 KB
/
two-way-encrypt-decrypt-PHP-C_sharp
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
### Read More: https://puvox.software/blog/two-way-encryption-decryption-between-php-and-c-sharp/ ###
// ###############################################################################################################
// ################################################# PHP #############################################
// ###############################################################################################################
// Example: echo EncryptDecrypt::EncryptString ( "Hello message to C#", "mySecretKey123" );
// ###############################################################################################################
// ###############################################################################################################
#region Encrypt/Decrypt
public static class EncryptDecrypt
{
public static function encrypt($plaintext, $password, $method= 'aes-256-cbc'){
self::helper__encrypt_decrypt_stream($password);
return base64_encode(openssl_encrypt($plaintext, $method, self::password_shuffled, OPENSSL_RAW_DATA, self::iv));
}
public static function decrypt($encrypted, $password, $method= 'aes-256-cbc'){
self::helper__encrypt_decrypt_stream($password);
return openssl_decrypt(base64_decode($encrypted), $method, self::password_shuffled, OPENSSL_RAW_DATA, self::iv);
}
public static function helper__encrypt_decrypt_stream($password, $method= 'aes-256-cbc'){
// Must be exact 32 chars (256 bit)
self::password_shuffled = substr(hash('sha256', $password, true), 0, 32);
// IV must be exact 16 chars (128 bit)
self::iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
}
}
#endregion
// ###############################################################################################################
// ################################################## C# #############################################
// ###############################################################################################################
// Example: Console.WriteLine( EncryptDecrypt::DecryptString ( encryptedStringFromPhp, "mySecretKey123" ) );
// ###############################################################################################################
// ###############################################################################################################
#region Encrypt/Decrypt
public static class EncryptDecrypt
{
public static string EncryptString(string plainText, string secterKey)
{
CryptoStream cryptoStream; MemoryStream memoryStream;
this.helper__encrypt_decrypt_stream(out cryptoStream, out memoryStream, secterKey);
string encryptedText = String.Empty;
try
{
byte[] plainBytes = Encoding.ASCII.GetBytes(plainText); // Convert the plainText string into a byte array
cryptoStream.Write(plainBytes, 0, plainBytes.Length); // Encrypt the input plaintext string
cryptoStream.FlushFinalBlock(); // Complete the encryption process
byte[] cipherBytes = memoryStream.ToArray(); // Convert the encrypted data from a MemoryStream to a byte array
encryptedText = Convert.ToBase64String(cipherBytes, 0, cipherBytes.Length); // Convert the encrypted byte array to a base64 encoded string
}
catch (Exception e)
{
return e.Message;
}
finally
{
memoryStream.Close();
cryptoStream.Close();
}
return encryptedText;
}
public static string DecryptString(string encryptedText, string secterKey)
{
CryptoStream cryptoStream; MemoryStream memoryStream;
this.helper__encrypt_decrypt_stream(out cryptoStream, out memoryStream, secterKey);
string plainText = String.Empty;
try
{
byte[] cipherBytes = Convert.FromBase64String(encryptedText);// Convert the encryptedText string into a byte array
cryptoStream.Write(cipherBytes, 0, cipherBytes.Length); // Decrypt the input encryptedText string
cryptoStream.FlushFinalBlock(); // Complete the decryption process
byte[] plainBytes = memoryStream.ToArray(); // Convert the decrypted data from a MemoryStream to a byte array
plainText = Encoding.ASCII.GetString(plainBytes, 0, plainBytes.Length); // Convert the decrypted byte array to string
}
catch (Exception e)
{
return e.Message;
}
finally
{
memoryStream.Close();
cryptoStream.Close();
}
return plainText;
}
public static void helper__encrypt_decrypt_stream(out MemoryStream memoryStream, out CryptoStream cryptoStream, string secterKey)
{
SHA256 mySHA256 = SHA256Managed.Create();
byte[] key = mySHA256.ComputeHash(Encoding.ASCII.GetBytes(secterKey));
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
// string symmetric encryption
Aes encryptor = Aes.Create();
encryptor.Mode = CipherMode.CBC;
//encryptor.KeySize = 256; encryptor.BlockSize = 128; encryptor.Padding = PaddingMode.Zeros;
encryptor.Key = key;
encryptor.IV = iv;
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, encryptor.CreateEncryptor(), CryptoStreamMode.Write); // write to memory stream
}
}
#endregion