Skip to content

Commit 4283fa9

Browse files
committed
Add DES encrypt/decrypt with iv (CBC mode)
1 parent 31c75e6 commit 4283fa9

File tree

1 file changed

+117
-15
lines changed

1 file changed

+117
-15
lines changed

src/NETCore.Encrypt/EncryptProvider.cs

Lines changed: 117 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,6 @@ public static byte[] AESDecrypt(byte[] data, string key, string vector)
226226
public static string AESEncrypt(string data, string key)
227227
{
228228
Check.Argument.IsNotEmpty(data, nameof(data));
229-
230229
Check.Argument.IsNotEmpty(key, nameof(key));
231230
Check.Argument.IsNotOutOfRange(key.Length, 32, 32, nameof(key));
232231

@@ -241,9 +240,8 @@ public static string AESEncrypt(string data, string key)
241240
aes.Mode = CipherMode.ECB;
242241
aes.Padding = PaddingMode.PKCS7;
243242
aes.KeySize = 128;
244-
//aes.Key = _key;
245243
aes.Key = bKey;
246-
//aes.IV = _iV;
244+
247245
using (CryptoStream cryptoStream = new CryptoStream(Memory, aes.CreateEncryptor(), CryptoStreamMode.Write))
248246
{
249247
try
@@ -279,15 +277,13 @@ public static string AESDecrypt(string data, string key)
279277

280278
using (MemoryStream Memory = new MemoryStream(encryptedBytes))
281279
{
282-
//mStream.Write( encryptedBytes, 0, encryptedBytes.Length );
283-
//mStream.Seek( 0, SeekOrigin.Begin );
284280
using (Aes aes = Aes.Create())
285281
{
286282
aes.Mode = CipherMode.ECB;
287283
aes.Padding = PaddingMode.PKCS7;
288284
aes.KeySize = 128;
289285
aes.Key = bKey;
290-
//aes.IV = _iV;
286+
291287
using (CryptoStream cryptoStream = new CryptoStream(Memory, aes.CreateDecryptor(), CryptoStreamMode.Read))
292288
{
293289
try
@@ -296,7 +292,8 @@ public static string AESDecrypt(string data, string key)
296292
int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length);
297293
byte[] ret = new byte[len];
298294
Array.Copy(tmp, 0, ret, 0, len);
299-
return Encoding.UTF8.GetString(ret);
295+
296+
return Encoding.UTF8.GetString(ret, 0, len);
300297
}
301298
catch (Exception ex)
302299
{
@@ -306,6 +303,14 @@ public static string AESDecrypt(string data, string key)
306303
}
307304
}
308305
}
306+
307+
/// <summary>
308+
/// AES Rijndael
309+
/// </summary>
310+
public static void AESRijndael()
311+
{
312+
throw new NotImplementedException();
313+
}
309314
#endregion
310315

311316
#region DES
@@ -319,6 +324,15 @@ public static string CreateDesKey()
319324
return GetRandomStr(24);
320325
}
321326

327+
/// <summary>
328+
/// Create des iv
329+
/// </summary>
330+
/// <returns></returns>
331+
public static string CreateDesIv()
332+
{
333+
return GetRandomStr(8);
334+
}
335+
322336
/// <summary>
323337
/// DES encrypt
324338
/// </summary>
@@ -332,7 +346,7 @@ public static string DESEncrypt(string data, string key)
332346
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
333347

334348
byte[] plainBytes = Encoding.UTF8.GetBytes(data);
335-
var encryptBytes = DESEncrypt(plainBytes, key);
349+
var encryptBytes = DESEncrypt(plainBytes, key, CipherMode.ECB);
336350

337351
if (encryptBytes == null)
338352
{
@@ -344,7 +358,7 @@ public static string DESEncrypt(string data, string key)
344358
/// <summary>
345359
/// DES encrypt
346360
/// </summary>
347-
/// <param name="data">Raw data</param>
361+
/// <param name="data">Raw data byte array</param>
348362
/// <param name="key">Key, requires 24 bits</param>
349363
/// <returns>Encrypted byte array</returns>
350364
public static byte[] DESEncrypt(byte[] data, string key)
@@ -353,6 +367,43 @@ public static byte[] DESEncrypt(byte[] data, string key)
353367
Check.Argument.IsNotEmpty(key, nameof(key));
354368
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
355369

370+
return DESEncrypt(data, key, CipherMode.ECB);
371+
}
372+
373+
374+
/// <summary>
375+
/// DES encrypt
376+
/// </summary>
377+
/// <param name="data">Raw data byte array</param>
378+
/// <param name="key">Key, requires 24 bits</param>
379+
/// <param name="vector">IV,requires 16 bits</param>
380+
/// <returns>Encrypted byte array</returns>
381+
public static byte[] DESEncrypt(byte[] data, string key, string vector)
382+
{
383+
Check.Argument.IsNotEmpty(data, nameof(data));
384+
Check.Argument.IsNotEmpty(key, nameof(key));
385+
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
386+
Check.Argument.IsNotEmpty(vector, nameof(vector));
387+
Check.Argument.IsNotOutOfRange(vector.Length, 8, 8, nameof(vector));
388+
389+
return DESEncrypt(data, key, CipherMode.CBC, vector);
390+
}
391+
392+
/// <summary>
393+
/// DES encrypt
394+
/// </summary>
395+
/// <param name="data">Raw data</param>
396+
/// <param name="key">Key, requires 24 bits</param>
397+
/// <param name="cipherMode"><see cref="CipherMode"/></param>
398+
/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
399+
/// <param name="vector">IV,requires 16 bits</param>
400+
/// <returns>Encrypted byte array</returns>
401+
private static byte[] DESEncrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
402+
{
403+
Check.Argument.IsNotEmpty(data, nameof(data));
404+
Check.Argument.IsNotEmpty(key, nameof(key));
405+
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
406+
356407
using (MemoryStream Memory = new MemoryStream())
357408
{
358409
using (TripleDES des = TripleDES.Create())
@@ -361,9 +412,17 @@ public static byte[] DESEncrypt(byte[] data, string key)
361412
byte[] bKey = new byte[24];
362413
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
363414

364-
des.Mode = CipherMode.ECB;
365-
des.Padding = PaddingMode.PKCS7;
415+
des.Mode = cipherMode;
416+
des.Padding = paddingMode;
366417
des.Key = bKey;
418+
419+
if (cipherMode == CipherMode.CBC)
420+
{
421+
byte[] bVector = new byte[8];
422+
Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
423+
des.IV = bVector;
424+
}
425+
367426
using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateEncryptor(), CryptoStreamMode.Write))
368427
{
369428
try
@@ -394,7 +453,7 @@ public static string DESDecrypt(string data, string key)
394453
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
395454

396455
byte[] encryptedBytes = Convert.FromBase64String(data);
397-
byte[] bytes = DESDecrypt(encryptedBytes, key);
456+
byte[] bytes = DESDecrypt(encryptedBytes, key, CipherMode.ECB);
398457

399458
if (bytes == null)
400459
{
@@ -403,13 +462,48 @@ public static string DESDecrypt(string data, string key)
403462
return Encoding.UTF8.GetString(bytes);
404463
}
405464

465+
/// <summary>
466+
/// DES decrypt
467+
/// </summary>
468+
/// <param name="data">Encrypted data byte array</param>
469+
/// <param name="key">Key, requires 24 bits</param>
470+
/// <returns>Decrypted string</returns>
471+
public static byte[] DESDecrypt(byte[] data, string key)
472+
{
473+
Check.Argument.IsNotEmpty(data, nameof(data));
474+
Check.Argument.IsNotEmpty(key, nameof(key));
475+
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
476+
477+
return DESDecrypt(data, key, CipherMode.ECB);
478+
}
479+
480+
/// <summary>
481+
/// DES encrypt
482+
/// </summary>
483+
/// <param name="data">Raw data byte array</param>
484+
/// <param name="key">Key, requires 24 bits</param>
485+
/// <param name="vector">IV,requires 16 bits</param>
486+
/// <returns>Encrypted byte array</returns>
487+
public static byte[] DESDecrypt(byte[] data, string key, string vector)
488+
{
489+
Check.Argument.IsNotEmpty(data, nameof(data));
490+
Check.Argument.IsNotEmpty(key, nameof(key));
491+
Check.Argument.IsNotOutOfRange(key.Length, 24, 24, nameof(key));
492+
Check.Argument.IsNotEmpty(vector, nameof(vector));
493+
Check.Argument.IsNotOutOfRange(vector.Length, 8, 8, nameof(vector));
494+
495+
return DESDecrypt(data, key, CipherMode.CBC, vector);
496+
}
497+
406498
/// <summary>
407499
/// DES decrypt
408500
/// </summary>
409501
/// <param name="data">Encrypted data</param>
410502
/// <param name="key">Key, requires 24 bits</param>
503+
/// <param name="cipherMode"><see cref="CipherMode"/></param>
504+
/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
411505
/// <returns>Decrypted byte array</returns>
412-
public static byte[] DESDecrypt(byte[] data, string key)
506+
private static byte[] DESDecrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
413507
{
414508
Check.Argument.IsNotEmpty(data, nameof(data));
415509
Check.Argument.IsNotEmpty(key, nameof(key));
@@ -423,9 +517,17 @@ public static byte[] DESDecrypt(byte[] data, string key)
423517
{
424518
using (TripleDES des = TripleDES.Create())
425519
{
426-
des.Mode = CipherMode.ECB;
427-
des.Padding = PaddingMode.PKCS7;
520+
des.Mode = cipherMode;
521+
des.Padding = paddingMode;
428522
des.Key = bKey;
523+
524+
if (cipherMode == CipherMode.CBC)
525+
{
526+
byte[] bVector = new byte[8];
527+
Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
528+
des.IV = bVector;
529+
}
530+
429531
using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateDecryptor(), CryptoStreamMode.Read))
430532
{
431533
try

0 commit comments

Comments
 (0)