一个简单的c#加密,签名,验签,解密算法.(2)

本文介绍了如何在C#中使用MiniDes.cs库进行加密和解密操作,以及CodeSign.cs文件中阐述的签名与验签方法,详细讲解了加密解密和签名验证的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MiniDes.cs

public   class  MiniDes
    
{
        
public MiniDes()
        
{
            
//
            
// TODO: Add constructor logic here
            
//
        }

        
private static string sKey
        
{
            
get
            
{
                
return Key.MiniDesKey;
            }

        }

        
//矢量

        
private const string sIV = "qcDd6X+aPLa=";

        
///   <summary> 
        
///   3DES加密 
        
///   </summary> 
        
///   <param   name= "Value "> 待加密字符串 </param> 
        
///   <param   name= "sKey "> 密钥 </param> 
        
///   <param   name= "sIV "> 矢量 </param> 
        
///   <returns> 加密后字符串 </returns> 

        public static string Encrypt(string Value)
        
{
            
try
            
{
                
//构造对称算法 
                SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

                ICryptoTransform ct;
                MemoryStream ms;
                CryptoStream cs;
                
byte[] byt;
                mCSP.Key 
= Convert.FromBase64String(sKey);
                mCSP.IV 
= Convert.FromBase64String(sIV);
                
//指定加密的运算模式 
                mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
                
//获取或设置加密算法的填充模式 
                mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
                ct 
= mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
                byt 
= Encoding.UTF8.GetBytes(Value);
                ms 
= new MemoryStream();
                cs 
= new CryptoStream(ms, ct, CryptoStreamMode.Write);
                cs.Write(byt, 
0, byt.Length);
                cs.FlushFinalBlock();
                cs.Close();
                
return Convert.ToBase64String(ms.ToArray());
            }

            
catch
            
{
                
return "";
            }

        }


        
///   <summary> 
        
///   3DES解密 
        
///   </summary> 
        
///   <param   name= "Value "> 待解密字符串 </param> 
        
///   <param   name= "sKey "> 密钥 </param> 
        
///   <param   name= "sIV "> 矢量 </param> 
        
///   <returns> 解密后字符串 </returns> 

        public static string Decrypt(string Value)
        
{
            
try
            
{
                
//构造对称算法 
                SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

                ICryptoTransform ct;
                MemoryStream ms;
                CryptoStream cs;
                
byte[] byt;
                mCSP.Key 
= Convert.FromBase64String(sKey);
                mCSP.IV 
= Convert.FromBase64String(sIV);
                mCSP.Mode 
= System.Security.Cryptography.CipherMode.ECB;
                mCSP.Padding 
= System.Security.Cryptography.PaddingMode.PKCS7;
                ct 
= mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
                byt 
= Convert.FromBase64String(Value);
                ms 
= new MemoryStream();
                cs 
= new CryptoStream(ms, ct, CryptoStreamMode.Write);
                cs.Write(byt, 
0, byt.Length);
                cs.FlushFinalBlock();
                cs.Close();
                
return Encoding.UTF8.GetString(ms.ToArray());
            }

            
catch
            
{
                
return "";
            }

        }


    }

 key.cs

public   class  Key
    
{
        
public Key()
        
{
            
//
            
// TODO: Add constructor logic here
            
//
        }

        
        
//des密钥 32位
        public static string MiniDesKey
        
{
            
get
            
{
                
return "qJzGEh6hESZDVgeCnFPGuxzaiB7NLQM2";
            }

        }

    }

CodeSign.cs

public   class  CodeSign
    
{
        
public CodeSign()
        
{
        }

        
//返回原加密字符串
        public static string GetData(string signstr)
        
{
            
try
            
{
                
string _tempsignstr = signstr.Substring(signstr.IndexOf('A'+ 1);
                
int randomstrlen = int.Parse(signstr.Substring(signstr.IndexOf('A'+ 1, signstr.IndexOf('B'- signstr.IndexOf('A'- 1));
                
string wholestr = signstr.Substring(signstr.IndexOf('B'+ 1);
                
string _temp1str = signstr.Substring(signstr.IndexOf('B'+ 1, (wholestr.Length - randomstrlen) / 2);
                
string _temp2str = signstr.Substring(signstr.IndexOf('B'+ 1 + _temp1str.Length + randomstrlen);
                
string _tempstr = _temp1str + _temp2str;
                
string _temprandom = signstr.Substring(signstr.IndexOf('B'+ 1 + _temp1str.Length, randomstrlen);

                
byte[] byrandom = Convert.FromBase64String(_temprandom);
                
for (int i = 0; i < byrandom.Length; i++)
                
{
                    byrandom[i] 
= (byrandom[i] ^= (byte)10);
                }


                
byte[] bystr = Convert.FromBase64String(_tempstr);
                
for (int i = 0; i < bystr.Length; i++)
                
{
                    bystr[i] 
= (bystr[i] ^= byrandom[i]);
                }


                
string oldstr = Encoding.UTF8.GetString(bystr);

                
return oldstr;
            }

            
catch
            
{
                
return "";
            }


        }


        
//签名  ascii(A后的数))+A+(随即数^10.length+B+str^随即数+随即数^10(插入在str^随即数/2处))
        public static string AddSign(string str)
        
{
            
try
            
{
                
byte[] bystr = Encoding.UTF8.GetBytes(str);
                
string randomstr = GetRandomStr(bystr.Length);
                
byte[] byrandom = Encoding.UTF8.GetBytes(randomstr);
                
for (int i = 0; i < bystr.Length; i++)
                
{
                    bystr[i] 
= (bystr[i] ^= byrandom[i]);
                }

                
string signstr = Convert.ToBase64String(bystr);
                
for (int i = 0; i < byrandom.Length; i++)
                
{
                    byrandom[i] 
= (byrandom[i] ^= (byte)10);
                }

                
string _temprandom = Convert.ToBase64String(byrandom);
                
string _temp1str = signstr.Substring(0, signstr.Length / 2);
                
string _temp2str = signstr.Substring(signstr.Length / 2);
                signstr 
= _temprandom.Length + "B" + _temp1str + _temprandom + _temp2str;
                
string _tempASCII = ToASCII(signstr);
                
return _tempASCII + "A" + signstr;
            }

            
catch
            
{
                
return "";
            }


        }

        
//验签
        public static bool CheckSign(string signstr)
        
{
            
try
            
{
                
if (!string.IsNullOrEmpty(signstr))
                
{
                    
string _tempASCII = signstr.Substring(0, signstr.IndexOf('A'));
                    
string _tempsignstr = signstr.Substring(signstr.IndexOf('A'+ 1);
                    
if (int.Parse(_tempASCII) == int.Parse(ToASCII(_tempsignstr)))
                    
{
                        
return true;
                    }

                }

            }

            
catch
            
{
                
return false;
            }

            
return false;
        }

        
//求一个string的ASCII码之和
        public static string ToASCII(string str)
        
{
            
int _tempint = 0;
            
byte[] by = Encoding.ASCII.GetBytes(str);
            
for (int i = 0; i < by.Length; i++)
            
{
                _tempint 
+= by[i];
            }

            
return _tempint.ToString();
        }

        
public static string GetRandomStr(int codeCount)
        
{
            
string allChar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
            
string[] allCharArray = allChar.Split(',');
            
string randomCode = "";
            
int temp = -1;

            Random rand 
= new Random();
            
for (int i = 0; i < codeCount; i++)
            
{
                
if (temp != -1)
                
{
                    rand 
= new Random(i * temp * ((int)DateTime.Now.Ticks));//随时间生成
                }

                
int t = rand.Next(25);

                
//如果重复了则重新生成
                
//if (temp == t)
                
//{
                
//    return GetRandomStr(codeCount);
                
//}
                temp = t;
                randomCode 
+= allCharArray[t];
            }

            
return randomCode;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值