add Cipher service in Module ...
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
namespace xCommons.Interfaces
|
||||||
|
{
|
||||||
|
public interface IXCipher
|
||||||
|
{
|
||||||
|
string Encrypt(string plainText);
|
||||||
|
string Decrypt(string cipherText);
|
||||||
|
string EncryptFromBytes(byte[] textBytes);
|
||||||
|
string DecryptFromBytes(byte[] cipherBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using xCommons.Extensions;
|
||||||
|
using xCommons.Interfaces;
|
||||||
|
|
||||||
|
namespace xCommons.Providers
|
||||||
|
{
|
||||||
|
public class XCipher : IXCipher
|
||||||
|
{
|
||||||
|
//
|
||||||
|
#region Props ...
|
||||||
|
private readonly string secretKey;
|
||||||
|
private readonly byte[] iv;
|
||||||
|
private readonly byte[] key;
|
||||||
|
private readonly XValidationProvider validationProvider;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
#region Constructor ...
|
||||||
|
public XCipher(
|
||||||
|
string cipherKey,
|
||||||
|
XValidationProvider validationProvider
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
this.secretKey = cipherKey.ToMd5String();
|
||||||
|
this.validationProvider = validationProvider;
|
||||||
|
|
||||||
|
//
|
||||||
|
var ivBytes = new byte[16];
|
||||||
|
var keyBytes = new byte[32];
|
||||||
|
var secretBytes = Encoding.UTF8.GetBytes(this.secretKey);
|
||||||
|
|
||||||
|
//
|
||||||
|
Array.Copy(
|
||||||
|
secretBytes,
|
||||||
|
ivBytes,
|
||||||
|
secretBytes.Length < ivBytes.Length ?
|
||||||
|
secretBytes.Length :
|
||||||
|
ivBytes.Length
|
||||||
|
);
|
||||||
|
this.iv = ivBytes;
|
||||||
|
|
||||||
|
//
|
||||||
|
Array.Copy(
|
||||||
|
secretBytes,
|
||||||
|
keyBytes,
|
||||||
|
secretBytes.Length < keyBytes.Length ?
|
||||||
|
secretBytes.Length :
|
||||||
|
keyBytes.Length
|
||||||
|
);
|
||||||
|
this.key = keyBytes;
|
||||||
|
|
||||||
|
// Encoding.UTF8.GetBytes (this.secretKey);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
#region Actions ...
|
||||||
|
public string Encrypt(string plainText)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
validationProvider.NotEmpty(plainText);
|
||||||
|
|
||||||
|
//
|
||||||
|
var textBytes = Encoding.UTF8.GetBytes(plainText);
|
||||||
|
var result = EncryptFromBytes(textBytes);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Decrypt(string cipherText)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
validationProvider.NotEmpty(cipherText);
|
||||||
|
|
||||||
|
//
|
||||||
|
var cipherBytes = Convert.FromBase64String(cipherText);
|
||||||
|
var result = DecryptFromBytes(cipherBytes);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string EncryptFromBytes(byte[] textBytes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
validationProvider.NotNull(textBytes);
|
||||||
|
|
||||||
|
// Declare the string used to hold
|
||||||
|
// the decrypted text.
|
||||||
|
byte[] encryptedBytes = null;
|
||||||
|
|
||||||
|
// Create an RijndaelManaged object
|
||||||
|
// with the specified key and IV.
|
||||||
|
using (var rijAlg = new RijndaelManaged())
|
||||||
|
{
|
||||||
|
//Settings
|
||||||
|
rijAlg.Mode = CipherMode.CBC;
|
||||||
|
rijAlg.Padding = PaddingMode.PKCS7;
|
||||||
|
// rijAlg.FeedbackSize = 128;
|
||||||
|
|
||||||
|
rijAlg.Key = key;
|
||||||
|
rijAlg.IV = iv;
|
||||||
|
|
||||||
|
//
|
||||||
|
using (var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV))
|
||||||
|
{
|
||||||
|
encryptedBytes = encryptor.TransformFinalBlock(textBytes, 0, textBytes.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return Convert.ToBase64String(encryptedBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DecryptFromBytes(byte[] cipherBytes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Args ...
|
||||||
|
validationProvider.NotNull(cipherBytes);
|
||||||
|
|
||||||
|
// Declare the string used to hold
|
||||||
|
// the decrypted text.
|
||||||
|
string plaintext = null;
|
||||||
|
|
||||||
|
// Create an RijndaelManaged object
|
||||||
|
// with the specified key and IV.
|
||||||
|
using (var rijAlg = new RijndaelManaged())
|
||||||
|
{
|
||||||
|
//Settings
|
||||||
|
rijAlg.Mode = CipherMode.CBC;
|
||||||
|
rijAlg.Padding = PaddingMode.PKCS7;
|
||||||
|
// rijAlg.FeedbackSize = 128;
|
||||||
|
|
||||||
|
rijAlg.Key = key;
|
||||||
|
rijAlg.IV = iv;
|
||||||
|
|
||||||
|
// Create a decrytor to perform the stream transform.
|
||||||
|
var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
|
||||||
|
|
||||||
|
// Create the streams used for decryption.
|
||||||
|
using (var msDecrypt = new MemoryStream(cipherBytes))
|
||||||
|
{
|
||||||
|
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
|
||||||
|
{
|
||||||
|
using (var srDecrypt = new StreamReader(csDecrypt))
|
||||||
|
{
|
||||||
|
// Read the decrypted bytes from the decrypting stream
|
||||||
|
// and place them in a string.
|
||||||
|
plaintext = srDecrypt.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return plaintext;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user