平安校园
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

165 wiersze
4.5 KiB

  1. using System.ComponentModel;
  2. using System.Text;
  3. using Org.BouncyCastle.Utilities.Encoders;
  4. namespace SafeAuthActivate.Sm;
  5. //加密和解密结构相同,只不过,解密密钥是加密密钥的逆序
  6. /// <summary>
  7. /// Sm4算法
  8. /// 对标国际DES算法
  9. /// </summary>
  10. public class SM4Util
  11. {
  12. public SM4Util()
  13. {
  14. Key = "1814546261730461";//密钥长度必须为16字节。
  15. Iv = "0000000000000000";
  16. HexString = false;
  17. CryptoMode = Sm4CryptoEnum.ECB;
  18. }
  19. /// <summary>
  20. /// 数据
  21. /// </summary>
  22. public string Data { get; set; }
  23. /// <summary>
  24. /// 秘钥
  25. /// </summary>
  26. public string Key { get; }//不同的key,加密出来的数据不一样,所以此处设定好key以后,禁止修改
  27. /// <summary>
  28. /// 向量
  29. /// </summary>
  30. public string Iv { get; set; }
  31. /// <summary>
  32. /// 明文是否是十六进制
  33. /// </summary>
  34. public bool HexString { get; }//set;
  35. /// <summary>
  36. /// 加密模式(默认ECB)
  37. /// 统一改为ECB模式
  38. /// </summary>
  39. public Sm4CryptoEnum CryptoMode { get; }
  40. #region 加密
  41. public static string Encrypt(SM4Util entity)
  42. {
  43. return entity.CryptoMode == Sm4CryptoEnum.CBC ? EncryptCBC(entity) : EncryptECB(entity);
  44. }
  45. /// <summary>
  46. /// ECB加密
  47. /// </summary>
  48. /// <param name="entity"></param>
  49. /// <returns></returns>
  50. public static string EncryptECB(SM4Util entity)
  51. {
  52. var ctx = new Sm4Context
  53. {
  54. IsPadding = true
  55. };
  56. var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
  57. var sm4 = new SM4CryptoUtil();
  58. sm4.SetKeyEnc(ctx, keyBytes);
  59. var encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data));
  60. return Encoding.Default.GetString(Hex.Encode(encrypted));
  61. }
  62. /// <summary>
  63. /// CBC加密
  64. /// </summary>
  65. /// <param name="entity"></param>
  66. /// <returns></returns>
  67. public static string EncryptCBC(SM4Util entity)
  68. {
  69. var ctx = new Sm4Context
  70. {
  71. IsPadding = true
  72. };
  73. var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
  74. var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv);
  75. var sm4 = new SM4CryptoUtil();
  76. sm4.SetKeyEnc(ctx, keyBytes);
  77. var encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data));
  78. return Convert.ToBase64String(encrypted);
  79. }
  80. #endregion 加密
  81. #region 解密
  82. /// <summary>
  83. /// 解密
  84. /// </summary>
  85. /// <param name="entity"></param>
  86. /// <returns></returns>
  87. public static string Decrypt(SM4Util entity)
  88. {
  89. return entity.CryptoMode == Sm4CryptoEnum.CBC ? DecryptCBC(entity) : DecryptECB(entity);
  90. }
  91. /// <summary>
  92. /// ECB解密
  93. /// </summary>
  94. /// <param name="entity"></param>
  95. /// <returns></returns>
  96. public static string DecryptECB(SM4Util entity)
  97. {
  98. var ctx = new Sm4Context
  99. {
  100. IsPadding = true,
  101. Mode = 0
  102. };
  103. var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
  104. var sm4 = new SM4CryptoUtil();
  105. sm4.Sm4SetKeyDec(ctx, keyBytes);
  106. var decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data));
  107. return Encoding.Default.GetString(decrypted);
  108. }
  109. /// <summary>
  110. /// CBC解密
  111. /// </summary>
  112. /// <param name="entity"></param>
  113. /// <returns></returns>
  114. public static string DecryptCBC(SM4Util entity)
  115. {
  116. var ctx = new Sm4Context
  117. {
  118. IsPadding = true,
  119. Mode = 0
  120. };
  121. var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
  122. var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv);
  123. var sm4 = new SM4CryptoUtil();
  124. sm4.Sm4SetKeyDec(ctx, keyBytes);
  125. var decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data));
  126. return Encoding.Default.GetString(decrypted);
  127. }
  128. #endregion 解密
  129. /// <summary>
  130. /// 加密类型
  131. /// </summary>
  132. public enum Sm4CryptoEnum
  133. {
  134. /// <summary>
  135. /// ECB(电码本模式)
  136. /// </summary>
  137. [Description("ECB模式")]
  138. ECB = 0,
  139. /// <summary>
  140. /// CBC(密码分组链接模式)
  141. /// </summary>
  142. [Description("CBC模式")]
  143. CBC = 1
  144. }
  145. }