Hello world.

代码
        static void Main(string[] args)
        {
            RSACryptoServiceProvider rsa 
= new RSACryptoServiceProvider();
            
string d = "1||2||2010-01-10||2010-01-02||op||cd";
            
string sign = InvokeSign(d);
            
bool f = CheckSign(d, sign);
            Console.ReadKey();
        }

 

代码
        /// <summary>
        
/// 制作签名
        
/// </summary>
        
/// <param name="encrpyData"></param>
        
/// <returns></returns>
        public static string InvokeSign(string encrpyData)
        {
            RSAParameters para 
= ConvertFromPemPrivateKey(PRIVATEKEY);
            RSACryptoServiceProvider rsa 
= new RSACryptoServiceProvider();
            rsa.ImportParameters(para);
            
byte[] Data = Encoding.UTF8.GetBytes(encrpyData);
            MD5CryptoServiceProvider md5 
= new MD5CryptoServiceProvider();
            
byte[] signData = rsa.SignData(Data, md5);//使用MD5方式算法制作签名
            
//byte[] signData = rsa.SignData(Data,new SHA1CryptoServiceProvider());
            return Convert.ToBase64String(signData);
            
//byte[] rgbHash = Encoding.UTF8.GetBytes(encrpyData);
            
//RSACryptoServiceProvider key = new RSACryptoServiceProvider();
            
//RSAParameters para = ConvertFromPemPrivateKey(PRIVATEKEY);
            
//key.ImportParameters(para);
            
//RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
            
//formatter.SetHashAlgorithm("MD5");
            
//byte[] inArray = formatter.CreateSignature(rgbHash);
            
//return Convert.ToBase64String(inArray);
        }

 

 

 

代码
        /// <summary>
        
/// 将pem格式私钥(1024 or 2048)转换为RSAParameters
        
/// </summary>
        
/// <param name="pemFileConent">pem私钥内容</param>
        
/// <returns>转换得到的RSAParamenters</returns>
        static RSAParameters ConvertFromPemPrivateKey(string pemFileConent)
        {
            
if (string.IsNullOrEmpty(pemFileConent))
            {
                
throw new ArgumentNullException("私钥文件""私钥文件不能为空");
            }
            pemFileConent 
= pemFileConent.Replace("-----BEGIN RSA PRIVATE KEY-----""").Replace("-----END RSA PRIVATE KEY-----""").Replace("\n""").Replace("\r""");
            
byte[] keyData = Convert.FromBase64String(pemFileConent);

            
bool keySize1024 = (keyData.Length == 609 || keyData.Length == 610);
            
bool keySize2048 = (keyData.Length == 1190 || keyData.Length == 1192 || keyData.Length == 1193);

            
if (!(keySize1024 || keySize2048))
            {
                
throw new ArgumentException("pem 文件格式不正确,请确认长度是否为1024或2048");
            }

            
int index = (keySize1024 ? 11 : 12);
            
byte[] pemModulus = (keySize1024 ? new byte[128] : new byte[256]);
            Array.Copy(keyData, index, pemModulus, 
0, pemModulus.Length);

            index 
+= pemModulus.Length;
            index 
+= 2;
            
byte[] pemPublicExponent = new byte[3];
            Array.Copy(keyData, index, pemPublicExponent, 
03);

            index 
+= 3;
            index 
+= 4;
            
if ((int)keyData[index] == 0)
            {
                index
++;
            }
            
byte[] pemPrivateExponent = (keySize1024 ? new byte[128] : new byte[256]);
            Array.Copy(keyData, index, pemPrivateExponent, 
0, pemPrivateExponent.Length);

            index 
+= pemPrivateExponent.Length;
            index 
+= (keySize1024 ? ((int)keyData[index + 1== 64 ? 2 : 3) : ((int)keyData[index + 2== 128 ? 3 : 4));
            
byte[] pemPrime1 = (keySize1024 ? new byte[64] : new byte[128]);
            Array.Copy(keyData, index, pemPrime1, 
0, pemPrime1.Length);

            index 
+= pemPrime1.Length;
            index 
+= (keySize1024 ? ((int)keyData[index + 1== 64 ? 2 : 3) : ((int)keyData[index + 2== 128 ? 3 : 4));
            
byte[] pemPrime2 = (keySize1024 ? new byte[64] : new byte[128]);
            Array.Copy(keyData, index, pemPrime2, 
0, pemPrime2.Length);

            index 
+= pemPrime2.Length;
            index 
+= (keySize1024 ? ((int)keyData[index + 1== 64 ? 2 : 3) : ((int)keyData[index + 2== 128 ? 3 : 4));
            
byte[] pemExponent1 = (keySize1024 ? new byte[64] : new byte[128]);
            Array.Copy(keyData, index, pemExponent1, 
0, pemExponent1.Length);

            index 
+= pemExponent1.Length;
            index 
+= (keySize1024 ? ((int)keyData[index + 1== 64 ? 2 : 3) : ((int)keyData[index + 2== 128 ? 3 : 4));
            
byte[] pemExponent2 = (keySize1024 ? new byte[64] : new byte[128]);
            Array.Copy(keyData, index, pemExponent2, 
0, pemExponent2.Length);

            index 
+= pemExponent2.Length;
            index 
+= (keySize1024 ? ((int)keyData[index + 1== 64 ? 2 : 3) : ((int)keyData[index + 2== 128 ? 3 : 4));
            
byte[] pemCoefficient = (keySize1024 ? new byte[64] : new byte[128]);
            Array.Copy(keyData, index, pemCoefficient, 
0, pemCoefficient.Length);

            RSAParameters para 
= new RSAParameters();
            para.Modulus 
= pemModulus;
            para.Exponent 
= pemPublicExponent;
            para.D 
= pemPrivateExponent;
            para.P 
= pemPrime1;
            para.Q 
= pemPrime2;
            para.DP 
= pemExponent1;
            para.DQ 
= pemExponent2;
            para.InverseQ 
= pemCoefficient;
            
return para;
        }

        
/// <summary>
        
/// 将pem格式公钥(1024 or 2048)转换为RSAParameters
        
/// </summary>
        
/// <param name="pemFileConent">pem公钥内容</param>
        
/// <returns>转换得到的RSAParamenters</returns>
        public static RSAParameters ConvertFromPemPublicKey(string pemFileConent)
        {
            
if (string.IsNullOrEmpty(pemFileConent))
            {
                
throw new ArgumentNullException("pemFileConent""This arg cann't be empty.");
            }
            pemFileConent 
= pemFileConent.Replace("-----BEGIN PUBLIC KEY-----""").Replace("-----END PUBLIC KEY-----""").Replace("\n""").Replace("\r""");
            
byte[] keyData = Convert.FromBase64String(pemFileConent);
            
bool keySize1024 = (keyData.Length == 162);
            
bool keySize2048 = (keyData.Length == 294);
            
if (!(keySize1024 || keySize2048))
            {
                
throw new ArgumentException("pem file content is incorrect, Only support the key size is 1024 or 2048");
            }
            
byte[] pemModulus = (keySize1024 ? new byte[128] : new byte[256]);
            
byte[] pemPublicExponent = new byte[3];
            Array.Copy(keyData, (keySize1024 
? 29 : 33), pemModulus, 0, (keySize1024 ? 128 : 256));
            Array.Copy(keyData, (keySize1024 
? 159 : 291), pemPublicExponent, 03);
            RSAParameters para 
= new RSAParameters();
            para.Modulus 
= pemModulus;
            para.Exponent 
= pemPublicExponent;
            
return para;
        }

 

 

 

代码
        /// <summary>
        
/// 验证签名
        
/// </summary>
        
/// <param name="data">原始数据</param>
        
/// <param name="sign">签名数据</param>
        
/// <returns></returns>
        public static bool CheckSign(string data, string sign)
        {
            RSAParameters para 
= ConvertFromPemPublicKey(PUBLICKEY);//公钥验证
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(para);
            MD5CryptoServiceProvider md5 
= new MD5CryptoServiceProvider();

            
byte[] Data = Encoding.UTF8.GetBytes(data);
            
byte[] rgbSignature = Convert.FromBase64String(sign);
            
if (rsa.VerifyData(Data, md5, rgbSignature))
            {
                
return true;
            }
            
return false;
        }

 

 

 

代码
       #region keys
        
const string PUBLICKEY =
@"-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpsDr+W45aFHIkvotZaGK/THlF
FpuZfUtghhWkHAm3H7yvL42J4xHrTr6IeUDCl4eKe6qiIgvYSNoL3u4SERGOeYmV
1F+cocu9IMGnNoicbh1zVW6e8/iGT3xaYQizJoVuWA/TC/zdds2ihCJfHDBDsouO
CXecPapyWCGQNsH5sQIDAQAB
-----END PUBLIC KEY-----
";
        
const string PRIVATEKEY =
@"-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDpsDr+W45aFHIkvotZaGK/THlFFpuZfUtghhWkHAm3H7yvL42J
4xHrTr6IeUDCl4eKe6qiIgvYSNoL3u4SERGOeYmV1F+cocu9IMGnNoicbh1zVW6e
8/iGT3xaYQizJoVuWA/TC/zdds2ihCJfHDBDsouOCXecPapyWCGQNsH5sQIDAQAB
AoGBAM/JbFs4y5WbMncrmjpQj+UrOXVOCeLrvrc/4kQ+zgCvTpWywbaGWiuRo+cz
cXrVQ6bGGU362e9hr8f4XFViKemDL4SmJbgSDa1K71i+/LnnzF6sjiDBFQ/jA9SK
4PYrY7a3IkeBQnJmknanykugyQ1xmCjbuh556fOeRPaHnhx1AkEA/flrxJSy1Z+n
Y1RPgDOeDqyG6MhwU1Jl0yJ1sw3Or4qGRXhjTeGsCrKqV0/ajqdkDEM7FNkqnmsB
+vPd116J6wJBAOuNY3oOWvy2fQ32mj6XV+S2vcG1osEUaEuWvEgkGqJ9co6100Qp
j15036AQEEDqbjdqS0ShfeRSwevTJZIap9MCQCeMGDDjKrnDA5CfB0YiQ4FrchJ7
a6o90WdAHW3FP6LsAh59MZFmC6Ea0xWHdLPz8stKCMAlVNKYPRWztZ6ctQMCQQC8
iWbeAy+ApvBhhMjg4HJRdpNbwO6MbLEuD3CUrZFEDfTrlU2MeVdv20xC6ZiY3Qtq
/4FPZZNGdZcSEuc3km5RAkApGkZmWetNwDJMcUJbSBrQMFfrQObqMPBPe+gEniQq
Ttwu1OULHlmUg9eW31wRI2uiXcFCJMHuro6iOQ1VJ4Qs
-----END RSA PRIVATE KEY-----
";
        
#endregion

 

 

posted on 2011-01-11 12:02  Ryan.zhu  阅读(2319)  评论(0编辑  收藏  举报
come soon on